[关闭]
@Channelchan 2018-11-16T02:52:50.000000Z 字数 12275 阅读 4353

策略编写与参数设置

参数与变量的区别: 参数用来传递,变量是随着过程的赋值改变的

ArrayManager: 生成数组插入与管理数据对象

回测引擎修改内容

  1. symbolList: 支持多品种以列表格式输入引擎
  2. posDict: 可记录多个品种的多空情况

CtaTemplate 内的方法

  1. self.cancelAll(): 取消所有订单
  2. ArrayManger(size): 数组管理器
  1. """
  2. 这里的Demo是一个最简单的双均线策略实现
  3. """
  4. from __future__ import division
  5. from vnpy.trader.vtConstant import *
  6. from vnpy.trader.app.ctaStrategy.ctaBarManager import CtaTemplate
  7. import numpy as np
  8. import talib as ta
  9. from datetime import timedelta
  10. ########################################################################
  11. # 策略继承CtaTemplate
  12. class DoubleMaStrategy(CtaTemplate):
  13. """双指数均线策略Demo"""
  14. className = 'DoubleMaStrategy'
  15. author = 'ChannelCMT'
  16. # 策略参数
  17. barPeriod = 200
  18. fastWindow = 60 # 快速均线参数
  19. slowWindow = 120 # 慢速均线参数
  20. # 参数列表,保存了参数的名称
  21. paramList = ['name',
  22. 'className',
  23. 'author',
  24. 'fastWindow',
  25. 'slowWindow']
  26. # 变量列表,保存了变量的名称
  27. varList = ['barPeriod']
  28. # 同步列表,保存了需要保存到数据库的变量名称
  29. syncList = ['posDict', 'eveningDict']
  30. #----------------------------------------------------------------------
  31. def __init__(self, ctaEngine, setting):
  32. # 首先找到策略的父类(就是类CtaTemplate),然后把DoubleMaStrategy的对象转换为类CtaTemplate的对象
  33. super().__init__(ctaEngine, setting)
  34. #----------------------------------------------------------------------
  35. def onInit(self):
  36. """初始化策略(必须由用户继承实现)"""
  37. self.writeCtaLog(u'双EMA演示策略初始化')
  38. # 生成Bar数组
  39. self.setArrayManagerSize(self.barPeriod)
  40. # self.fastMa0 = {s: 0 for s in self.symbolList} # 当前最新的快速EMA
  41. # self.fastMa1 = {s: 0 for s in self.symbolList} # 上一根的快速EMA
  42. # self.slowMa0 = {s: 0 for s in self.symbolList} # 当前最新的慢速EMA
  43. # self.slowMa1 = {s: 0 for s in self.symbolList} # 上一根的慢速EMA
  44. self.mail("chushihuaaaaaaaaaaaaaaaaaaaaaaaaa")
  45. self.putEvent()
  46. #----------------------------------------------------------------------
  47. def onStart(self):
  48. """启动策略(必须由用户继承实现)"""
  49. self.writeCtaLog(u'双EMA演示策略启动')
  50. self.putEvent()
  51. #----------------------------------------------------------------------
  52. def onStop(self):
  53. """停止策略(必须由用户继承实现)"""
  54. self.writeCtaLog(u'策略停止')
  55. self.putEvent()
  56. #----------------------------------------------------------------------
  57. def onTick(self, tick):
  58. """收到行情TICK推送(必须由用户继承实现)"""
  59. pass
  60. #----------------------------------------------------------------------
  61. def onBar(self, bar):
  62. """收到Bar推送(必须由用户继承实现)"""
  63. symbol = bar.vtSymbol
  64. am = self.getArrayManager(symbol, "1m")
  65. if not am.inited:
  66. return
  67. # 计算策略需要的信号-------------------------------------------------
  68. fastMa = ta.EMA(am.close, self.fastWindow)
  69. slowMa = ta.EMA(am.close, self.slowWindow)
  70. crossOver = fastMa[-1]>slowMa[-1] and fastMa[-2]<=slowMa[-2] # 金叉上穿
  71. crossBelow = fastMa[-1]<slowMa[-1] and fastMa[-2]>=slowMa[-2] # 死叉下穿
  72. print('crossOver:',crossOver)
  73. print('crossBelow:',crossBelow)
  74. # 构建进出场逻辑-------------------------------------------------
  75. # 金叉和死叉的条件是互斥
  76. if crossOver:
  77. # 如果金叉时手头没有持仓,则直接做多
  78. if (self.posDict[symbol+'_LONG']==0) and (self.posDict[symbol+'_SHORT']==0):
  79. self.buy(symbol, bar.close*1.02, 1)
  80. # 如果有空头持仓,则先平空,再做多
  81. elif self.posDict[symbol+'_SHORT'] >0:
  82. self.cancelAll()
  83. self.cover(symbol,bar.close*1.02, 1)
  84. self.buy(symbol,bar.close*1.02, 1)
  85. # 死叉和金叉相反
  86. elif crossBelow :
  87. if (self.posDict[symbol+'_LONG']==0) and (self.posDict[symbol+'_SHORT']==0):
  88. self.short(symbol,bar.close*0.98, 1)
  89. elif self.posDict[symbol+'_LONG'] >0:
  90. self.cancelAll()
  91. self.sell(symbol,bar.close*0.98, 1)
  92. self.short(symbol,bar.close*0.98, 1)
  93. # 发出状态更新事件
  94. self.putEvent()
  95. #----------------------------------------------------------------------
  96. def onOrder(self, order):
  97. """收到委托变化推送(必须由用户继承实现)"""
  98. # 对于无需做细粒度委托控制的策略,可以忽略onOrder
  99. # print(u'出现未知订单,需要策略师外部干预,ID:%s, symbol:%s,direction:%s,offset:%s'% (order.vtOrderID, order.vtSymbol, order.direction, order.offset))
  100. pass
  101. #----------------------------------------------------------------------
  102. def onTrade(self, trade):
  103. """收到成交推送(必须由用户继承实现)"""
  104. pass
  105. #----------------------------------------------------------------------
  106. def onStopOrder(self, so):
  107. """停止单推送"""
  108. pass

