[关闭]
@Channelchan 2018-12-11T21:19:33.000000Z 字数 16334 阅读 63481

仓位管理-multi_signal_add_position


一、多信号加仓法

1.多信号加仓法

满足信号的个数越多,加仓越多。

见 onBar ‘多信号加仓模块’以及on15Bar‘信号计算与开仓逻辑’

用参数 n 控制加仓次数,参数fixsize为开仓手数以及每次加仓数量


开仓算法如下:

计算3个指标分别为MACD,RSI,movement并计算信号值signal_1,signal_2,signal_3和signal. signal = signal_1+signal_2+signal_3

if not 空头信号 and signal == 1:

buy

elif not 多头信号 and signal == -1:

short

加仓算法如下:

if 持多头仓位 and 当前加仓次数 nPos < 2:

if 出现空头信号:

    sell 全部多头头寸

elif 没加过仓 and signal == 2:

    加仓fixsize手

elif 加过一次仓 and signal == 3:

    加仓fixsize手

elif 持空头仓位 and 当前加仓次数 nPos < 2:

if 出现多头信号:

    cover 全部空头头寸

elif 没加过仓 and signal == -2:

    加仓fixsize手

elif 加过一次仓 and signal == -3:

    加仓fixsize手

当执行平仓信号,将 nPos 重置为 0

if 持有多头仓位 and 死叉:

nPos = 0

elif 持有空头仓位 and 金叉:

