问题描述
解决方案
在 PTrade 回测环境中,要限制每笔交易不超过市场总成交量的一定比例,可以使用 set_volume_ratio 函数。
该函数用于设置回测撮合时的成交量限制,以模拟真实市场中的流动性风险。
1. 函数说明
- 函数名:
set_volume_ratio(volume_ratio) - 位置:必须在
initialize(context)函数中调用。 - 参数:
volume_ratio(float),表示成交比例。例如0.1代表 10%。 - 默认值:如果不调用该函数,系统默认值为
0.25(即单笔成交不超过该周期市场总成交量的 25%)。 - 作用机制:
- 系统会根据当前回测周期(如分钟线或日线)的市场总成交量乘以该比例,计算出最大可成交数量。
- 如果策略下单数量超过这个计算出的最大值,系统只会撮合最大可成交数量,差额部分的委托数量不会继续挂单,而是直接作废(未成交部分)。
2. 代码示例
以下是一个完整的策略示例,展示如何在初始化阶段将成交量限制设置为 10%。
def initialize(context):
"""
初始化函数,设置股票池和回测参数
"""
# 设置要操作的股票,例如恒生电子
g.security = '600570.SS'
set_universe(g.security)
# ---------------------------------------------------------
# 核心设置:设置回测中单笔委托的成交比例限制
# 这里设置为 0.1,意味着单笔成交量不会超过该K线周期市场总成交量的 10%
# ---------------------------------------------------------
set_volume_ratio(0.1)
# 设置佣金费率(可选,为了更真实的回测)
set_commission(commission_ratio=0.0003, min_commission=5.0)
def handle_data(context, data):
"""
盘中运行函数
"""
# 获取当前持仓
position = get_position(g.security)
# 示例:如果没持仓,尝试买入一个巨大的数量,测试流动性限制
if position.amount == 0:
# 假设我们要买入 1000万股(这通常会超过大部分股票分钟级别的流动性)
# 由于设置了 set_volume_ratio(0.1),实际成交量会被限制在
# 当根K线总成交量的 10% 以内。
log.info("尝试买入 10,000,000 股")
order(g.security, 10000000)
3. 注意事项
- 仅限回测:
set_volume_ratio仅在回测模块有效,实盘交易中该设置无效(实盘取决于真实的买卖盘口)。 - 未成交处理:请注意,PTrade 的回测机制中,因流动性限制(
set_volume_ratio)而未成交的部分不会自动转为限价单挂在后续的周期中,这部分委托会被视为无法撮合而结束。如果需要确保成交,需要在策略逻辑中检测订单状态并重新下单。 - 周期依赖:限制是基于策略运行频率的。如果是日线回测,基准是当天的总成交量;如果是分钟回测,基准是当前这一分钟的成交量。
Q&A
Q: 如果我不设置 set_volume_ratio,默认会有流动性限制吗?
A: 会的。PTrade 默认的成交比例是 0.25 (25%)。这意味着如果你不手动设置,单笔委托最多也只能成交该周期市场总量的四分之一。
Q: 如果我想在回测中完全不限制成交量(即有多少买多少),该怎么做?
A: 你可以使用 set_limit_mode 函数。在 initialize 中调用 set_limit_mode('UNLIMITED') 即可取消成交数量的限制。
Q: 这个设置会影响 order_target 或 order_value 等接口吗?
A: 会影响。所有的下单接口(order, order_target, order_value 等)在回测撮合时都会受到 set_volume_ratio 设定的比例限制。