写在前面:
1. 本文中提到的“股票策略校验工具”的具体使用操作请查看该博文;
2. 文中知识内容来自书籍《同花顺炒股软件从入门到精通》
3. 本系列文章是用来学习技法,文中所得内容都仅仅只是作为演示功能使用
目录
解说
所谓“三线相约下山,前景不容乐观”,是指股价高位时,移动均线5日、10日、20日三线都一起有向下的走向,且5日线和10日线分别向下交叉20日均线。这是典型见顶信号,表明短中长线均不看好后市。
出现“三线相约下山,前景不容乐观”的形态后,股票投资者需遵循以下操作原则。
1)出现在上升行情末期时,下跌空间较大。出现在整理行情的波段顶部时,是短线高抛低吸做差价的好机会,当然新手需要更加谨慎。
2)三线必须靠得较近扭在一起本形态才成立,且靠得越近有效性越高,其中有一条隔得较远时则非本形态。
提示:如该形态出现在股市剧烈震荡行情中,可采用“高抛低吸”的策略。但是对于新股民而言,不便参与,需谨慎对待。
策略代码
import pandas as pd
import math
import talib
def caculate_factor(df,code):
ori_column = df.columns.values.tolist()
if code == 'RSI':
df['rsi'] = talib.RSI(df['closePrice'], timeperiod=14)
ori_column.append('rsi')
if code == 'OBV':
df['obv'] = talib.OBV(df['closePrice'],df['turnoverVol'])
ori_column.append('obv')
if code == 'MACD':
df['DIFF'], df['DEA'], df['MACD'] = talib.MACD(df['closePrice'], fastperiod=12, slowperiod=26, signalperiod=9)
ori_column.append('DIFF')
ori_column.append('DEA')
ori_column.append('MACD')
pass
if code == 'KDJ':
df['kdj_k'], df['kdj_d'] = talib.STOCH(df['highestPrice'], df['lowestPrice'], df['closePrice'], fastk_period=5,
slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
df['kdj_j'] = 3 * df['kdj_k'] - 2 * df['kdj_d']
ori_column.append('kdj_k')
ori_column.append('kdj_d')
ori_column.append('kdj_j')
pass
if code == 'SAR':
df['sar'] = talib.SAR(df['highestPrice'], df['lowestPrice'])
ori_column.append('sar')
pass
if code == 'VOL':
df['vol5'] = talib.MA(df['turnoverVol'], timeperiod=5)
df['vol10'] = talib.MA(df['turnoverVol'], timeperiod=10)
ori_column.append('vol5')
ori_column.append('vol10')
pass
if code == 'PSY':
df['ext_0'] = df['closePrice'] - df['closePrice'].shift(1)
df['ext_1'] = 0
df.loc[df['ext_0'] > 0, 'ext_1'] = 1
df['ext_2'] = df['ext_1'].rolling(window=12).sum()
df['psy'] = (df['ext_2'] / 12.0) * 100
ori_column.append('psy')
pass
if code == 'ARBR':
df['h_o'] = df['highestPrice'] - df['openPrice']
df['o_l'] = df['openPrice'] - df['lowestPrice']
df['h_o_sum'] = df['h_o'].rolling(window=26).sum()
df['o_l_sum'] = df['o_l'].rolling(window=26).sum()
df['ar'] = (df['h_o_sum'] / df['o_l_sum']) * 100
df['h_c'] = df['highestPrice'] - df['closePrice']
df['c_l'] = df['closePrice'] - df['lowestPrice']
df['h_c_sum'] = df['h_c'].rolling(window=26).sum()
df['c_l_sum'] = df['c_l'].rolling(window=26).sum()
df['br'] = (df['h_c_sum'] / df['c_l_sum']) * 100
ori_column.append('ar')
ori_column.append('br')
pass
if code == 'CR':
df['m_price'] = (df['highestPrice'] + df['lowestPrice']) / 2
df['h_m'] = df['highestPrice'] - df['m_price'].shift(1)
df['m_l'] = df['m_price'].shift(1) - df['lowestPrice']
df['h_m_sum'] = df['h_m'].rolling(window=26).sum()
df['m_l_sum'] = df['m_l'].rolling(window=26).sum()
df['cr'] = (df['h_m_sum'] / df['m_l_sum']) * 100
df['ma1'] = talib.MA(df['cr'], timeperiod=5)
df['ma2'] = talib.MA(df['cr'], timeperiod=10)
df['ma3'] = talib.MA(df['cr'], timeperiod=20)
ori_column.append('cr')
ori_column.append('ma1')
ori_column.append('ma2')
ori_column.append('ma3')
pass
if code == 'EMV':
df['a'] = (df['highestPrice'] + df['lowestPrice']) / 2
df['b'] = (df['highestPrice'].shift(1) + df['lowestPrice'].shift(1)) / 2
df['c'] = df['highestPrice'] - df['lowestPrice']
df['em'] = (df['a'] - df['b']) * df['c'] / df['turnoverValue']
df['emv'] = df['em'].rolling(window=14).sum()
df['emva'] = talib.MA(df['emv'], timeperiod=9)
ori_column.append('em')
ori_column.append('emv')
ori_column.append('emva')
pass
if code == 'BOLL':
df['upper'], df['mid'], df['lower'] = talib.BBANDS(df['closePrice'], timeperiod=20, nbdevup=2, nbdevdn=2,
matype=0)
ori_column.append('upper')
ori_column.append('mid')
ori_column.append('lower')
pass
if code == 'TRIX':
df['trix'] = talib.TRIX(df['closePrice'], timeperiod=12)
df['trma'] = talib.MA(df['trix'], timeperiod=20)
ori_column.append('trix')
ori_column.append('trma')
pass
if code == 'DMA':
df['ma10'] = talib.MA(df['closePrice'], timeperiod=10)
df['ma50'] = talib.MA(df['closePrice'], timeperiod=50)
df['ddd'] = df['ma10'] - df['ma50']
df['ama'] = talib.MA(df['ddd'], timeperiod=10)
ori_column.append('ddd')
ori_column.append('ama')
pass
if code == 'BIAS':
df['ma6'] = talib.MA(df['closePrice'], timeperiod=6)
df['ma12'] = talib.MA(df['closePrice'], timeperiod=12)
df['ma24'] = talib.MA(df['closePrice'], timeperiod=24)
df['bias'] = ((df['closePrice'] - df['ma6']) / df['ma6']) * 100
df['bias2'] = ((df['closePrice'] - df['ma12']) / df['ma12']) * 100
df['bias3'] = ((df['closePrice'] - df['ma24']) / df['ma24']) * 100
ori_column.append('bias')
ori_column.append('bias2')
ori_column.append('bias3')
pass
if code == 'CCI':
df['cci'] = talib.CCI(df['highestPrice'], df['lowestPrice'], df['closePrice'], timeperiod=14)
ori_column.append('cci')
pass
if code == 'W%R':
n = 10
df['h_10'] = df['highestPrice'].rolling(window=n).max()
df['l_10'] = df['lowestPrice'].rolling(window=n).min()
df['wr10'] = ((df['h_10'] - df['closePrice']) / (df['h_10'] - df['l_10'])) * 100
n2 = 6
df['h_6'] = df['highestPrice'].rolling(window=n2).max()
df['l_6'] = df['lowestPrice'].rolling(window=n2).min()
df['wr6'] = ((df['h_6'] - df['closePrice']) / (df['h_6'] - df['l_6'])) * 100
ori_column.append('wr10')
ori_column.append('wr6')
pass
if code == 'ROC':
df['roc'] = talib.ROC(df['closePrice'], timeperiod=12)
df['rocma'] = talib.MA(df['roc'], timeperiod=6)
ori_column.append('roc')
ori_column.append('rocma')
pass
if code == 'DMI':
df['pdi'] = talib.PLUS_DI(df['highestPrice'], df['lowestPrice'], df['closePrice'], timeperiod=14)
df['mdi'] = talib.MINUS_DI(df['highestPrice'], df['lowestPrice'], df['closePrice'], timeperiod=14)
df['adx'] = talib.ADX(df['highestPrice'], df['lowestPrice'], df['closePrice'], timeperiod=6)
df['adxr'] = talib.ADXR(df['highestPrice'], df['lowestPrice'], df['closePrice'], timeperiod=6)
ori_column.append('pdi')
ori_column.append('mdi')
ori_column.append('adx')
ori_column.append('adxr')
pass
if code == 'ma5':
df['ma5'] = talib.MA(df['closePrice'], timeperiod=5)
ori_column.append('ma5')
pass
if code == 'ma10':
df['ma10'] = talib.MA(df['closePrice'], timeperiod=10)
ori_column.append('ma10')
pass
if code == 'ma20':
df['ma20'] = talib.MA(df['closePrice'], timeperiod=20)
ori_column.append('ma20')
pass
res_df = df.loc[:,ori_column].copy()
return res_df
结果
本文校验的数据是随机抽取的81个股票