nPos = 0
  1. #策略参数
  2. barPeriod = 200
  3. fastWindow = 60 # 快速均线参数
  4. slowWindow = 120 # 慢速均线参数
  5. # 变量列表
  6. nPos = 0
  7. fixsize = 10
  8. trailingPercent = 4
  9. stopRatio = 0.02 # 止损百分比
  10. profitMultiplier = 6 # 止盈与止损比例
  11. transactionPrice = {} # 记录成交价格
  12. intraTradeHighDict = {}
  13. intraTradeLowDict = {}
  14. Ratio = 0.02
  15. signal_1 = 0
  16. signal_2 = 0
  17. signal_3 = 0
  18. signal = 0
  19. # 设置变量
  20. self.transactionPrice = {s: 0 for s in self.symbolList}
  21. self.intraTradeHighDict = {s: 0 for s in self.symbolList}
  22. self.intraTradeLowDict ={s: 0 for s in self.symbolList}
  23. #----------------------------------------------------------------------
  24. def onBar(self, bar):
  25. """收到Bar推送(必须由用户继承实现)"""
  26. symbol = bar.vtSymbol
  27. if self.posDict[symbol+"_LONG"] == 0 and self.posDict[symbol+"_SHORT"] == 0:
  28. self.intraTradeHighDict[symbol] = 0
  29. self.intraTradeLowDict[symbol] = 999999
  30. # 洗价器
  31. # 多信号加仓模块,多空相反______________________________________
  32. elif self.posDict[symbol+"_LONG"]!=0 : # 持有多头仓位并且加仓次数不超过2次(共三个信号,允许加2次仓)
  33. self.intraTradeHighDict[symbol] = max(self.intraTradeHighDict[symbol], bar.high)
  34. self.intraTradeLowDict[symbol] = bar.low
  35. self.longStop = self.intraTradeHighDict[symbol]*(1-self.trailingPercent/100)
  36. # print('最高价:%s'%self.intraTradeHighDict[symbol])
  37. # print('止损价格:%s'%self.longStop)
  38. # print('开仓价格:%s'%self.transactionPrice)
  39. if bar.close<=self.longStop or (bar.close > self.transactionPrice[symbol] * (1 + self.profitMultiplier * self.stopRatio)):
  40. self.cancelAll()
  41. self.sell(symbol, bar.close*0.98, self.posDict[symbol+"_LONG"])
  42. self.signal_1 = 0
  43. self.signal_2 = 0
  44. self.signal_3 = 0
  45. self.signal = 0
  46. elif self.signal_1 < 0 or self.signal_2 < 0 or self.signal_3 < 0: # 持有多仓情况下有一个信号转换为空头信号,则清仓出场
  47. self.sell(symbol,bar.close*0.98, self.posDict[symbol+"_LONG"]) # 全部头寸出场
  48. print('time:%s,on bar sell:%s'%(bar.datetime,bar.close))
  49. self.signal_1 = 0
  50. self.signal_2 = 0
  51. self.signal_3 = 0
  52. self.signal = 0
  53. elif self.nPos == 0 and self.signal == 2: # 第一次开仓是有一个信号满足,当另一个信号满足多头信号,则加仓
  54. self.nPos += 1 # 加仓次数减少 1 次
  55. self.buy(symbol,bar.close*1.02,self.fixsize) # 加仓数量固定fixsize
  56. print('time:%s,onbar_long_add:%s,n:%s'%(bar.datetime,bar.close,self.nPos))
  57. elif self.nPos == 1 and self.signal == 3 : # 建立在第一次加仓的基础上,再有信号满足多头信号,继续加仓
  58. self.buy(symbol,bar.close*1.02,self.fixsize) # 加仓数量固定fixsize
  59. print('time:%s,onbar_long_add2:%s,n:%s'%(bar.datetime,bar.close,self.nPos+1))
  60. elif self.posDict[symbol + "_SHORT"] != 0:
  61. self.intraTradeLowDict[symbol] = min(self.intraTradeLowDict[symbol], bar.low)
  62. self.intraTradeHighDict[symbol] = bar.high
  63. self.shortStop = self.intraTradeLowDict[symbol]*(1+self.trailingPercent/100)
  64. if (bar.close>=self.shortStop) or (bar.close < self.transactionPrice[symbol] * (1 - self.profitMultiplier * self.stopRatio)):
  65. self.cancelAll()
  66. self.cover(symbol, bar.close*1.02, self.posDict[symbol+"_SHORT"])
  67. print('time:%s,shortStop cover:%s'%(bar.datetime,bar.high))
  68. self.signal_1 = 0
  69. self.signal_2 = 0
  70. self.signal_3 = 0
  71. self.signal = 0
  72. elif self.signal_1 > 0 or self.signal_2 > 0 or self.signal_3 > 0: #
  73. self.cover(symbol,bar.close*1.02, self.posDict[symbol+"_SHORT"])
  74. self.signal_1 = 0
  75. self.signal_2 = 0
  76. self.signal_3 = 0
  77. self.signal = 0
  78. print('time:%s,onbar cover:%s'%(bar.datetime,bar.close))
  79. elif self.nPos == 0 and self.signal == -2 : # 计算盈利比例
  80. self.nPos += 1 # 加仓次数减少 1 次
  81. self.short(symbol,bar.close*0.98,self.fixsize) # 加仓数量固定fixsize
  82. print('time:%s,onbar_short_add:%s,n:%s'%(bar.datetime,bar.close,self.nPos))
  83. elif self.nPos == 1 and self.signal == -3 :
  84. self.short(symbol,bar.close*0.98,self.fixsize) # 加仓数量固定fixsize
  85. print('time:%s,onbar_short_add2:%s,n:%s'%(bar.datetime,bar.close,self.nPos+1))
  86. # 发出状态更新事件
  87. self.putEvent()
  88. def on15MinBar(self, bar):
  89. """30分钟K线推送"""
  90. symbol = bar.vtSymbol
  91. am15 = self.getArrayManager(symbol, "15m")
  92. if not am15.inited:
  93. return
  94. # 计算策略需要的信号,共三个信号分别是MACD,rsi,动量指标-------------------------------------------------
  95. diff,dea,hist = ta.MACD(am15.close)
  96. if diff[-1]<0 and dea[-1]<0 and diff[-2]<dea[-2] and diff[-1]>dea[-1]:
  97. self.signal_1 = 1
  98. elif diff[-1]>0 and dea[-2]>0 and diff[-2]>dea[-2] and diff[-1]<dea[-1]:
  99. self.signal_1 = -1
  100. else:
  101. self.signal_1 = 0
  102. rsi = ta.RSI(am15.close)
  103. if rsi[-2]<38 and rsi[-1]>38:
  104. self.signal_2 = 1
  105. elif rsi[-2]>68 and rsi[-1]<68:
  106. self.signal_2 = -1
  107. else:
  108. self.signal_2 = 0
  109. movement = (am15.close[-1] - am15.close[-10])/am15.close[-10]
  110. if movement < -0.015:
  111. self.signal_3 = 1
  112. elif movement > 0.015:
  113. self.signal_3 = -1
  114. else:
  115. self.signal_3 = 0
  116. ### 将三个信号加和
  117. self.signal = self.signal_1 + self.signal_2 + self.signal_3
  118. # 构建进出场逻辑-------------------------------------------------
  119. # 如果3个都不是空头信号,并且有一个信号满足多头信号,则开多仓
  120. if self.signal_1 >= 0 and self.signal_2 >= 0 and self.signal_3 >= 0 and self.signal == 1:
  121. # 如果金叉时手头没有持仓,则直接做多
  122. if (self.posDict[symbol+'_LONG']==0) and (self.posDict[symbol+'_SHORT']==0):
  123. self.buy(symbol, bar.close*1.02, self.fixsize*0.3)
  124. print('time:%s,nornal_buy:%s'%(bar.datetime,bar.close))
  125. # 如果有空头持仓,则先平空,再做多
  126. elif self.posDict[symbol+'_SHORT'] >0:
  127. #print('short_pos:%s'%self.posDict[symbol+'_SHORT'])
  128. self.cover(symbol,bar.close*1.02, self.posDict[symbol+'_SHORT'])
  129. print('time:%s,cover cause buy:%s'%(bar.datetime,bar.close))
  130. #print('short_pos:%s'%self.posDict[symbol+'_SHORT'])
  131. self.nPos = 0
  132. self.buy(symbol,bar.close*1.02, self.fixsize*0.3)
  133. print('time:%s,buy after cover:%s'%(bar.datetime,bar.close))
  134. # 如果3个都不是多头信号,并且有一个信号满足空头信号,则开空仓
  135. elif self.signal_1 <= 0 and self.signal_2 <= 0 and self.signal_3 <= 0 and self.signal == -1:
  136. if (self.posDict[symbol+'_LONG']==0) and (self.posDict[symbol+'_SHORT']==0):
  137. self.short(symbol,bar.close*0.98, self.fixsize*0.3)
  138. print('time:%s,normal short:%s'%(bar.datetime,bar.close))
  139. elif self.posDict[symbol+'_LONG'] >0:
  140. self.sell(symbol,bar.close*0.98, self.posDict[symbol+'_LONG'])
  141. print('time:%s,sell cause buy:%s'%(bar.datetime,bar.close))
  142. self.nPos = 0
  143. self.short(symbol,bar.close*0.98, self.fixsize*0.3)
  144. print('time:%s,short after sell:%s'%(bar.datetime,bar.close))
  145. if abs(self.signal) >=2:
  146. print('signal_1:%s,signal_2:%s,signal_3:%s,signal:%s'%(self.signal_1,self.signal_2,self.signal_3,self.signal))
  147. # 发出状态更新事件
  148. self.putEvent()

