@Channelchan
2018-11-16T08:52:37.000000Z
字数 5289
阅读 4884
强者越强,弱者越弱
一段时间内某股票和本行业的股票或整个市场的比较,即对该股票市场表现的计量。
RS = Stock/Index
MOM_RS = Momentum(RS)
MOM_MOM = Momentum(MOM_RS)
from jaqs.data import DataViewfrom jaqs.data import RemoteDataServiceimport osimport numpy as npimport talib as taimport pandas as pdfrom datetime import datetimeimport matplotlib.pyplot as pltimport warningswarnings.filterwarnings("ignore")dataview_folder = 'JAQS_Data/hs300'dv = DataView()dv.load_dataview(dataview_folder)
Dataview loaded successfully.
def change_index(df):df.index = pd.Index(map(lambda x: datetime.strptime(str(x),"%Y%m%d") , df.index))return dfstock = change_index(dv.get_ts('close_adj').loc[20170105:])hs300 = change_index(dv.data_benchmark.loc[20170105:])
RS = stock['600036.SH']/hs300.closeRS = RS.dropna()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
#Momentum_RSimport talib as taMOM_RS = ta.ROCR100(RS.values, 20)MOM_MOM = ta.ROCR100(MOM_RS, 20)data_s = stock['600036.SH']data1 = pd.Series(MOM_RS, index=RS.index)data2 = pd.Series(MOM_MOM, index=RS.index)data = pd.concat([data_s, RS, data1, data2], axis=1)data.columns = ['close', 'RS', 'MOM_RS', 'MOM_MOM']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
import matplotlib.pyplot as pltplt.figure(figsize=(15,7))plt.plot(data.MOM_RS.tail(20).values, data.MOM_MOM.tail(20).values)plt.axhline(100,alpha=0.3)plt.axvline(100,alpha=0.3)X=data['MOM_RS'].iloc[-1]Y=data['MOM_MOM'].iloc[-1]plt.scatter(X,Y,color='r', s=100)plt.show()

买入时机:
第一象限:(MOM_RS>100, MOM_MOM>100)
第四象限:(MOM_RS< 100, MOM_MOM >100)
卖出时机
第二象限:(MOM_RS > 100, MOM_MOM < 100)
第三象限:(MOM_RS< 100, MOM_MOM < 100)
#Relative_Strengthfrom __future__ import divisionfrom vnpy.trader.vtConstant import *from vnpy.trader.app.ctaStrategy.ctaBarManager import (CtaTemplate,ArrayManager)import talib as ta########################################################################class ROCRStrategy(CtaTemplate):className = 'ROCRStrategy'author = 'xingetouzi'# 策略参数ROCRPeriod = 80lots = 1stopRatio = 0.08 # 止损比例# 策略变量ROCRsignal = {}transactionPrice = {}# 参数列表,保存了参数的名称paramList = ['className','author','symbolList','ROCRPeriod','lots','stopRatio']# 变量列表,保存了变量的名称varList = ['transactionPrice','ROCRsignal']# 同步列表,保存了需要保存到数据库的变量名称syncList = ['posDict', 'eveningDict']# ----------------------------------------------------------------------def __init__(self, ctaEngine, setting):super(ROCRStrategy, self).__init__(ctaEngine, setting)# ----------------------------------------------------------------------def onInit(self):"""初始化策略(必须由用户继承实现)"""self.setArrayManagerSize(200)self.ROCRsignal = {s: 0 for s in self.symbolList}self.transactionPrice = {s: 0 for s in self.symbolList}self.putEvent() # putEvent 能刷新策略UI界面的信息# ----------------------------------------------------------------------def onStart(self):"""启动策略(必须由用户继承实现)"""self.putEvent()'''实盘在点击启动策略时, 此时的引擎下单逻辑改为True, 此时开始推送到onbar的数据, 会触发下单。'''# ----------------------------------------------------------------------def onStop(self):"""停止策略(必须由用户继承实现)"""self.putEvent()# ----------------------------------------------------------------------def onRestore(self):"""恢复策略(必须由用户继承实现)"""# 策略恢复会自动读取 varList 和 syncList 的数据,还原之前运行时的状态。# 需要注意的是,使用恢复,策略不会运行 onInit 和 onStart 的代码,直接进入行情接收阶段self.putEvent()# ----------------------------------------------------------------------def onTick(self, tick):"""收到行情TICK推送(必须由用户继承实现)"""# 在每个Tick推送过来的时候,进行updateTick,生成分钟线后推送到onBar.# 需要注意的是,如果没有updateTick,实盘将不会推送1分钟K线pass# ----------------------------------------------------------------------def onBar(self, bar):"""收到Bar推送(必须由用户继承实现)"""symbol = bar.vtSymbolself.writeCtaLog(u'%s, bar.close%s, %s' % (symbol, bar.close, bar.datetime)) # 可以将实盘的运行情况记录到日志里# 持有多头仓位if self.posDict[symbol + "_LONG"] > 0:if (bar.close < self.transactionPrice[symbol] * (1 - self.stopRatio)) or \(bar.close > self.transactionPrice[symbol] * (1 + 2 * self.stopRatio)):self.sell(symbol, bar.close * 0.98, self.posDict[symbol + "_LONG"])# 持有空头仓位elif self.posDict[symbol + "_SHORT"] > 0:if (bar.close > self.transactionPrice[symbol] * (1 + self.stopRatio)) or \(bar.close < self.transactionPrice[symbol] * (1 - 2 * self.stopRatio)):self.cover(symbol, bar.close * 1.02, self.posDict[symbol + "_SHORT"])self.putEvent() # 每分钟更新一次UI界面def on3MinBar(self, bar):"""3分钟K线推送"""symbol = bar.vtSymbolam3 = self.getArrayManager(symbol, "3m")if not am3.inited:returnMOM = ta.ROCR100(am3.close, self.ROCRPeriod)if len(MOM) > self.ROCRPeriod:MOM_MOM = ta.ROCR100(MOM, self.ROCRPeriod)if (MOM_MOM[-1] > 100) and (MOM_MOM[-2] < 100):self.ROCRsignal[symbol] = 1elif (MOM_MOM[-1] < 100) and (MOM_MOM[-2] > 100):self.ROCRsignal[symbol] = -1else:self.ROCRsignal[symbol] = 0if self.posDict[symbol + "_LONG"] == 0 and self.posDict[symbol + "_SHORT"] == 0:if self.maTrend[symbol] == 1:self.buy(symbol, bar.close * 1.02, self.lots)if self.maTrend[symbol] == -1:self.short(symbol, bar.close * 0.98, self.lots)def onOrder(self, order):"""收到委托变化推送(必须由用户继承实现)"""# 对于无需做细粒度委托控制的策略,可以忽略onOrderpass# ----------------------------------------------------------------------def onTrade(self, trade):symbol = trade.vtSymbol"""收到成交推送(必须由用户继承实现)"""# 对于无需做细粒度委托控制的策略,可以忽略onTradeself.transactionPrice[symbol] = trade.price# ----------------------------------------------------------------------def onStopOrder(self, so):"""停止单推送"""pass

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