WeightBacktest
- class czsc.WeightBacktest(dfw, digits=2, **kwargs)[source]
Bases:
object
持仓权重回测
飞书文档:https://s0cqcxuy3p.feishu.cn/wiki/Pf1fw1woQi4iJikbKJmcYToznxb
Attributes Summary
品种等权费后日收益率
回测绩效评价
Methods Summary
backtest
([n_jobs])回测所有合约的收益率
get_symbol_daily
(symbol)获取某个合约的每日收益率
get_symbol_pairs
(symbol)获取某个合约的开平交易记录
process_symbol
(symbol)处理某个合约的回测数据
report
(res_path)回测报告
Attributes Documentation
- daily_return
品种等权费后日收益率
- stats
回测绩效评价
- version = 'V231126'
Methods Documentation
- backtest(n_jobs=1)[source]
回测所有合约的收益率
函数计算逻辑:
获取数据:遍历所有合约,调用get_symbol_daily方法获取每个合约的日收益,调用get_symbol_pairs方法获取每个合约的交易流水。
- 数据处理:将每个合约的日收益合并为一个DataFrame,使用pd.pivot_table方法将数据重塑为以日期为索引、合约为列、
收益率为值的表格,并将缺失值填充为0。计算所有合约收益率的平均值,并将该列添加到DataFrame中。将结果存储在res字典中, 键为合约名,值为包含日行情数据和交易对数据的字典。
- 绩效评价:计算回测结果的开始日期和结束日期,调用daily_performance方法评估总收益率的绩效指标。将每个合约的交易对数据
合并为一个DataFrame,调用evaluate_pairs方法评估交易对的绩效指标。将结果存储在stats字典中,并更新到绩效评价的字典中。
返回结果:将合约的等权日收益数据和绩效评价结果存储在res字典中,并将该字典作为函数的返回结果。
- get_symbol_daily(symbol)[source]
获取某个合约的每日收益率
函数计算逻辑:
从实例变量self.dfw中筛选出交易标的为symbol的数据,并复制到新的DataFrame dfs。
计算每条数据的收益(edge):权重乘以下一条数据的价格除以当前价格减1。
计算每条数据的手续费(cost):当前权重与前一条数据权重之差的绝对值乘以实例变量self.fee_rate。
计算每条数据扣除手续费后的收益(edge_post_fee):收益减去手续费。
根据日期进行分组,并对每组进行求和操作,得到每日的总收益、总扣除手续费后的收益和总手续费。
重置索引,并将交易标的符号添加到DataFrame中。
重命名列名,将’edge_post_fee’列改为’return’,将’dt’列改为’date’。
选择需要的列,并返回包含日期、交易标的、收益、扣除手续费后的收益和手续费的DataFrame。
- Parameters:
symbol – str,合约代码
- Returns:
pd.DataFrame,品种每日收益率,
columns = [‘date’, ‘symbol’, ‘edge’, ‘return’, ‘cost’] 其中
date 为交易日, symbol 为合约代码, edge 为每日收益率, return 为每日收益率减去交易成本后的真实收益, cost 为交易成本
数据样例如下:
date
symbol
edge
return
cost
2019-01-02
DLi9001
0.00230261
0.00195919
0.00085
2019-01-03
DLi9001
0.00425589
0.00310589
0.00115
2019-01-04
DLi9001
-0.0014209
-0.0024709
0.00105
2019-01-07
DLi9001
0.000988305
-0.000111695
0.0011
2019-01-08
DLi9001
-0.0004743
-0.0016243
0.00115
- get_symbol_pairs(symbol)[source]
获取某个合约的开平交易记录
函数计算逻辑:
从实例变量self.dfw中筛选出交易标的为symbol的数据,并复制到新的DataFrame dfs。
将权重乘以10的self.digits次方,并转换为整数类型,作为volume列的值。
生成bar_id列,从1开始递增,与行数对应。
创建一个空列表operates,用于存储开平仓交易记录。
定义内部函数__add_operate,用于向operates列表中添加开平仓交易记录。 函数接受日期dt、bar_id、交易量volume、价格price和操作类型operate作为参数。 函数根据交易量的绝对值循环添加交易记录到operates列表中。
将dfs转换为字典列表rows。
处理第一个行记录。 - 如果volume大于0,则调用__add_operate函数添加”开多”操作的交易记录。 - 如果volume小于0,则调用__add_operate函数添加”开空”操作的交易记录。
处理后续的行记录。 - 使用zip函数遍历rows[:-1]和rows[1:],同时获取当前行row1和下一行row2。 - 根据volume的正负和变化情况,调用__add_operate函数添加对应的开平仓交易记录。
创建空列表pairs和opens,用于存储交易对和开仓记录。
遍历operates列表中的交易记录。 - 如果操作类型为”开多”或”开空”,将交易记录添加到opens列表中,并继续下一次循环。 - 如果操作类型为”平多”或”平空”,将对应的开仓记录从opens列表中弹出。
根据开仓和平仓的价格计算盈亏比例,并创建一个交易对字典,将其添加到pairs列表中。
将pairs列表转换为DataFrame,并返回包含交易标的的开平仓交易记录的DataFrame。