在VNPY2的進行CTA批量回測,支援Json和Excel格式匯入策略
之前VNPY 1版本中,我的個人程式碼很多是直接在VNPY庫程式碼直接修改或者增加的。每次VNPY升級就是非常頭疼,要做程式碼對比,在一些可能被更新覆蓋的地方再次維護測試。而且因為更新的地方很亂,造成後面生產版本一致停留在VNPY1.92。
這次準備不在VNPY的庫檔案程式碼上修改,而是像引用NUMPY或者Pandas這樣,採用呼叫繼承的方式,把自己的程式碼和VNPY的庫程式碼隔離;這樣即使VNPY升級,個人程式碼不用太擔心,只要簡單測試,保證繼承引用VNPY的類或方法正常工作就可以了。
也是之前VNPY 1版本實現的功能,批量回測,結果Excel匯出。這次支援策略引數用Json或Excel匯入,同時支援多個策略的組合portfolio收益計算;其實都是VNPY2提供好的,呼叫而已。只要VNPY2.0 正確安裝,歷史資料存在,這些程式碼就可以執行。
程式碼包括這幾個檔案:
- BatchCTABacktesting.py:批量回測程式碼檔案,在這個程式碼裡面定義和下面個關聯檔案路徑,預設路徑都在一個資料夾。
- vtSymbol.json:這個是定義品種交易屬性,回測時候從vtSymbol.json文件讀取品種的交易屬性,比如費率,交易每跳,比率,滑點;這樣不用在回測時候維護。示例格式如下;有心的可以改成萬用字元,這樣減少維護量。
{ "MA2009.CZCE": { "rate": 0.0001, "slippage": 1, "size": 10, "pricetick": 1 }, "rb2010.SHFE": { "rate": 0.0001, "slippage": 1, "size": 10, "pricetick": 1 } }
- ctaStrategy.json:定義要批量回測策略,其實和VNPY2預設的CTA策略檔案是一樣的,這樣就可以直接用實盤CTA策略檔案進行批量回測了,或著計算組合收益。示例格式如下:
{ "BollChannelStrategy_MA8888.CZCE": { "class_name": "BollChannelStrategy", "vt_symbol": "MA8888.CZCE", "setting": { "boll_window": 40, "boll_dev": 3 } }, "DoubleMaStrategy2_CTA_rb8888.SHFE": { "class_name": "DoubleMaStrategy", "vt_symbol": "rb8888.SHFE", "setting": { "fast_window": 10, "slow_window": 40 } }
- ctaStrategy.xls:用xls格式定義的批量回測資料,示例格式如下;有三列, class_name是策略類, setting是引數,v t_symbol是品種。主要是有時候用excel做策略批量維護或者生成,然後就可以直接批量回測了。
class_name | setting | vt_symbol |
AtrRsiStrategy | {"atr_length": 10, "atr_ma_length": 50} | MA8888.CZCE |
DoubleMaStrategy | {"fast_window": 10, "slow_window": 40} | rb8888.SHFE |
現在回來看看程式碼。其實註釋都比較清楚了。注意的幾點是
-
策略類是用字串格式記錄的,然後用eval方法關聯類,所以必須引用,雖然編輯器提示未使用
-
在excel儲存setting必須雙引號,因為json檔案預設只能識別雙引號。
-
批量回測結果會用excel輸出,示例就是這樣。
-
預設json匯入會計算組合收入,excel不會計算組合收益,可以直接修改程式碼。
# encoding: UTF-8 import json import traceback from datetime import datetime, date import pandas as pd from pandas import DataFrame from vnpy.app.cta_strategy.backtesting import BacktestingEngine # 策略類是用字串格式記錄的,然後用eval方法關聯類,所以必須引用,雖然編輯器提示未使用 from vnpy.app.cta_strategy.strategies.boll_channel_strategy import BollChannelStrategy from vnpy.app.cta_strategy.strategies.turtle_signal_strategy import TurtleSignalStrategy from vnpy.app.cta_strategy.strategies.double_ma_strategy import DoubleMaStrategy class BatchCTABackTest: """ 提供批量CTA策略回測,輸出結果到excel或pdf,和CTA策略批量優化,輸出結果到excel或pdf, """ def __init__(self, vtSymbolconfig="vtSymbol.json", exportpath=".\\"): """ 載入配置路徑 """ config = open(vtSymbolconfig) self.setting = json.load(config) self.exportpath = exportpath def addParameters(self, engine, vt_symbol: str, startDate, endDate, interval="1m", capital=1_000_000): """ 從vtSymbol.json文件讀取品種的交易屬性,比如費率,交易每跳,比率,滑點 """ if vt_symbol in self.setting: engine.set_parameters( vt_symbol=vt_symbol, interval=interval, start=startDate, end=endDate, rate=self.setting[vt_symbol]["rate"], slippage=self.setting[vt_symbol]["slippage"], size=self.setting[vt_symbol]["size"], pricetick=self.setting[vt_symbol]["pricetick"], capital=capital ) else: print("symbol %s hasn't be maintained in config file" % vt_symbol) return engine def runBatchTest(self, strategy_setting, startDate, endDate, portfolio): """ 進行回測 """ resultDf = DataFrame() dfportfolio = None for strategy_name, strategy_config in strategy_setting.items(): engine = BacktestingEngine() vt_symbol = strategy_config["vt_symbol"] engine = self.addParameters(engine, vt_symbol, startDate, endDate) if type(strategy_config["setting"]) is str: print(strategy_config["setting"]) engine.add_strategy( eval(strategy_config["class_name"]), json.loads(strategy_config["setting"], ) ) else: engine.add_strategy( eval(strategy_config["class_name"]), strategy_config["setting"] ) engine.load_data() engine.run_backtesting() df = engine.calculate_result() if portfolio == True: if dfportfolio is None: dfportfolio = df else: dfportfolio = dfportfolio + df resultDict = engine.calculate_statistics(df, False) resultDict["class_name"] = strategy_config["class_name"] resultDict["setting"] = strategy_config["setting"] resultDict["vt_symbol"] = strategy_config["vt_symbol"] resultDf = resultDf.append(resultDict, ignore_index=True) if portfolio == True: # dfportfolio = dfportfolio.dropna() engine = BacktestingEngine() engine.calculate_statistics(dfportfolio) engine.show_chart(dfportfolio) return resultDf def runBatchTestJson(self, jsonpath="ctaStrategy.json", startDate=datetime(2019, 7, 1), endDate=datetime(2020, 1, 1), exporpath=None, portfolio=True): """ 從ctaStrategy.json去讀交易策略和引數,進行回測 """ with open(jsonpath, mode="r", encoding="UTF-8") as f: strategy_setting = json.load(f) resultDf = self.runBatchTest(strategy_setting, startDate, endDate, portfolio) self.ResultExcel(resultDf, exporpath) return strategy_setting def runBatchTestExcecl(self, path="ctaStrategy.xls", startDate=datetime(2019, 7, 1), endDate=datetime(2020, 1, 1), exporpath=None, portfolio=False): """ 從ctaStrategy.excel去讀交易策略和引數,進行回測 """ df = pd.read_excel(path) strategy_setting = df.to_dict(orient='index') resultDf = self.runBatchTest(strategy_setting, startDate, endDate, portfolio) self.ResultExcel(resultDf, exporpath) return strategy_setting def ResultExcel(self, result, export=None): """ 輸出交易結果到excel """ if export != None: exportpath = export else: exportpath = self.exportpath try: path = exportpath + "CTABatch" + str(date.today()) + "v0.xls" result.to_excel(path, index=False) print("CTA Batch result is export to %s" % path) except: print(traceback.format_exc()) return None if __name__ == '__main__': bts = BatchCTABackTest() bts.runBatchTestJson()
最後可以去我的Github下載程式碼,比較方便
https://github.com/BillyZhangGuoping/VNPY2_BILLY
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2697773/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java進行excel的匯入匯出操作JavaExcel
- Springboot操作Poi進行Excel匯入Spring BootExcel
- excel檔案匯入(支援2003、2007格式)Excel
- 解決GAT專案Bug:匯入Excel的時候沒有對日期格式進行驗證Excel
- 使用Dbeaver 進行資料的匯入和匯出
- kxcel, 方便匯入和匯出 ExcelExcel
- (轉)excel和sql server的匯入匯出ExcelSQLServer
- 用postman測試get/post匯出excel格式PostmanExcel
- 測試環境的最後一測,需要進行全量回歸嗎?
- NPOI匯出和匯入Excel,Word和PDFExcel
- Excel表格轉Json格式ExcelJSON
- SQL SERVER 和EXCEL的資料匯入匯出SQLServerExcel
- ASP.NET Excel匯入和匯出ASP.NETExcel
- 如何使用 JavaScript 匯入和匯出 ExcelJavaScriptExcel
- 利用Java進行MySql資料庫的匯入和匯出JavaMySql資料庫
- oracle 匯出excel 格式整改OracleExcel
- ASP.NET EXCEL資料的匯出和匯入ASP.NETExcel
- 前端實現Excel匯入和匯出功能前端Excel
- jQuery 匯入庫和使用格式jQuery
- json陣列匯出到ExcelJSON陣列Excel
- 在·VNPY中按照CTA策略例項記錄交易條目和損益
- 如何使用JavaScript匯入和匯出Excel檔案JavaScriptExcel
- OleDb匯出標準格式EXCEL,Excel
- NOPI匯出標準格式ExcelExcel
- vue excel匯入匯出VueExcel
- excel匯入工具Excel
- 在VB6中匯出EXCEL,FOXPRO,PRODOX格式的表 (轉)Excel
- 在RFT中使用Excel進行資料驅動測試Excel
- 基於EPPlus和NPOI實現的Excel匯入匯出Excel
- php讀取excel檔案資料的匯入和匯出PHPExcel
- EasyPoi, Excel資料的匯入匯出Excel
- 使用cJSON庫對JSON格式進行解析JSON
- MATLAB匯入txt和excel檔案技巧彙總:批量匯入、單個匯入MatlabExcel
- oracle windows下使用批處理進行exp匯出OracleWindows
- Angular Excel 匯入與匯出AngularExcel
- Excel匯入匯出神器(Java)ExcelJava
- 如何透過Python將JSON格式檔案匯入redis?PythonJSONRedis
- Dbeaver 匯出Excel 格式變化的問題Excel