多信号加仓法案例,可以自行更改进出场信号signal_1、signal_2、signal_3

  1. """
  2. 这里的Demo是一个最简单的双均线策略实现
  3. """
  4. # coding: utf-8
  5. from __future__ import division
  6. from vnpy.trader.vtConstant import *
  7. from vnpy.trader.app.ctaStrategy import CtaTemplate
  8. from collections import defaultdict
  9. import numpy as np
  10. import talib as ta
  11. import pandas as pd
  12. from datetime import datetime
  13. ########################################################################
  14. # 策略继承CtaTemplate
  15. class multi_signal_Strategy(CtaTemplate):
  16. """双指数均线策略Demo"""
  17. className = 'multi_signal_Strategy'
  18. author = 'ChannelCMT'
  19. # 策略参数
  20. barPeriod = 200
  21. fastWindow = 60 # 快速均线参数
  22. slowWindow = 120 # 慢速均线参数
  23. # 参数列表,保存了参数的名称
  24. paramList = ['name',
  25. 'className',
  26. 'author',
  27. 'fastWindow',
  28. 'slowWindow']
  29. # 变量列表,保存了变量的名称
  30. varList = ['barPeriod']
  31. nPos = 0
  32. fixsize = 10
  33. trailingPercent = 4
  34. stopRatio = 0.02 # 止损百分比
  35. profitMultiplier = 6 # 止盈与止损比例
  36. transactionPrice = {} # 记录成交价格
  37. intraTradeHighDict = {}
  38. intraTradeLowDict = {}
  39. Ratio = 0.02
  40. signal_1 = 0
  41. signal_2 = 0
  42. signal_3 = 0
  43. signal = 0
  44. # 同步列表,保存了需要保存到数据库的变量名称
  45. syncList = ['posDict', 'eveningDict']
  46. #----------------------------------------------------------------------
  47. def __init__(self, ctaEngine, setting):
  48. # 首先找到策略的父类(就是类CtaTemplate),然后把DoubleMaStrategy的对象转换为类CtaTemplate的对象
  49. super().__init__(ctaEngine, setting)
  50. #----------------------------------------------------------------------
  51. def onInit(self):
  52. """初始化策略(必须由用户继承实现)"""
  53. self.writeCtaLog(u'双EMA演示策略初始化')
  54. # 生成Bar数组
  55. self.transactionPrice = {s: 0 for s in self.symbolList}
  56. self.intraTradeHighDict = {s: 0 for s in self.symbolList}
  57. self.intraTradeLowDict ={s: 0 for s in self.symbolList}
  58. self.mail("chushihuaaaaaaaaaaaaaaaaaaaaaaaaa")
  59. self.putEvent()
  60. #----------------------------------------------------------------------
  61. def onStart(self):
  62. """启动策略(必须由用户继承实现)"""
  63. self.writeCtaLog(u'双EMA演示策略启动')
  64. self.putEvent()
  65. #----------------------------------------------------------------------
  66. def onStop(self):
  67. """停止策略(必须由用户继承实现)"""
  68. self.writeCtaLog(u'策略停止')
  69. self.putEvent()
  70. #----------------------------------------------------------------------
  71. def onTick(self, tick):
  72. """收到行情TICK推送(必须由用户继承实现)"""
  73. pass
  74. #----------------------------------------------------------------------
  75. def onBar(self, bar):
  76. """收到Bar推送(必须由用户继承实现)"""
  77. symbol = bar.vtSymbol
  78. if self.posDict[symbol+"_LONG"] == 0 and self.posDict[symbol+"_SHORT"] == 0:
  79. self.intraTradeHighDict[symbol] = 0
  80. self.intraTradeLowDict[symbol] = 999999
  81. # 洗价器
  82. # 多信号加仓模块,多空相反______________________________________
  83. elif self.posDict[symbol+"_LONG"]!=0 : # 持有多头仓位并且加仓次数不超过2次(共三个信号,允许加2次仓)
  84. self.intraTradeHighDict[symbol] = max(self.intraTradeHighDict[symbol], bar.high)
  85. self.intraTradeLowDict[symbol] = bar.low
  86. self.longStop = self.intraTradeHighDict[symbol]*(1-self.trailingPercent/100)
  87. # print('最高价:%s'%self.intraTradeHighDict[symbol])
  88. # print('止损价格:%s'%self.longStop)
  89. # print('开仓价格:%s'%self.transactionPrice)
  90. if bar.close<=self.longStop or (bar.close > self.transactionPrice[symbol] * (1 + self.profitMultiplier * self.stopRatio)):
  91. self.cancelAll()
  92. self.sell(symbol, bar.close*0.98, self.posDict[symbol+"_LONG"])
  93. self.signal_1 = 0
  94. self.signal_2 = 0
  95. self.signal_3 = 0
  96. self.signal = 0
  97. elif self.signal_1 < 0 or self.signal_2 < 0 or self.signal_3 < 0: # 持有多仓情况下有一个信号转换为空头信号,则清仓出场
  98. self.sell(symbol,bar.close*0.98, self.posDict[symbol+"_LONG"]) # 全部头寸出场
  99. print('time:%s,on bar sell:%s'%(bar.datetime,bar.close))
  100. self.signal_1 = 0
  101. self.signal_2 = 0
  102. self.signal_3 = 0
  103. self.signal = 0
  104. elif self.nPos == 0 and self.signal == 2: # 第一次开仓是有一个信号满足,当另一个信号满足多头信号,则加仓
  105. self.nPos += 1 # 加仓次数减少 1 次
  106. self.buy(symbol,bar.close*1.02,self.fixsize) # 加仓数量固定fixsize
  107. print('time:%s,onbar_long_add:%s,n:%s'%(bar.datetime,bar.close,self.nPos))
  108. elif self.nPos == 1 and self.signal == 3 : # 建立在第一次加仓的基础上,再有信号满足多头信号,继续加仓
  109. self.buy(symbol,bar.close*1.02,self.fixsize) # 加仓数量固定fixsize
  110. print('time:%s,onbar_long_add2:%s,n:%s'%(bar.datetime,bar.close,self.nPos+1))
  111. elif self.posDict[symbol + "_SHORT"] != 0:
  112. self.intraTradeLowDict[symbol] = min(self.intraTradeLowDict[symbol], bar.low)
  113. self.intraTradeHighDict[symbol] = bar.high
  114. self.shortStop = self.intraTradeLowDict[symbol]*(1+self.trailingPercent/100)
  115. if (bar.close>=self.shortStop) or (bar.close < self.transactionPrice[symbol] * (1 - self.profitMultiplier * self.stopRatio)):
  116. self.cancelAll()
  117. self.cover(symbol, bar.close*1.02, self.posDict[symbol+"_SHORT"])
  118. print('time:%s,shortStop cover:%s'%(bar.datetime,bar.high))
  119. self.signal_1 = 0
  120. self.signal_2 = 0
  121. self.signal_3 = 0
  122. self.signal = 0
  123. elif self.signal_1 > 0 or self.signal_2 > 0 or self.signal_3 > 0: #
  124. self.cover(symbol,bar.close*1.02, self.posDict[symbol+"_SHORT"])
  125. self.signal_1 = 0
  126. self.signal_2 = 0
  127. self.signal_3 = 0
  128. self.signal = 0
  129. print('time:%s,onbar cover:%s'%(bar.datetime,bar.close))
  130. elif self.nPos == 0 and self.signal == -2 : # 计算盈利比例
  131. self.nPos += 1 # 加仓次数减少 1 次
  132. self.short(symbol,bar.close*0.98,self.fixsize) # 加仓数量固定fixsize
  133. print('time:%s,onbar_short_add:%s,n:%s'%(bar.datetime,bar.close,self.nPos))
  134. elif self.nPos == 1 and self.signal == -3 :
  135. self.short(symbol,bar.close*0.98,self.fixsize) # 加仓数量固定fixsize
  136. print('time:%s,onbar_short_add2:%s,n:%s'%(bar.datetime,bar.close,self.nPos+1))
  137. # 发出状态更新事件
  138. self.putEvent()
  139. def on15MinBar(self, bar):
  140. """30分钟K线推送"""
  141. symbol = bar.vtSymbol
  142. am15 = self.getArrayManager(symbol, "15m")
  143. if not am15.inited:
  144. return
  145. # 计算策略需要的信号,共三个信号分别是MACD,rsi,动量指标-------------------------------------------------
  146. diff,dea,hist = ta.MACD(am15.close)
  147. if diff[-1]<0 and dea[-1]<0 and diff[-2]<dea[-2] and diff[-1]>dea[-1]:
  148. self.signal_1 = 1
  149. elif diff[-1]>0 and dea[-2]>0 and diff[-2]>dea[-2] and diff[-1]<dea[-1]:
  150. self.signal_1 = -1
  151. else:
  152. self.signal_1 = 0
  153. rsi = ta.RSI(am15.close)
  154. if rsi[-2]<38 and rsi[-1]>38:
  155. self.signal_2 = 1
  156. elif rsi[-2]>68 and rsi[-1]<68:
  157. self.signal_2 = -1
  158. else:
  159. self.signal_2 = 0
  160. movement = (am15.close[-1] - am15.close[-10])/am15.close[-10]
  161. if movement < -0.015:
  162. self.signal_3 = 1
  163. elif movement > 0.015:
  164. self.signal_3 = -1
  165. else:
  166. self.signal_3 = 0
  167. ### 将三个信号加和
  168. self.signal = self.signal_1 + self.signal_2 + self.signal_3
  169. # 构建进出场逻辑-------------------------------------------------
  170. # 如果3个都不是空头信号,并且有一个信号满足多头信号,则开多仓
  171. if self.signal_1 >= 0 and self.signal_2 >= 0 and self.signal_3 >= 0 and self.signal == 1:
  172. # 如果金叉时手头没有持仓,则直接做多
  173. if (self.posDict[symbol+'_LONG']==0) and (self.posDict[symbol+'_SHORT']==0):
  174. self.buy(symbol, bar.close*1.02, self.fixsize*0.3)
  175. print('time:%s,nornal_buy:%s'%(bar.datetime,bar.close))
  176. # 如果有空头持仓,则先平空,再做多
  177. elif self.posDict[symbol+'_SHORT'] >0:
  178. #print('short_pos:%s'%self.posDict[symbol+'_SHORT'])
  179. self.cover(symbol,bar.close*1.02, self.posDict[symbol+'_SHORT'])
  180. print('time:%s,cover cause buy:%s'%(bar.datetime,bar.close))
  181. #print('short_pos:%s'%self.posDict[symbol+'_SHORT'])
  182. self.nPos = 0
  183. self.buy(symbol,bar.close*1.02, self.fixsize*0.3)
  184. print('time:%s,buy after cover:%s'%(bar.datetime,bar.close))
  185. # 如果3个都不是多头信号,并且有一个信号满足空头信号,则开空仓
  186. elif self.signal_1 <= 0 and self.signal_2 <= 0 and self.signal_3 <= 0 and self.signal == -1:
  187. if (self.posDict[symbol+'_LONG']==0) and (self.posDict[symbol+'_SHORT']==0):
  188. self.short(symbol,bar.close*0.98, self.fixsize*0.3)
  189. print('time:%s,normal short:%s'%(bar.datetime,bar.close))
  190. elif self.posDict[symbol+'_LONG'] >0:
  191. self.sell(symbol,bar.close*0.98, self.posDict[symbol+'_LONG'])
  192. print('time:%s,sell cause buy:%s'%(bar.datetime,bar.close))
  193. self.nPos = 0
  194. self.short(symbol,bar.close*0.98, self.fixsize*0.3)
  195. print('time:%s,short after sell:%s'%(bar.datetime,bar.close))
  196. if abs(self.signal) >=2:
  197. print('signal_1:%s,signal_2:%s,signal_3:%s,signal:%s'%(self.signal_1,self.signal_2,self.signal_3,self.signal))
  198. # 发出状态更新事件
  199. self.putEvent()
  200. #----------------------------------------------------------------------
  201. def onOrder(self, order):
  202. """收到委托变化推送(必须由用户继承实现)"""
  203. # 对于无需做细粒度委托控制的策略,可以忽略onOrder
  204. # print(u'出现未知订单,需要策略师外部干预,ID:%s, symbol:%s,direction:%s,offset:%s'% (order.vtOrderID, order.vtSymbol, order.direction, order.offset))
  205. pass
  206. #----------------------------------------------------------------------
  207. def onTrade(self, trade):
  208. """收到成交推送(必须由用户继承实现)"""
  209. symbol = trade.vtSymbol
  210. self.transactionPrice[symbol] = trade.price
  211. pass
  212. #----------------------------------------------------------------------
  213. def onStopOrder(self, so):
  214. """停止单推送"""
  215. 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)
  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)
  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(multi_signal_Strategy, {'symbolList': ['BTCUSDT:binance']},
  31. '20181001 12:00', '20181031 16:00', 100, 0, 5/10000)
  32. # tradeReport.to_excel('BBandMa5MinStrategyReport.xlsx')
