[关闭]
@Channelchan 2018-11-16T16:52:37.000000Z 字数 5289 阅读 4691

相对强弱市场

强者越强,弱者越弱

目录

  1. 什么是相对强弱?
  2. 怎么计算相对强弱?
  3. 如何用图形展示相对强弱?
  4. 如何用相对强弱来编写策略?

什么是相对强弱?

一段时间内某股票和本行业的股票或整个市场的比较,即对该股票市场表现的计量。

怎么计算相对强弱?

RS = Stock/Index

MOM_RS = Momentum(RS)

MOM_MOM = Momentum(MOM_RS)

如何用图形展示相对强弱?

  1. from jaqs.data import DataView
  2. from jaqs.data import RemoteDataService
  3. import os
  4. import numpy as np
  5. import talib as ta
  6. import pandas as pd
  7. from datetime import datetime
  8. import matplotlib.pyplot as plt
  9. import warnings
  10. warnings.filterwarnings("ignore")
  11. dataview_folder = 'JAQS_Data/hs300'
  12. dv = DataView()
  13. dv.load_dataview(dataview_folder)
Dataview loaded successfully.
  1. def change_index(df):
  2. df.index = pd.Index(map(lambda x: datetime.strptime(str(x),"%Y%m%d") , df.index))
  3. return df
  4. stock = change_index(dv.get_ts('close_adj').loc[20170105:])
  5. hs300 = change_index(dv.data_benchmark.loc[20170105:])
  1. RS = stock['600036.SH']/hs300.close
  2. RS = RS.dropna()
  3. print (RS.tail())
2017-12-18    0.009375
2017-12-19    0.009595
2017-12-20    0.009642
2017-12-21    0.009609
2017-12-22    0.009527
dtype: float64
  1. #Momentum_RS
  2. import talib as ta
  3. MOM_RS = ta.ROCR100(RS.values, 20)
  4. MOM_MOM = ta.ROCR100(MOM_RS, 20)
  5. data_s = stock['600036.SH']
  6. data1 = pd.Series(MOM_RS, index=RS.index)
  7. data2 = pd.Series(MOM_MOM, index=RS.index)
  8. data = pd.concat([data_s, RS, data1, data2], axis=1)
  9. data.columns = ['close', 'RS', 'MOM_RS', 'MOM_MOM']
  10. print (data.tail())
                close        RS      MOM_RS    MOM_MOM
2017-12-18  37.360561  0.009375   96.485483  88.288186
2017-12-19  38.718887  0.009595  101.076718  94.407043
2017-12-20  38.863951  0.009642  100.035532  92.229752
2017-12-21  39.088141  0.009609   99.639105  90.583452
2017-12-22  38.626574  0.009527   98.532208  93.897203
  1. import matplotlib.pyplot as plt
  2. plt.figure(figsize=(15,7))
  3. plt.plot(data.MOM_RS.tail(20).values, data.MOM_MOM.tail(20).values)
  4. plt.axhline(100,alpha=0.3)
  5. plt.axvline(100,alpha=0.3)
  6. X=data['MOM_RS'].iloc[-1]
  7. Y=data['MOM_MOM'].iloc[-1]
  8. plt.scatter(X,Y,color='r', s=100)
  9. plt.show()

output_9_0.png-28.9kB

如何用相对强弱来编写策略?

买入时机:

第一象限:(MOM_RS>100, MOM_MOM>100)

第四象限:(MOM_RS< 100, MOM_MOM >100)

卖出时机

第二象限:(MOM_RS > 100, MOM_MOM < 100)

