如何构建加密货币分钟级回测系统(整体设计说明)
回测框架代码见 加密货币分钟级多因子回测框架
如何构建加密货币分钟级回测系统
整体设计思想和 (Pro)A股选股框架回测系统 类似,设计上的主要区别是有多空持仓与分钟级回测功能。
系统整体设计
1.从数据集根据选定交易对,按时间interval进行采样,选出对应交易对的信息(可分钟级可小时级),可以加入自定义因子字段
2.对每个时间点所有交易对,生成相应的因子信号,进行信号排序(多空可分离)
3.每个时间点选出前若干排名进入候选池
4.模拟交易,根据设置的持仓周期或者平仓信号进行相应的清仓,发生清仓后资金闲置后将在后续候选池中进行对应交易对的购买
5.生成相应的图表参数
6.生成相应的分组对比图(如果有多组选择)

设计上实现只需要修改config.py和custom_factors.py这两个python文件,免去写代码即可进行策略回测这一需求

main.py为主函数,为框架运行的入口。
config.py和custom_factors.py放在和main.py同一层级下

生成的各临时文件与分析文件的整体结构图
系统整体数据流
1.根据file_path读入数据目录下的所有需要的交易对(排除blacklist),进行数据采样,并对空余部分进行填补,生成all_data.pkl
2.读入all_data.pkl,进行自定义因子计算,custom_factors.py中可进行自定义因子计算,生成processed_all_data.pkl
3.读入processed_all_data.pkl,根据filter进行一轮过滤,把剩余的交易对按ranking_factors的规则进行排序,如果有long则生成ranked_all_data_long.csv,如果有short则生成ranked_all_data_short.csv
4.根据ranked_all_data_long.csv和ranked_all_data_short.csv,结合target_holding_count生成selected_stocks_long.csv和selected_stocks_short.csv
5.进行simulation仿真,每天根据目标持仓数依次选择对应选币排行csv,根据sell_conditions进行卖出(holding_period,take_profit,stop_loss,should_sell_normal_numeric_factors)生成持仓表,资金曲线,交割单等csv
6.结合simulation渲染出pro_backtest_report.html,形成可视化
7.如果有多组target_holding_count,则渲染生成相应的分组对比图

各步骤详细说明
1.数据读取
读取所有需要的交易对(可现货可合约,可小时级,可分钟级)
以下为一些可用的数据集,可以接现货/合约,可为小时级/分钟级数据
https://quantkt.com/informationDetail?id=73 欧易各现货小时级数据下载地址
https://quantkt.com/informationDetail?id=74 欧易各合约小时级数据下载地址
https://quantkt.com/informationDetail?id=69 币安各现货小时级数据下载地址
https://quantkt.com/informationDetail?id=70 币安各合约小时级数据下载地址
也可以根据需要接入自己的数据,最终也会读里面BTC和ETH的数据作为基准收益进行对比

配置一下本地相应的数据文件夹

文件夹内部的格式类似上面
2.计算因子custom_factors.py
calculate_custom_factors为整体函数,可以自行写各种自定义因子函数,然后在整体函数中调用。
计算出来的字段将可在config.py中自由使用
下图为calculate_custom_factors加入自定义因子的示例

3.生成候选池
先对每个时间的标的按filter进行筛选,False为强制不选过滤,True为强制要求满足,不选的直接把rank标为10000
后续不被处理
对于filter之后的结果(非rank10000的)
进行ranking_factors,其中factor为因子名称,
ascending为是否升级
weight为因子权重
生成对应的ranked_all_data_long.csv和
ranked_all_data_short.csv

4.选出每个k线的候选
根据config.py中的target_holding_count
,支持[1,10],[‘10%’,‘20%’]格式
每组都会生成对应的每个时间的选币


5.回测仿真
根据config.py的配置
会读取对应的selected_stocks_long.csv和selected_stocks_short.csv中每个时间的选择,再结合target_holding_count表示的每个时间的目标持仓量,不断开仓平仓
1.config.py中的refresh_holding_recommendation表示持仓币再次出现推荐时,是否刷新持有周期继续持仓,默认为True
2.卖出条件取决于sell_conditions,分为持有周期,止盈止损,择时平仓
最终生成对应的资金曲线(equity_curve.csv),每个时间的持仓(position_history.csv),所有的交割单(transactions.csv)
同时对应的config.py会根据当前的时间戳在对应路径下形成一个备份
关于卖出的触发
注意should_sell_normal_numeric_factors,里面可以写多个条件,表示对应字段在当前时间满足条件时,则触发平仓信号(可支持多个条件,为或的关系,字段也可自带,也可为custom_factors.py中计算的自定义因子

6.回测结果生成
生成主要资金曲线与BTC和ETH的基准,并计算年化收益,前三大回撤。

每日持仓数量分析
分为多头与空头持仓数量变化


月度收益图

各类指标

收益分析

盈亏交易排行
盈利排名一般可用于检查当前的策略逻辑是否符合预期,是否有没考虑到的bug

亏损排名一般用于发现策略的潜在问题,用于优化策略

7.分组对比图
分组对比,可以查看不同组别的收益曲线与各类指标对比

最终收益对比与年度热力图对比

各类常见指标对比

