3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 PTrade 回测环境中,要限制每笔交易不超过市场总成交量的一定比例,可以使用 set_volume_ratio 函数。
该函数用于设置回测撮合时的成交量限制,以模拟真实市场中的流动性风险。
set_volume_ratio(volume_ratio)initialize(context) 函数中调用。volume_ratio (float),表示成交比例。例如 0.1 代表 10%。0.25(即单笔成交不超过该周期市场总成交量的 25%)。以下是一个完整的策略示例,展示如何在初始化阶段将成交量限制设置为 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)
set_volume_ratio 仅在回测模块有效,实盘交易中该设置无效(实盘取决于真实的买卖盘口)。set_volume_ratio)而未成交的部分不会自动转为限价单挂在后续的周期中,这部分委托会被视为无法撮合而结束。如果需要确保成交,需要在策略逻辑中检测订单状态并重新下单。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 设定的比例限制。