第三象限:(MOM_RS< 100, MOM_MOM < 100)

  1. #Relative_Strength
  2. from __future__ import division
  3. from vnpy.trader.vtConstant import *
  4. from vnpy.trader.app.ctaStrategy.ctaBarManager import (CtaTemplate,
  5. ArrayManager)
  6. import talib as ta
  7. ########################################################################
  8. class ROCRStrategy(CtaTemplate):
  9. className = 'ROCRStrategy'
  10. author = 'xingetouzi'
  11. # 策略参数
  12. ROCRPeriod = 80
  13. lots = 1
  14. stopRatio = 0.08 # 止损比例
  15. # 策略变量
  16. ROCRsignal = {}
  17. transactionPrice = {}
  18. # 参数列表,保存了参数的名称
  19. paramList = ['className',
  20. 'author',
  21. 'symbolList',
  22. 'ROCRPeriod',
  23. 'lots',
  24. 'stopRatio']
  25. # 变量列表,保存了变量的名称
  26. varList = ['transactionPrice',
  27. 'ROCRsignal']
  28. # 同步列表,保存了需要保存到数据库的变量名称
  29. syncList = ['posDict', 'eveningDict']
  30. # ----------------------------------------------------------------------
  31. def __init__(self, ctaEngine, setting):
  32. super(ROCRStrategy, self).__init__(ctaEngine, setting)
  33. # ----------------------------------------------------------------------
  34. def onInit(self):
  35. """初始化策略(必须由用户继承实现)"""
  36. self.setArrayManagerSize(200)
  37. self.ROCRsignal = {s: 0 for s in self.symbolList}
  38. self.transactionPrice = {s: 0 for s in self.symbolList}
  39. self.putEvent() # putEvent 能刷新策略UI界面的信息
  40. # ----------------------------------------------------------------------
  41. def onStart(self):
  42. """启动策略(必须由用户继承实现)"""
  43. self.putEvent()
  44. '''
  45. 实盘在点击启动策略时, 此时的引擎下单逻辑改为True, 此时开始推送到onbar的数据, 会触发下单。
  46. '''
  47. # ----------------------------------------------------------------------
  48. def onStop(self):
  49. """停止策略(必须由用户继承实现)"""
  50. self.putEvent()
  51. # ----------------------------------------------------------------------
  52. def onRestore(self):
  53. """恢复策略(必须由用户继承实现)"""
  54. # 策略恢复会自动读取 varList 和 syncList 的数据,还原之前运行时的状态。
  55. # 需要注意的是,使用恢复,策略不会运行 onInit 和 onStart 的代码,直接进入行情接收阶段
  56. self.putEvent()
  57. # ----------------------------------------------------------------------
  58. def onTick(self, tick):
  59. """收到行情TICK推送(必须由用户继承实现)"""
  60. # 在每个Tick推送过来的时候,进行updateTick,生成分钟线后推送到onBar.
  61. # 需要注意的是,如果没有updateTick,实盘将不会推送1分钟K线
  62. pass
  63. # ----------------------------------------------------------------------
  64. def onBar(self, bar):
  65. """收到Bar推送(必须由用户继承实现)"""
  66. symbol = bar.vtSymbol
  67. self.writeCtaLog(u'%s, bar.close%s, %s' % (symbol, bar.close, bar.datetime)) # 可以将实盘的运行情况记录到日志里
  68. # 持有多头仓位
  69. if self.posDict[symbol + "_LONG"] > 0:
  70. if (bar.close < self.transactionPrice[symbol] * (1 - self.stopRatio)) or \
  71. (bar.close > self.transactionPrice[symbol] * (1 + 2 * self.stopRatio)):
  72. self.sell(symbol, bar.close * 0.98, self.posDict[symbol + "_LONG"])
  73. # 持有空头仓位
  74. elif self.posDict[symbol + "_SHORT"] > 0:
  75. if (bar.close > self.transactionPrice[symbol] * (1 + self.stopRatio)) or \
  76. (bar.close < self.transactionPrice[symbol] * (1 - 2 * self.stopRatio)):
  77. self.cover(symbol, bar.close * 1.02, self.posDict[symbol + "_SHORT"])
  78. self.putEvent() # 每分钟更新一次UI界面
  79. def on3MinBar(self, bar):
  80. """3分钟K线推送"""
  81. symbol = bar.vtSymbol
  82. am3 = self.getArrayManager(symbol, "3m")
  83. if not am3.inited:
  84. return
  85. MOM = ta.ROCR100(am3.close, self.ROCRPeriod)
  86. if len(MOM) > self.ROCRPeriod:
  87. MOM_MOM = ta.ROCR100(MOM, self.ROCRPeriod)
  88. if (MOM_MOM[-1] > 100) and (MOM_MOM[-2] < 100):
  89. self.ROCRsignal[symbol] = 1
  90. elif (MOM_MOM[-1] < 100) and (MOM_MOM[-2] > 100):
  91. self.ROCRsignal[symbol] = -1
  92. else:
  93. self.ROCRsignal[symbol] = 0
  94. if self.posDict[symbol + "_LONG"] == 0 and self.posDict[symbol + "_SHORT"] == 0:
  95. if self.maTrend[symbol] == 1:
  96. self.buy(symbol, bar.close * 1.02, self.lots)
  97. if self.maTrend[symbol] == -1:
  98. self.short(symbol, bar.close * 0.98, self.lots)
  99. def onOrder(self, order):
  100. """收到委托变化推送(必须由用户继承实现)"""
  101. # 对于无需做细粒度委托控制的策略,可以忽略onOrder
  102. pass
  103. # ----------------------------------------------------------------------
  104. def onTrade(self, trade):
  105. symbol = trade.vtSymbol
  106. """收到成交推送(必须由用户继承实现)"""
  107. # 对于无需做细粒度委托控制的策略,可以忽略onTrade
  108. self.transactionPrice[symbol] = trade.price
  109. # ----------------------------------------------------------------------
  110. def onStopOrder(self, so):
  111. """停止单推送"""
  112. pass

回测绩效图.png-100.8kB
回测统计图.png-75kB

作业

根据以上代码做出其他象限进场的策略

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