配置引擎参数

  1. from vnpy.trader.app.ctaStrategy.ctaBarManager import BacktestingEngine
  2. import pandas as pd
  3. def runBacktesting(strategyClass, settingDict,
  4. startDate, endDate, size, slippage, rate):
  5. engine = BacktestingEngine()
  6. engine.setBacktestingMode(engine.BAR_MODE) # 设置引擎的回测模式为K线
  7. engine.setDatabase('VnTrader_1Min_Db') # 设置使用的历史数据库
  8. engine.setStartDate(startDate, initHours=200) # 设置回测用的数据起始日期
  9. engine.setEndDate(endDate) # 设置回测用的数据结束日期
  10. engine.setSize(size) # 设置合约大小
  11. engine.setSlippage(slippage) # 设置滑点
  12. engine.setRate(rate) # 设置手续费万0.3
  13. engine.initStrategy(strategyClass, settingDict)
  14. engine.setCapital(100000) # 设置回测本金
  15. engine.setLog(True, 'E://log//')
  16. engine.runBacktesting()
  17. #显示逐日回测结果
  18. engine.showDailyResult()
  19. #显示逐笔回测结果
  20. engine.showBacktestingResult()
  21. # 计算回测结果
  22. perfromance = engine.calculateDailyResult()
  23. perfromanceDf , result = engine.calculateDailyStatistics(perfromance)
  24. tradeReport = pd.DataFrame([obj.__dict__ for obj in engine.tradeDict.values()])
  25. tradeDf = tradeReport.set_index('dt')
  26. return perfromanceDf, tradeDf
  27. if __name__ == '__main__':
  28. # 同时传入信号与执行的数据
  29. performanceReport, tradeReport = \
  30. runBacktesting(DoubleMaStrategy, {'symbolList': ['BTCUSDT:binance',
  31. # 'EOSUSDT:binance',
  32. # 'ETHUSDT:binance'
  33. # 'eos_quarter:OKEX'
  34. # 'tEOSUSD:bitfinex'
  35. ]},
  36. '20181001 12:00', '20181031 16:00', 100, 0, 5/10000)
  37. # tradeReport.to_excel('DoubleMaStrategyReport.xlsx')
