问题描述
解决方案
这是一个演示如何在 PTrade 回测环境中设置佣金(Commission)、**滑点(Slippage)和成交比例(Volume Ratio)**的策略示例。
这些设置函数通常在 initialize 初始化函数中调用,用于模拟真实的交易成本和流动性限制。
策略代码
def initialize(context):
"""
初始化函数,设置股票池及回测参数
"""
# 1. 设置要操作的股票,这里以恒生电子为例
g.security = '600570.SS'
set_universe(g.security)
# ============================================================
# 2. 设置佣金 (Commission)
# ============================================================
# 接口: set_commission(commission_ratio, min_commission, type)
# commission_ratio: 佣金比例,这里设置为万分之三 (0.0003)
# min_commission: 单笔最低佣金,这里设置为 5.0 元
# type: 交易类型,默认为 'STOCK' (股票),也可以是 'ETF', 'LOF'
set_commission(commission_ratio=0.0003, min_commission=5.0, type='STOCK')
log.info("设置股票买卖佣金为万分之三,最低5元")
# ============================================================
# 3. 设置滑点 (Slippage)
# ============================================================
# PTrade 提供两种滑点设置方式,二选一即可:
# 方式 A: 百分比滑点 (set_slippage)
# 最终成交价 = 委托价 ± (委托价 * slippage / 2)
# 这里设置为 0.002 (即 0.2%),模拟较大的冲击成本
set_slippage(slippage=0.002)
log.info("设置百分比滑点为 0.2%")
# 方式 B: 固定滑点 (set_fixed_slippage)
# 最终成交价 = 委托价 ± (fixedslippage / 2)
# 例如:set_fixed_slippage(fixedslippage=0.02) 表示每股滑点固定为 2 分钱
# set_fixed_slippage(fixedslippage=0.02)
# ============================================================
# 4. 设置成交比例 (Volume Ratio)
# ============================================================
# 接口: set_volume_ratio(volume_ratio)
# 用于限制策略在单根 K 线上的最大成交量,防止回测中出现超过市场真实流动性的成交。
# 这里设置为 0.1 (10%),即策略的成交量不能超过该 K 线总成交量的 10%
set_volume_ratio(volume_ratio=0.1)
log.info("设置最大成交比例为 10%")
def handle_data(context, data):
"""
盘中运行函数
"""
# 简单的买入逻辑,用于触发交易以验证上述设置
# 每天买入 100 股
order(g.security, 100)
# 打印日志方便观察
log.info("尝试买入 100 股 %s" % g.security)
代码解析
-
set_commission(设置佣金)- 作用:模拟券商收取的手续费。
- 计算逻辑:
手续费 = 交易金额 * commission_ratio。如果计算结果小于min_commission,则按最低佣金收取。此外,回测引擎通常还会自动加上印花税(卖出时收取)。 - 参数:
commission_ratio: 费率,如0.0003代表万三。min_commission: 最低收费,通常为 5 元。
-
set_slippage(设置百分比滑点)- 作用:模拟因市场波动或网络延迟导致的成交价与委托价不一致的情况。
- 计算逻辑:
成交价 = 价格 + (价格 * slippage / 2)(买入时增加成本,卖出时减少收益)。 - 注意:还有一个接口
set_fixed_slippage(fixedslippage)可以设置固定的价差(如 0.01 元),两者通常只用其一。
-
set_volume_ratio(设置成交比例)- 作用:限制回测时的流动性。
- 逻辑:如果策略下单数量为 10000 股,但当前分钟/日线的市场总成交量只有 50000 股,且
volume_ratio设为 0.1 (10%),那么回测引擎只会撮合50000 * 0.1 = 5000股,剩余的委托可能会部分成交或不成交(取决于具体的撮合机制设置)。
Q&A
Q1: 这些设置会影响实盘交易吗?
A1: 不会。set_commission、set_slippage 和 set_volume_ratio 仅在回测模块(Backtest)有效。在实盘交易中,佣金由券商柜台决定,滑点由市场实际撮合情况决定,成交量限制则取决于市场的真实流动性。
Q2: 为什么滑点计算公式里要除以 2?
A2: 在 PTrade 的模型中,滑点参数通常定义为买卖价差的宽度。因此,对于单边交易(仅买入或仅卖出),偏离中间价(或委托价)的幅度是滑点宽度的一半。例如设置滑点为 0.2%,意味着买入价上浮 0.1%,卖出价下浮 0.1%。
Q3: 如果我不设置这些参数,默认值是多少?
A3:
- 佣金:股票默认万分之三 (0.0003),最低 5 元;ETF/LOF 默认万分之八。
- 滑点:默认比例为 0.1 (即 10%,这是一个非常大的默认值,建议手动设置为较小的合理值,如 0.002)。固定滑点默认为 0.0。
- 成交比例:默认为 0.25 (25%)。
Q4: set_limit_mode 是什么?
A4: 这是一个相关的回测设置函数。set_limit_mode('LIMIT') 表示开启成交量限制(受 set_volume_ratio 影响),set_limit_mode('UNLIMITED') 表示不限制成交量(即使下单量超过市场总成交量也能全部成交)。默认是开启限制的。