2018-11-15 22:45:13.426139  策略日志已生成
2018-11-15 22:45:13.426139  计算按日统计结果
2018-11-15 22:45:13.469112  ------------------------------
2018-11-15 22:45:13.469112  首个交易日:  2018-10-01 00:00:00
2018-11-15 22:45:13.469112  最后交易日:  2018-10-31 00:00:00
2018-11-15 22:45:13.469112  总交易日:   31
2018-11-15 22:45:13.469112  盈利交易日   12
2018-11-15 22:45:13.469112  亏损交易日:  19
2018-11-15 22:45:13.469112  起始资金:   100000
2018-11-15 22:45:13.469112  结束资金:   2,274,259.17
2018-11-15 22:45:13.469112  总收益率:   2,174.26%
2018-11-15 22:45:13.469112  年化收益:   16,832.97%
2018-11-15 22:45:13.469112  总盈亏:    2,174,259.17
2018-11-15 22:45:13.469112  最大回撤:   -1,235,083.51
2018-11-15 22:45:13.469112  百分比最大回撤: -74.78%
2018-11-15 22:45:13.470116  总手续费:   2,006,450.82
2018-11-15 22:45:13.470116  总滑点:    0.0
2018-11-15 22:45:13.470116  总成交金额:  4,012,901,650.0
2018-11-15 22:45:13.470116  总成交笔数:  265
2018-11-15 22:45:13.470116  日均盈亏:   70,137.39
2018-11-15 22:45:13.470116  日均手续费:  64,724.22
2018-11-15 22:45:13.470116  日均滑点:   0.0
2018-11-15 22:45:13.470116  日均成交金额: 129,448,440.32
2018-11-15 22:45:13.471122  日均成交笔数: 8.55
2018-11-15 22:45:13.471122  日均收益率:  4.97%
2018-11-15 22:45:13.471122  收益标准差:  43.69%
2018-11-15 22:45:13.471122  Sharpe Ratio:   1.76



