问题描述
解决方案
在PTrade量化交易平台的回测环境中,交易成本主要由佣金(Commission)、**经手费(Transfer Fee)和印花税(Stamp Duty)**三部分组成。
根据PTrade API文档说明,回测中的手续费计算逻辑如下:
1. 费用组成详解
A. 佣金 (Commission)
这是支付给券商的费用,双向收取(买入和卖出均收取)。
- 计算公式:
佣金 = 交易金额 × 佣金费率 - 最低收费:如果计算出的佣金低于设定的“最低佣金”,则按最低佣金收取。
- 默认设置:
- 股票:默认为 万分之三 (0.0003)。
- ETF/LOF基金:默认为 万分之八 (0.0008)。
- 最低佣金:默认为 5元。
B. 经手费 (Transfer Fee)
这是支付给交易所的费用,双向收取。
- 计算公式:
经手费 = 交易金额 × 经手费率 - 费率标准:PTrade文档中注明的费率为 万分之0.487 (0.0000487)。
- 注意:这部分费用通常由系统自动计算,叠加在总手续费中。
C. 印花税 (Stamp Duty)
这是国家税收,仅在卖出股票时收取(买入不收)。
- 适用标的:仅限股票(ETF、LOF、可转债等通常免收印花税)。
- 费率:按照当前A股市场规则执行(目前市场标准为卖出方单边征收0.05%,即万分之五,具体以回测环境配置为准)。
2. 如何在策略中设置
在PTrade策略的 initialize 函数中,可以使用 set_commission 接口来调整佣金费率和最低佣金限制。
接口说明:
set_commission(commission_ratio=0.0003, min_commission=5.0, type="STOCK")
commission_ratio(float): 佣金费率(如 0.0003 代表万三)。min_commission(float): 最低佣金(如 5.0 代表不足5元按5元收)。type(str): 交易类型,默认为 "STOCK"(支持 STOCK, ETF, LOF)。
代码示例:
def initialize(context):
# 设置股票交易佣金为万分之二,最低5元
set_commission(commission_ratio=0.0002, min_commission=5.0, type='STOCK')
# 设置ETF交易佣金为万分之一,最低0元(部分券商ETF无最低5元限制)
set_commission(commission_ratio=0.0001, min_commission=0.0, type='ETF')
3. 计算案例演示
假设我们设置:佣金率万分之三 (0.0003),最低佣金5元,经手费万分之0.487。
场景一:小额交易(触发最低佣金)
操作:买入 100 股 某股票,价格 10 元/股。
- 交易金额:100 * 10 = 1000 元。
- 佣金计算:1000 * 0.0003 = 0.3 元。
- 判定:0.3 元 < 5 元,因此佣金实收 5 元。
- 经手费计算:1000 * 0.0000487 = 0.0487 元。
- 印花税:买入不收。
- 总成本:5 + 0.0487 = 5.0487 元。
场景二:大额交易(卖出)
操作:卖出 10,000 股 某股票,价格 20 元/股。
- 交易金额:10,000 * 20 = 200,000 元。
- 佣金计算:200,000 * 0.0003 = 60 元。
- 判定:60 元 > 5 元,因此佣金实收 60 元。
- 经手费计算:200,000 * 0.0000487 = 9.74 元。
- 印花税计算:200,000 * 0.0005 (假设税率为万五) = 100 元。
- 总成本:60 + 9.74 + 100 = 169.74 元。
总结
在PTrade回测中,总手续费 = Max(佣金, 最低佣金) + 经手费 + 印花税(仅卖出)。合理设置这些参数有助于使回测结果更接近真实交易环境。
Q&A
Q: PTrade回测中是否支持设置滑点?
A: 支持。可以使用 set_slippage(按百分比设置,如0.001代表0.1%)或 set_fixed_slippage(按固定金额设置,如0.02代表每股差价0.02元)来模拟交易滑点,这会增加买入成本或减少卖出收益。
Q: 为什么我的回测中ETF卖出没有扣印花税?
A: 这是符合市场规则的。目前国内证券市场中,ETF和LOF基金的交易免收印花税,PTrade回测引擎遵循这一规则。
Q: set_commission 只能在 initialize 中调用吗?
A: 是的,根据API文档,该函数仅在回测模块可用,且通常在 initialize 初始化阶段进行配置。