乐于分享
好东西不私藏

PeopleQuant帮助文档:上线本地回测系统

PeopleQuant帮助文档:上线本地回测系统

回测是检验策略逻辑的必要环节,高效的回测可为迭代策略节省大量时间。
PeopleQuant的回测系统使用本地离线数据,回测系统具有以下特点:
1、支持tick、K线数据回测,传入的数据作为基础数据生成行情快照,可再生成其他周期K线。(数据不标记品种,因此也可传入股票等其他标的数据回测)
2、回测和实盘代码保持高度一致,仅需少量修改即可在回测和实盘间切换。
3、支持传入多品种离线数据以做多品种复合策略回测。
4、polars向量化的指标运算、独立进程实时绘制资金曲线,大幅提高回测效率。
5、成交价格为下单价格,开仓时更新开仓均价,平仓时均价不变。
6、交易信号、回测结果保存csv文件,便于进一步分析交易逻辑的正确性。回测不只是给出一个是否能盈利的资金曲线,更重要的是对交易信号的分析,分析交易信号是否处在正确的交易逻辑上。如果交易信号本身逻辑有误,只是看着资金曲线不断的调整参数,没有发现真正的问题,就白白浪费了时间精力。
PeopleQuant回测系统的用法:
1、首先准备离线数据,数据文件为csv格式,可以是tick数据或K线数据。
2、实例化回测对象BackTest,传入离线数据文件路径列表,多个品种数据放在一个列表中,设置回测开始时间和结束时间,时间段包含数据的时间(可只回测某一段时间的数据),设置品种属性,例如价格最小跳、合约乘数、保证金率、手续费、涨跌停板。设置离线数据字段,如K线的最新价一般为close,tick数据的最新价一般为lastprice,离线数据字段将会转换为行情快照字段。设置离线数据日期字段的格式。指定回测结果保存的路径。设置是否实时绘制资金曲线,若不实时绘图将会在回测结束后绘制。实例化结构为:
back_test = BackTest([r'C:\datas\KQ.m@DCE.m.tick.csv',   #r'C:\datas\KQ.m@SHFE.rb.tick.csv',  ],start_datetime=datetime(2021,10,8,9,0,0),end_datetime=datetime(2026,7,8,15,0,0), balance=1000000.0*1000,  symbol_infos={'KQ.m@DCE.m':{'ExchangeID'"DCE"'PriceTick':1"VolumeMultiple":10"OpenRatioByMoney":0.1"OpenRatioByVolume":10,"LimitPriceRatio":0.1},  #'KQ.m@SHFE.rb':{'ExchangeID': "SHFE", 'PriceTick':1, "VolumeMultiple":10, "OpenRatioByMoney":0.1, "OpenRatioByVolume":10,"LimitPriceRatio":0.1},   },   col_mapping = { "datetime""datetime","InstrumentID""symbol","LastPrice""close","AskPrice1""","BidPrice1""","AskVolume1""","BidVolume1""","Volume""volume" },   datetime_format = "%Y-%m-%d %H:%M:%S%.f",   result_file=r'C:\datas',   draw_line = True)   
3、实例化PeopleQuantApi,参数传入BackTest实例,即可开启回测模式。
4、对策略微调,由于后台线程推送数据的速度极快,策略端可能刚处理完一条数据的更新,后台就已经推送完几天的数据,为了避免漏掉数据(实盘当中不需要对已经成为历史的数据再参与当下的计算),需要为策略当中的合约添加阻塞,只需要加两句代码,在信号循环计算开始前,添加一句:
#添加新行情是否被使用记录quote_lable=pqapi.update_quote_pipe([symbol],add_or_used='add')
在对新数据计算完成后,添加一句:
pqapi.update_quote_pipe([symbol],quote_lable,add_or_used='used'#新行情已经被使用完毕
这样策略计算完一笔数据,后台再推送一笔,避免漏掉数据,保持每次回测结果的一致性。
5、用传入的基础数据生成其他周期K线,例如传入的是1分钟K线,指标计算需要用日K线,则调用K线生成函数:
kline = pqapi.get_kline(symbol,period='1d',kline_count=40#获取K线数据
6、用polars向量化计算技术指标及判断指标信号,例如:
#计算指标,10日/5日均线,均价金叉死叉indicator_signal = (kline.data.tail(30)      .with_columns([       MA_expr("close", 5).alias("ma5"),  #计算5日均线,m5为列名       MA_expr("close", 10).alias("ma10"),  #计算10日均线,m10为列名                                ])        .with_columns([        CROSSUP_expr("ma5""ma10").alias("crossup"),  #判断是否金叉        CROSSDOWN_expr("ma5""ma10").alias("crossdown"),  #判断是否死叉        ])          )
如果你习惯了pandas数据格式的计算,也可以将K线转换为pandas数据,再计算相应指标,但pandas数据计算可能比polars慢10倍以上,计算指标越多差距越明显。
7、在策略当中,对需要记录的交易信号相关的信息进行保存,例如:
#将时间、价格、持仓等参与交易逻辑计算的数据记录下来signals.append({"ctp_datetime":quote.ctp_datetime,"LastPrice":quote.LastPrice,"kline_close":(kline.data)["close"][-1],"pos_long":position.pos_long,"open_price_long":position.open_price_long,"float_profit_long":position.float_profit_long,"pos_short":position.pos_short,"open_price_short":position.open_price_short,"float_profit_short":position.float_profit_short,"buy_up":buy_up,"sell_down":sell_down,'loss_long':loss_long,'loss_short':loss_short,'profit_long':profit_long,'profit_short':profit_short,'open_price_long+':position.open_price_long + 150*symbol_info.PriceTick,'open_price_long-':position.open_price_long - 50*symbol_info.PriceTick,'open_price_short+':position.open_price_short + 50*symbol_info.PriceTick,'open_price_short-':position.open_price_short - 150*symbol_info.PriceTick,"PriceTick":symbol_info.PriceTick,'ma10':indicator_signal['ma10'][-1]})
8、回测结束后,把记录的信号保存本地,例如:
if pqapi.backtest_finished :   #回测结束,将记录的交易信号保存在本地   polars.DataFrame(signals).write_csv(fr'{pqapi._backtest.result_file}\backtest_signal_{sum(quote_lable)}.csv')   #Data.write_csv(fr'{pqapi._backtest.result_file}\backtest_indicator.csv')   print('回测结束')   print(f"回测结果已保存至:{pqapi._backtest.result_file}")
回测结束后,可通过浏览器查看回测曲线,例如:
详细的回测示例代码,可以通过PeopleQuant安装目录example中的backtest_demo.py查看,安装PeopleQuant,安装支持Python3.12以上版本:
pip install -U PeopleQuant
欢迎安装体验,github地址:

https://github.com/zhuxueli-cta/PeopleQuant

欢迎关注公众号,一起学习量化交易

QQ交流群:

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » PeopleQuant帮助文档:上线本地回测系统

评论 抢沙发

9 + 1 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