11. Backtester 策略回测器
Backtester类用于对operator对象进行回测操作。
本类的属性包括回测计算中所需的所有参数,包括回测过程中产生的结果数据,这些结果数据以ndarray的形式 在对象的生命周期内长期保存,并可以反复刷新。
这个类只有在operator对象被创建之后才能被实例化,因为Backtester类需要依赖operator对象来生成交易 信号和执行交易。典型用法如下:
operator = Operator( ... ) # 创建Operator对象
backtested = Operator.backtest( signal_count=100, share_count=10, **kwargs) # 创建Backtester对象
# get backtest raw results:
backtested.cash_investment_array
backtested.own_cashes
...
# get backtest results as DataFrame:
result_df = backtested.value_records()
trade_log_df = backtested.trade_logs()
trade_summary_df = backtested.trade_summary()
- class qteasy.backtest.Backtester(op: Operator, shares: list[str], cash_plan: CashPlan, cash_investment_array: ndarray, cash_inflation_array: ndarray, delivery_day_indicators: ndarray, cost_params: ndarray, signal_parsing_params: dict, trading_moq_params: dict, trading_delivery_params: dict, trade_price_data: ndarray, benchmark_data: Optional[Union[DataFrame, Series]] = None, evaluate_price_data: Optional[DataFrame] = None, enable_tracing: bool = False, logger: Optional[Logger] = None)[源代码]
Backtester类用于对operator对象进行回测操作。 本类的属性包括回测计算中所需的所有参数,包括回测过程中产生的结果数据,这些结果数据以ndarray的形式 在对象的生命周期内长期保存,并可以反复刷新。
这个类只有在operator对象被创建之后才能被实例化,因为Backtester类需要依赖operator对象来生成交易 信号和执行交易。典型用法如下:
operator = Operator( ... ) # 创建Operator对象 backtested = Operator.backtest( signal_count=100, share_count=10, **kwargs) # 创建Backtester对象 # get backtest raw results: backtested.cash_investment_array backtested.own_cashes ... # get backtest results as DataFrame: result_df = backtested.value_records() trade_log_df = backtested.trade_logs() trade_summary_df = backtested.trade_summary()
- evaluate_result(indicators: str) dict[源代码]
生成交易结果的评价报告,保存在self.evaluate_result属性中
- 参数:
indicators (str) – 回测结果评价指标,详情参见qteasy.evaluate.evaluate()函数
- generate_trade_logs(save_to_file_path: Optional[str] = None) DataFrame[源代码]
根据回测结果生成交易日志,交易日志是一份完整的交易记录文件,包含每一个交易期间的下列信息。
每一个交易期间包含 8 行数据,分别为:
0, trade signal:每一支股票的当期交易信号1, price:每一支股票的当期交易价格2, traded amounts:每一支股票的当期交易数量,如果没有交易则为 03, cash changed:每一支股票的当期现金变动金额,买入为负数,卖出为正数4, trade cost:每一支股票的当期交易费用5, own amounts:每一支股票的当期末持有数量6, available amounts:每一支股票的当期末可用数量7, summary:当期每一支股票的持仓价值,同时包含汇总数据(当期末持有现金、可用现金、总资产价值)
以上信息以 DataFrame 形式保存,行索引为多级索引,第一/二层为时间/策略组索引,第三层为上述 8 个数据类别。 交易日志文件可以被保存为 csv 格式,文件名为
trade_log.csv。- 参数:
save_to_file_path (str, optional) – 如果提供了文件路径,则将交易日志保存为CSV文件,默认值为None
- 返回:
trade_log – 交易模拟结果数据
- 返回类型:
pd.DataFrame
- generate_trade_summary(share_names: Optional[list[str]] = None, save_to_file_path: Optional[str] = None) DataFrame[源代码]
生成 trade summary 交易摘要表 (一个更加紧凑的交易汇总表,包含每次交易的关键信息, 以一种更加易于人类阅读的方式呈现,并过滤掉无交易的记录),函数的输入trade_log_df是函数 generate_trade_logs()的返回值。
- 参数:
share_names (list[str], optional) – 交易标的名称列表, 如果为None,则使用“N/A”作为名称
save_to_file_path (str, optional) – 如果提供了文件路径,则将交易摘要表保存为CSV文件,默认值为None,不保存文件
- plot_result(plot_title: str, show_positions: bool, buy_sell_markers: bool) None[源代码]
以图表形式生成交易结果
- 参数:
plot_title (str) – 图表的标题名称
show_positions (bool) – 是否显示持股仓位区间信息,如果设置为True,则在收益率曲线图上 以红色/绿色条带显示区间的持仓类型(绿色表示持多仓,红色表示持 空仓)颜色越深持仓比例越高
buy_sell_markers (bool) – 是否在收益率曲线图上显示买卖点,如果设置为True,则在收益率曲 线图上以红绿色小箭头标示出买卖点
- 返回类型:
None
- report_result(trade_log: Optional[str] = None, trade_summary: Optional[str] = None) str[源代码]
生成回测结果的明细报告,报告为纯文本格式,可以使用print命令打印
- 参数:
trade_log (str, optional) – 交易日志文件的存储路径,默认值为None,如果给出该路径,则在报告中打印交易日志的存储路径
trade_summary (str, optional) – 交易汇总记录文件的存储路径,默认值为None,如果给出,则在报告中打印交易汇总记录的存储路径
- 返回:
report_str – 以打印格式排版的回测结果报告
- 返回类型:
str
- run() Backtester[源代码]
执行回测计算,生成回测结果数据并存入对象属性中
- save_complete_values(save_to_file_path: Optional[str] = None) Optional[str][源代码]
将 complete_values 保存为 CSV 文件(当 trade_log=True 时由 qt_operator 调用)
- 参数:
save_to_file_path (str, optional) – 保存路径,若为 None 则不写入
- 返回:
成功时返回保存路径,否则返回 None
- 返回类型:
str or None
- trace_result_df() Optional[DataFrame][源代码]
根据回测结果生成交易过程记录,输出内容为DataFrame格式
trace 行与 op_signal_index 的对齐由 Operator 在写入时保证(update_trace_step 使用 全局 signal 行号),此处仅按策略 concat 后设置 index 为 op_signal_index。
- 返回:
trade_trace – 交易模拟过程数据
- 返回类型:
pd.DataFrame