仓位字典构造完成 
初始仓位: {'BTCUSDT:binance_LONG': 0, 'BTCUSDT:binance_SHORT': 0}
[DEBUG] 注册品种BTCUSDT:binance上的on_1m_bar函数functools.partial(<function DoubleMaStrategy.onBar at 0x0000023AE949CD08>, <__main__.DoubleMaStrategy object at 0x0000023AF2F8E6A0>)
2018-11-12 12:34:48.540222  开始回测
2018-11-12 12:34:48.540222  策略初始化
2018-11-12 12:34:48.541221  载入历史数据。数据范围:[20180923 04:00,20181001 12:00)
2018-11-12 12:34:49.644092   当前品种 BTCUSDT:binance 的数据,全部来自于本地缓存
2018-11-12 12:34:49.652084  载入完成,数据量:12000
2018-11-12 12:34:49.652084  策略初始化完成
2018-11-12 12:34:49.652084  策略启动完成
2018-11-12 12:34:49.652084  开始回放回测数据,回测范围:[20181001 12:00,20181031 16:00)
2018-11-12 12:34:49.655081  载入历史数据。数据范围:[20181001 12:00,20181031 16:00)
2018-11-12 12:34:53.524124   当前品种 BTCUSDT:binance 的数据,全部来自于本地缓存
2018-11-12 12:34:53.539109  载入完成,数据量:43230
2018-11-12 12:34:53.539109  当前回放数据:[20181001 12:00,20181031 16:00)
[INFO] 品种BTCUSDT:binance开始生成未完成的1mK线数据,时间起点为:20181001120000
2018-11-12 12:34:53.542108  载入历史数据。数据范围:[20180930 05:51,20181003 12:01)
2018-11-12 12:34:53.981656   当前品种 BTCUSDT:binance 的数据,全部来自于本地缓存
2018-11-12 12:34:53.984653  载入完成,数据量:4690
[INFO] 品种BTCUSDT:binance的历史1mK线更新,范围为:[20181001084100 , 20181001120000]
[INFO] 品种BTCUSDT:binance的1mK线准备就绪,当前K线时间为20181001120000
crossOver: False
crossBelow: False
[INFO] 品种BTCUSDT:binance开始生成1mK线数据,时间起点为:20181001120100
crossBelow: False
crossOver: False
crossBelow: False
2018-11-12 12:35:22.038958  数据回放结束
2018-11-12 12:35:22.040955  策略日志已生成
2018-11-12 12:35:22.040955  计算按日统计结果
2018-11-12 12:35:22.061934  ------------------------------
2018-11-12 12:35:22.061934  首个交易日:  2018-10-01 00:00:00
2018-11-12 12:35:22.061934  最后交易日:  2018-10-31 00:00:00
2018-11-12 12:35:22.061934  总交易日:   31
2018-11-12 12:35:22.061934  盈利交易日   6
2018-11-12 12:35:22.061934  亏损交易日:  25
2018-11-12 12:35:22.061934  起始资金:   100000
2018-11-12 12:35:22.061934  结束资金:   -38,585.84
2018-11-12 12:35:22.061934  总收益率:   -138.59%
2018-11-12 12:35:22.061934  年化收益:   -1,072.92%
2018-11-12 12:35:22.061934  总盈亏:    -138,585.84
2018-11-12 12:35:22.061934  最大回撤:   -133,746.1
2018-11-12 12:35:22.061934  百分比最大回撤: -140.55%
2018-11-12 12:35:22.061934  总手续费:   169,290.84
2018-11-12 12:35:22.061934  总滑点:    0
2018-11-12 12:35:22.061934  总成交金额:  338,581,671.0
2018-11-12 12:35:22.061934  总成交笔数:  517
2018-11-12 12:35:22.061934  日均盈亏:   -4,470.51
2018-11-12 12:35:22.061934  日均手续费:  5,460.99
2018-11-12 12:35:22.061934  日均滑点:   0.0
2018-11-12 12:35:22.061934  日均成交金额: 10,921,989.39
2018-11-12 12:35:22.061934  日均成交笔数: 16.68
2018-11-12 12:35:22.061934  日均收益率:  -9.02%
2018-11-12 12:35:22.061934  收益标准差:  49.5%
2018-11-12 12:35:22.061934  Sharpe Ratio:   -2.82
2018-11-12 12:35:23.297671  策略回测绩效图已保存

output_5_3.png-49.9kB
output_5_5.png-52.1kB

查看绩效回测结果

  1. tradeReport
