VNPY 批量策略回测和统计结果的excel输出

做VNPY这段时间,发现主要就是回测,和策略优化;然后就是有批量测试和参数集合效果导出excel分析要求。还有就是一个策略对不同品种效果验证。

然后想想,就自己写了一个BatchBackTest 类,其实很简答,就是输入品种队列,和策略队列,然后就会循环跑出结果,输出到指定路径excel。 还有就是策略是元组,是由一个策略和对应参数组合。

代码如下。使用方法就是在 vnpy/example/CtaBacktesting 路径下面新疆一个py,放入下面代码就可以

点击(此处)折叠或打开

  1. # encoding: UTF-8
  2. from vnpy.trader.app.ctaStrategy.ctaBacktesting import BacktestingEngine, MINUTE_DB_NAME
  3. import pandas as pd
  4. from vnpy.trader.app.ctaStrategy.strategy.strategyAtrRsi import AtrRsiStrategy
  5. from vnpy.trader.app.ctaStrategy.strategy.strategyBollChannel import BollChannelStrategy
  6. from vnpy.trader.app.ctaStrategy.strategy.strategyDoubleMa import DoubleMaStrategy
  7. from vnpy.trader.app.ctaStrategy.strategy.strategyDualThrust import DualThrustStrategy
  8. from vnpy.trader.app.ctaStrategy.strategy.strategyKingKeltner import KkStrategy
  9. from vnpy.trader.app.ctaStrategy.strategy.strategyMultiSignal import MultiSignalStrategy
  10. from vnpy.trader.app.ctaStrategy.strategy.strategyMultiTimeframe import MultiTimeframeStrategy

  11. class BatchBackTest(object):
  12.     def __init__(self):
  13.         ""
  14.     def calculateBacktesting(self,symbollist,strategylist):
  15.         #填入品种队列和策略队列,返回结果resultlist, 为了输出方便检索,加入品种名称,策略名称和策略参数
  16.         resultlist = []
  17.         for symbol in symbollist:
  18.             for strategy in strategylist:
  19.                 result = self.runBacktesting(symbol,strategy)
  20.                 #加入品种名称,策略名称和策略参数
  21.                 result["Symbolname"] = str(symbol["vtSymbol"])
  22.                 result["strategyname"] = str(strategy[0])
  23.                 result["strategysetting"] = str(strategy[1])
  24.                 resultlist.append(result)
  25.         return resultlist


  26.     def runBacktesting(self, symbol, strategy ):
  27.         #写入测试品种和参数, 返回回测数据集包含回测结果

  28.         # 在引擎中创建策略对象
  29.         # 创建回测引擎
  30.         engine = BacktestingEngine()
  31.         # 设置引擎的回测模式为K线
  32.         engine.setBacktestingMode(engine.BAR_MODE)
  33.         # 设置回测用的数据起始日期
  34.         engine.setStartDate(symbol["StartDate"])
  35.         engine.setSlippage(symbol["Slippage"]) # 1跳
  36.         engine.setRate(symbol["Rate"]) # 佣金大小
  37.         engine.setSize(symbol["Size"]) # 合约大小
  38.         engine.setPriceTick(symbol["Slippage"]) # 最小价格变动
  39.         engine.setCapital(symbol["Capital"])

  40.         # 设置使用的历史数据库
  41.         engine.setDatabase(MINUTE_DB_NAME, symbol["vtSymbol"])
  42.         #设置策略,策略元组中第一个是策略,第二个参数
  43.         engine.initStrategy(strategy[0], strategy[1])
  44.         engine.runBacktesting()
  45.         df = engine.calculateDailyResult()
  46.         result = []
  47.         dfp,result = engine.calculateDailyStatistics(df)
  48.         engine.output(u'输出统计数据')
  49.         # engine.showDailyResult(dfp, result)
  50.         return result

  51.     def toExcel(self, resultlist, path = "C:\data\datframe.xlsx"):
  52.         #按照输入统计数据队列和路径,输出excel,这里不提供新增模式,如果想,可以改
  53.         #dft.to_csv(path,index=False,header=True, mode = 'a')
  54.         summayKey = resultlist[0].keys()
  55.         # summayValue = result.values()

  56.         dft = pd.DataFrame(columns=summayKey)
  57.         for result in resultlist:
  58.             new = pd.DataFrame(result, index=["0"])
  59.             dft = dft.append(new,ignore_index=True)
  60.         dft.to_excel(path,index=False,header=True)
  61.         print "回测统计结果输出到" + path


  62. if __name__ == "__main__":
  63.     #创建品种队列,这里可以用json导入,为了方便使用直接写了。
  64.     symbollist = [{
  65.         "vtSymbol": 'm1809',
  66.         "StartDate": "20180101",
  67.         "Slippage": 1,
  68.         "Size": 10,
  69.         "Rate": 2 / 10000,
  70.         "Capital": 10000
  71.             },
  72.         {
  73.             "vtSymbol": 'rb0000',
  74.             "StartDate": "20180101",
  75.             "Slippage": 1,
  76.             "Size": 10,
  77.             "Rate": 2 / 10000,
  78.             "Capital": 10000
  79.         }]
  80.     #这里定义策略,策略参数先为空;策略加参数是一个元组
  81.     setting = {}
  82.     Strategylist = [(AtrRsiStrategy, setting),
  83.                     (BollChannelStrategy, setting),
  84.                     (DoubleMaStrategy, setting),
  85.                     (DualThrustStrategy, setting),
  86.                     (KkStrategy, setting),
  87.                     (MultiSignalStrategy, setting),
  88.                     (MultiTimeframeStrategy, setting)]
  89.     # 这里是同一个策略,不同参数的情况,当然可以有多个策略和多个参数组合
  90.     Strategylist2 = []
  91.     # 策略list
  92.     settinglist =[
  93.         {'kdlimit': 40, 'barmins': 9, 'cciWindow': 22},
  94.         {'kdlimit': 30, 'barmins': 13, 'cciWindow': 20}]
  95.     # 合并一个元组
  96.     if settinglist != []:
  97.         for para1 in settinglist:
  98.             Strategylist2.append((BollChannelStrategy, para1))

  99.     NT = BatchBackTest()
  100.     resultlist = NT.calculateBacktesting(symbollist,Strategylist)
  101.     #定义路径
  102.     path = "C:\Project\BackTestResult.xlsx"
  103.     NT.toExcel(resultlist,path)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22259926/viewspace-2156480/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22259926/viewspace-2156480/

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值