WeightBacktest

class czsc.WeightBacktest(dfw, digits=2, **kwargs)[source]

Bases: object

持仓权重回测

飞书文档:https://s0cqcxuy3p.feishu.cn/wiki/Pf1fw1woQi4iJikbKJmcYToznxb

Attributes Summary

daily_return

品种等权费后日收益率

stats

回测绩效评价

version

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]

回测所有合约的收益率

函数计算逻辑:

  1. 获取数据:遍历所有合约,调用get_symbol_daily方法获取每个合约的日收益,调用get_symbol_pairs方法获取每个合约的交易流水。

  2. 数据处理:将每个合约的日收益合并为一个DataFrame,使用pd.pivot_table方法将数据重塑为以日期为索引、合约为列、

    收益率为值的表格,并将缺失值填充为0。计算所有合约收益率的平均值,并将该列添加到DataFrame中。将结果存储在res字典中, 键为合约名,值为包含日行情数据和交易对数据的字典。

  3. 绩效评价:计算回测结果的开始日期和结束日期,调用daily_performance方法评估总收益率的绩效指标。将每个合约的交易对数据

    合并为一个DataFrame,调用evaluate_pairs方法评估交易对的绩效指标。将结果存储在stats字典中,并更新到绩效评价的字典中。

  4. 返回结果:将合约的等权日收益数据和绩效评价结果存储在res字典中,并将该字典作为函数的返回结果。

get_symbol_daily(symbol)[source]

获取某个合约的每日收益率

函数计算逻辑:

  1. 从实例变量self.dfw中筛选出交易标的为symbol的数据,并复制到新的DataFrame dfs。

  2. 计算每条数据的收益(edge):权重乘以下一条数据的价格除以当前价格减1。

  3. 计算每条数据的手续费(cost):当前权重与前一条数据权重之差的绝对值乘以实例变量self.fee_rate。

  4. 计算每条数据扣除手续费后的收益(edge_post_fee):收益减去手续费。

  5. 根据日期进行分组,并对每组进行求和操作,得到每日的总收益、总扣除手续费后的收益和总手续费。

  6. 重置索引,并将交易标的符号添加到DataFrame中。

  7. 重命名列名,将’edge_post_fee’列改为’return’,将’dt’列改为’date’。

  8. 选择需要的列,并返回包含日期、交易标的、收益、扣除手续费后的收益和手续费的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]

获取某个合约的开平交易记录

函数计算逻辑:

  1. 从实例变量self.dfw中筛选出交易标的为symbol的数据,并复制到新的DataFrame dfs。

  2. 将权重乘以10的self.digits次方,并转换为整数类型,作为volume列的值。

  3. 生成bar_id列,从1开始递增,与行数对应。

  4. 创建一个空列表operates,用于存储开平仓交易记录。

  5. 定义内部函数__add_operate,用于向operates列表中添加开平仓交易记录。 函数接受日期dt、bar_id、交易量volume、价格price和操作类型operate作为参数。 函数根据交易量的绝对值循环添加交易记录到operates列表中。

  6. 将dfs转换为字典列表rows。

  7. 处理第一个行记录。 - 如果volume大于0,则调用__add_operate函数添加”开多”操作的交易记录。 - 如果volume小于0,则调用__add_operate函数添加”开空”操作的交易记录。

  8. 处理后续的行记录。 - 使用zip函数遍历rows[:-1]和rows[1:],同时获取当前行row1和下一行row2。 - 根据volume的正负和变化情况,调用__add_operate函数添加对应的开平仓交易记录。

  9. 创建空列表pairs和opens,用于存储交易对和开仓记录。

  10. 遍历operates列表中的交易记录。 - 如果操作类型为”开多”或”开空”,将交易记录添加到opens列表中,并继续下一次循环。 - 如果操作类型为”平多”或”平空”,将对应的开仓记录从opens列表中弹出。

    根据开仓和平仓的价格计算盈亏比例,并创建一个交易对字典,将其添加到pairs列表中。

  11. 将pairs列表转换为DataFrame,并返回包含交易标的的开平仓交易记录的DataFrame。

process_symbol(symbol)[source]

处理某个合约的回测数据

report(res_path)[source]

回测报告