@Channelchan
2018-11-16T16:52:37.000000Z
字数 5289
阅读 4691
强者越强,弱者越弱
一段时间内某股票和本行业的股票或整个市场的比较,即对该股票市场表现的计量。
RS = Stock/Index
MOM_RS = Momentum(RS)
MOM_MOM = Momentum(MOM_RS)
from jaqs.data import DataView
from jaqs.data import RemoteDataService
import os
import numpy as np
import talib as ta
import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt
import warnings
warnings.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 df
stock = change_index(dv.get_ts('close_adj').loc[20170105:])
hs300 = change_index(dv.data_benchmark.loc[20170105:])
RS = stock['600036.SH']/hs300.close
RS = 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_RS
import talib as ta
MOM_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 plt
plt.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_Strength
from __future__ import division
from 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 = 80
lots = 1
stopRatio = 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.vtSymbol
self.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.vtSymbol
am3 = self.getArrayManager(symbol, "3m")
if not am3.inited:
return
MOM = 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] = 1
elif (MOM_MOM[-1] < 100) and (MOM_MOM[-2] > 100):
self.ROCRsignal[symbol] = -1
else:
self.ROCRsignal[symbol] = 0
if 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):
"""收到委托变化推送(必须由用户继承实现)"""
# 对于无需做细粒度委托控制的策略,可以忽略onOrder
pass
# ----------------------------------------------------------------------
def onTrade(self, trade):
symbol = trade.vtSymbol
"""收到成交推送(必须由用户继承实现)"""
# 对于无需做细粒度委托控制的策略,可以忽略onTrade
self.transactionPrice[symbol] = trade.price
# ----------------------------------------------------------------------
def onStopOrder(self, so):
"""停止单推送"""
pass
根据以上代码做出其他象限进场的策略