问题描述
解决方案
在 PTrade 回测环境中,限制每笔委托的最大成交比例(即限制策略的成交量占市场总成交量的百分比),可以使用 set_volume_ratio 函数。
该函数通常在 initialize 初始化函数中调用。
核心函数:set_volume_ratio
set_volume_ratio(volume_ratio)
- 作用:设置回测中单笔委托的成交比例,使得撮合交易更逼近真实的市场流动性。
- 参数:
volume_ratio(float),取值范围通常为 0 到 1。例如设置为 0.1 表示单笔成交量不超过该周期(如分钟或日线)市场总成交量的 10%。 - 默认值:如果不设置,系统默认值为 0.25 (25%)。
- 撮合逻辑:假如委托下单数量大于按比例计算出的最大可成交数量(当前Bar的总成交量 * volume_ratio),系统只会撮合计算后的数量,差额部分的委托数量不会继续挂单(即部分成交,剩余作废或视具体订单类型而定,通常回测引擎会限制当次撮合量)。
代码示例
以下是一个完整的策略初始化示例,将最大成交比例限制为 10%:
def initialize(context):
# 设置我们要操作的股票池
g.security = '600570.SS'
set_universe(g.security)
# 【关键代码】设置成交量比例限制
# 这里设置为 0.1,意味着如果当前K线的市场总成交量是 10000 股,
# 策略在该K线最多只能成交 1000 股,即使你下单了 2000 股。
set_volume_ratio(volume_ratio=0.1)
def handle_data(context, data):
# 示例:全仓买入
order_value(g.security, context.portfolio.cash)
Q&A
Q: set_volume_ratio 函数可以在 handle_data 中调用吗?
A: 不建议。该函数属于回测环境的全局配置,通常只在 initialize 中调用一次即可生效。如果在盘中频繁修改,可能会导致回测逻辑混乱。
Q: 如果我想在回测中完全不限制成交量(有多少买多少),该怎么设置?
A: 可以使用 set_limit_mode 函数。在 initialize 中调用 set_limit_mode('UNLIMITED') 即可取消成交数量的限制。
Q: 这个设置对实盘交易有效吗?
A: 无效。set_volume_ratio 仅在回测模块可用。实盘交易中,成交情况完全取决于真实的交易所撮合结果和盘口流动性。