direction exchange exchangeOrderID fee gatewayName offset orderID orderTime price price_avg rawData status symbol tradeID tradeTime volume vtOrderID vtSymbol vtTradeID
dt
2018-10-01 12:53:00 0.0 开仓 1 6628.99 0.0 None 1 2018-10-01 12:53:00 1 1 BTCUSDT:binance 1
2018-10-01 16:59:00 0.0 平仓 2 6632.49 0.0 None 2 2018-10-01 16:59:00 1 2 BTCUSDT:binance 2
2018-10-01 16:59:00 0.0 开仓 3 6632.49 0.0 None 3 2018-10-01 16:59:00 1 3 BTCUSDT:binance 3
2018-10-01 17:36:00 0.0 平仓 4 6620.01 0.0 None 4 2018-10-01 17:36:00 1 4 BTCUSDT:binance 4
2018-10-01 17:36:00 0.0 开仓 5 6620.01 0.0 None 5 2018-10-01 17:36:00 1 5 BTCUSDT:binance 5
2018-10-01 21:04:00 0.0 平仓 6 6613.38 0.0 None 6 2018-10-01 21:04:00 1 6 BTCUSDT:binance 6
2018-10-01 21:04:00 0.0 开仓 7 6613.38 0.0 None 7 2018-10-01 21:04:00 1 7 BTCUSDT:binance 7
2018-10-01 21:34:00 0.0 平仓 8 6587.01 0.0 None 8 2018-10-01 21:34:00 1 8 BTCUSDT:binance 8
2018-10-01 21:34:00 0.0 开仓 9 6587.01 0.0 None 9 2018-10-01 21:34:00 1 9 BTCUSDT:binance 9
2018-10-02 00:41:00 0.0 平仓 10 6589.54 0.0 None 10 2018-10-02 00:41:00 1 10 BTCUSDT:binance 10
2018-10-02 00:41:00 0.0 开仓 11 6589.54 0.0 None 11 2018-10-02 00:41:00 1 11 BTCUSDT:binance 11
2018-10-02 03:32:00 0.0 平仓 12 6571.28 0.0 None 12 2018-10-02 03:32:00 1 12 BTCUSDT:binance 12
2018-10-02 03:32:00 0.0 开仓 13 6571.28 0.0 None 13 2018-10-02 03:32:00 1 13 BTCUSDT:binance 13
2018-10-02 05:29:00 0.0 平仓 14 6624.41 0.0 None 14 2018-10-02 05:29:00 1 14 BTCUSDT:binance 14
2018-10-02 05:29:00 0.0 开仓 15 6624.41 0.0 None 15 2018-10-02 05:29:00 1 15 BTCUSDT:binance 15
2018-10-02 07:23:00 0.0 平仓 16 6582.02 0.0 None 16 2018-10-02 07:23:00 1 16 BTCUSDT:binance 16
2018-10-02 07:23:00 0.0 开仓 17 6582.02 0.0 None 17 2018-10-02 07:23:00 1 17 BTCUSDT:binance 17
2018-10-02 07:46:00 0.0 平仓 18 6598.03 0.0 None 18 2018-10-02 07:46:00 1 18 BTCUSDT:binance 18
2018-10-02 07:46:00 0.0 开仓 19 6598.03 0.0 None 19 2018-10-02 07:46:00 1 19 BTCUSDT:binance 19
2018-10-02 08:36:00 0.0 平仓 20 6596.40 0.0 None 20 2018-10-02 08:36:00 1 20 BTCUSDT:binance 20
2018-10-02 08:36:00 0.0 开仓 21 6596.40 0.0 None 21 2018-10-02 08:36:00 1 21 BTCUSDT:binance 21
2018-10-02 09:41:00 0.0 平仓 22 6601.66 0.0 None 22 2018-10-02 09:41:00 1 22 BTCUSDT:binance 22
2018-10-02 09:41:00 0.0 开仓 23 6601.66 0.0 None 23 2018-10-02 09:41:00 1 23 BTCUSDT:binance 23
2018-10-02 12:07:00 0.0 平仓 24 6603.85 0.0 None 24 2018-10-02 12:07:00 1 24 BTCUSDT:binance 24
2018-10-02 12:07:00 0.0 开仓 25 6603.85 0.0 None 25 2018-10-02 12:07:00 1 25 BTCUSDT:binance 25
2018-10-02 12:33:00 0.0 平仓 26 6615.11 0.0 None 26 2018-10-02 12:33:00 1 26 BTCUSDT:binance 26
2018-10-02 12:33:00 0.0 开仓 27 6615.11 0.0 None 27 2018-10-02 12:33:00 1 27 BTCUSDT:binance 27
2018-10-02 14:22:00 0.0 平仓 28 6602.11 0.0 None 28 2018-10-02 14:22:00 1 28 BTCUSDT:binance 28
2018-10-02 14:22:00 0.0 开仓 29 6602.11 0.0 None 29 2018-10-02 14:22:00 1 29 BTCUSDT:binance 29
2018-10-02 20:37:00 0.0 平仓 30 6591.02 0.0 None 30 2018-10-02 20:37:00 1 30 BTCUSDT:binance 30
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2018-10-30 00:31:00 0.0 平仓 488 6361.54 0.0 None 488 2018-10-30 00:31:00 1 488 BTCUSDT:binance 488
2018-10-30 00:31:00 0.0 开仓 489 6361.54 0.0 None 489 2018-10-30 00:31:00 1 489 BTCUSDT:binance 489
2018-10-30 06:53:00 0.0 平仓 490 6340.65 0.0 None 490 2018-10-30 06:53:00 1 490 BTCUSDT:binance 490
2018-10-30 06:53:00 0.0 开仓 491 6340.65 0.0 None 491 2018-10-30 06:53:00 1 491 BTCUSDT:binance 491
2018-10-30 10:05:00 0.0 平仓 492 6349.92 0.0 None 492 2018-10-30 10:05:00 1 492 BTCUSDT:binance 492
2018-10-30 10:05:00 0.0 开仓 493 6349.92 0.0 None 493 2018-10-30 10:05:00 1 493 BTCUSDT:binance 493
2018-10-30 10:28:00 0.0 平仓 494 6351.71 0.0 None 494 2018-10-30 10:28:00 1 494 BTCUSDT:binance 494
2018-10-30 10:28:00 0.0 开仓 495 6351.71 0.0 None 495 2018-10-30 10:28:00 1 495 BTCUSDT:binance 495
2018-10-30 10:31:00 0.0 平仓 496 6348.98 0.0 None 496 2018-10-30 10:31:00 1 496 BTCUSDT:binance 496
2018-10-30 10:31:00 0.0 开仓 497 6348.98 0.0 None 497 2018-10-30 10:31:00 1 497 BTCUSDT:binance 497
2018-10-30 10:41:00 0.0 平仓 498 6356.00 0.0 None 498 2018-10-30 10:41:00 1 498 BTCUSDT:binance 498
2018-10-30 10:41:00 0.0 开仓 499 6356.00 0.0 None 499 2018-10-30 10:41:00 1 499 BTCUSDT:binance 499
2018-10-30 15:55:00 0.0 平仓 500 6367.31 0.0 None 500 2018-10-30 15:55:00 1 500 BTCUSDT:binance 500
2018-10-30 15:55:00 0.0 开仓 501 6367.31 0.0 None 501 2018-10-30 15:55:00 1 501 BTCUSDT:binance 501
2018-10-30 19:52:00 0.0 平仓 502 6360.38 0.0 None 502 2018-10-30 19:52:00 1 502 BTCUSDT:binance 502
2018-10-30 19:52:00 0.0 开仓 503 6360.38 0.0 None 503 2018-10-30 19:52:00 1 503 BTCUSDT:binance 503
2018-10-30 22:14:00 0.0 平仓 504 6351.41 0.0 None 504 2018-10-30 22:14:00 1 504 BTCUSDT:binance 504
2018-10-30 22:14:00 0.0 开仓 505 6351.41 0.0 None 505 2018-10-30 22:14:00 1 505 BTCUSDT:binance 505
2018-10-31 04:59:00 0.0 平仓 506 6343.27 0.0 None 506 2018-10-31 04:59:00 1 506 BTCUSDT:binance 506
2018-10-31 04:59:00 0.0 开仓 507 6343.27 0.0 None 507 2018-10-31 04:59:00 1 507 BTCUSDT:binance 507
2018-10-31 05:41:00 0.0 平仓 508 6330.15 0.0 None 508 2018-10-31 05:41:00 1 508 BTCUSDT:binance 508
2018-10-31 05:41:00 0.0 开仓 509 6330.15 0.0 None 509 2018-10-31 05:41:00 1 509 BTCUSDT:binance 509
2018-10-31 06:47:00 0.0 平仓 510 6334.85 0.0 None 510 2018-10-31 06:47:00 1 510 BTCUSDT:binance 510
2018-10-31 06:47:00 0.0 开仓 511 6334.85 0.0 None 511 2018-10-31 06:47:00 1 511 BTCUSDT:binance 511
2018-10-31 07:02:00 0.0 平仓 512 6323.07 0.0 None 512 2018-10-31 07:02:00 1 512 BTCUSDT:binance 512
2018-10-31 07:02:00 0.0 开仓 513 6323.07 0.0 None 513 2018-10-31 07:02:00 1 513 BTCUSDT:binance 513
2018-10-31 11:30:00 0.0 平仓 514 6339.18 0.0 None 514 2018-10-31 11:30:00 1 514 BTCUSDT:binance 514
2018-10-31 11:30:00 0.0 开仓 515 6339.18 0.0 None 515 2018-10-31 11:30:00 1 515 BTCUSDT:binance 515
2018-10-31 14:06:00 0.0 平仓 516 6336.30 0.0 None 516 2018-10-31 14:06:00 1 516 BTCUSDT:binance 516
2018-10-31 14:06:00 0.0 开仓 517 6336.30 0.0 None 517 2018-10-31 14:06:00 1 517 BTCUSDT:binance 517
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注