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