2018-11-15 22:45:14.410675  策略回测绩效图已保存

output_7_3.png-41.5kB

2018-11-15 22:45:15.192194  计算回测结果
2018-11-15 22:45:15.222174  交割单已生成
2018-11-15 22:45:15.223172  ------------------------------
2018-11-15 22:45:15.223172  第一笔交易:  2018-10-01 16:15:00
2018-11-15 22:45:15.223172  最后一笔交易: 2018-10-31 15:58:00
2018-11-15 22:45:15.223172  总交易次数:  180
2018-11-15 22:45:15.223172  总盈亏:    284,654.44
2018-11-15 22:45:15.223172  最大回撤:   -6,423,167.65
2018-11-15 22:45:15.223172  平均每笔盈利: 1,581.41
2018-11-15 22:45:15.223172  平均每笔滑点: 0.0
2018-11-15 22:45:15.223172  平均每笔佣金: 21,644.75
2018-11-15 22:45:15.223172  胜率      45.56%
2018-11-15 22:45:15.224172  盈利交易平均值 203,081.68
2018-11-15 22:45:15.224172  亏损交易平均值 -167,020.85
2018-11-15 22:45:15.224172  盈亏比:    1.22
2018-11-15 22:45:16.140242  策略回测统计图已保存

output_7_5.png-39.3kB

2018-11-15 22:45:16.877789  计算按日统计结果

绩效报告

  1. tradeReport
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注