🚀 AI 一键生成 ptrade 策略代码

PTrade 回测高级设置:如何解除成交量限制以模拟无限流动性?

ptrade | 发布时间: 2025/12/2
以下内容由 EasyQuant 生成。

问题描述

回测时如何忽略成交量的限制,假设我的所有订单都能成交?

解决方案

在PTrade回测中,如果您希望忽略成交量的限制,假设所有订单都能完全成交(即不做流动性限制),可以使用 set_limit_mode 函数,并将参数设置为 'UNLIMITED'

核心函数说明

  • 函数名: set_limit_mode(limit_mode)
  • 参数: limit_mode (str)
    • 'LIMIT': (默认值)限制成交数量,通常结合 set_volume_ratio 使用(默认成交比例为25%)。
    • 'UNLIMITED': 不限制成交数量。即使委托数量超过了该时间段市场的实际总成交量,系统也会按照委托数量全部撮合成交。
  • 使用位置: 必须在 initialize(context) 函数中调用。

策略代码示例

以下是一个完整的策略示例,展示了如何在初始化阶段设置无限制模式:

def initialize(context):
    """
    初始化函数,设置股票池和回测参数
    """
    # 设置要操作的股票,例如:恒生电子
    g.security = '600570.SS'
    set_universe(g.security)
    
    # ---------------------------------------------------------
    # 核心设置:设置成交数量限制模式为 'UNLIMITED'
    # 这将忽略市场的实际成交量限制,假设所有订单都能全部成交
    # ---------------------------------------------------------
    set_limit_mode('UNLIMITED')
    
    # (可选) 设置滑点为0,进一步模拟理想成交环境
    set_slippage(0.0)

def handle_data(context, data):
    """
    按周期运行的策略逻辑
    """
    # 获取当前持仓
    position = get_position(g.security)
    
    # 示例逻辑:如果没有持仓,则全仓买入
    if position.amount == 0:
        # 获取当前可用资金
        cash = context.portfolio.cash
        # 下单买入,由于设置了UNLIMITED,此处即使资金量巨大,
        # 超过了该分钟/该日的市场实际成交量,回测引擎也会判定全部成交
        order_value(g.security, cash)
        log.info("已触发全仓买入,成交不受流动性限制")

注意事项

  1. 仅限回测: set_limit_mode 函数仅在回测模块可用,实盘交易中无法使用(实盘必须遵循市场真实流动性)。
  2. 适用场景: 该设置通常用于低频策略(如月度调仓)或资金规模较小的策略验证逻辑。如果您的回测资金规模非常大(例如数亿资金操作小盘股),开启此选项会导致回测结果严重失真,因为在真实市场中巨大的买单会显著推高价格或无法成交。

Q&A

Q: PTrade回测中默认的成交量限制是多少?
A: 默认情况下,PTrade回测处于 'LIMIT' 模式,且默认的成交比例(Volume Ratio)为 0.25。这意味着您的单笔委托最多只能成交该K线周期内市场总成交量的25%,剩余未成交部分会自动撤单(取决于具体的撮合机制设置)。

Q: set_volume_ratioset_limit_mode 有什么区别?
A: set_volume_ratio(float) 用于在 'LIMIT' 模式下调整具体的成交比例(例如设置为 0.5 表示最多成交市场量的50%)。而 set_limit_mode('UNLIMITED') 则是直接关闭这一检查机制,完全忽略市场成交量。

Q: 开启 'UNLIMITED' 模式后,滑点(Slippage)还会生效吗?
A: 会生效。set_limit_mode 仅控制成交数量是否受限,不影响成交价格。如果您设置了滑点(如 set_slippage(0.002)),成交价格依然会根据滑点设置产生偏离。如果需要完全理想的成交环境,建议同时调用 set_fixed_slippage(0.0)set_slippage(0.0)