import talib import pandas as pd import time import numpy as np class demo: def __init__(self): print('demo 类') self.h5_path = 'Z:/data/stock_data_py' def 加载数据(self,name,var): print('正在加载数据'+self.h5_path+'/'+var+'/'+name) df = pd.read_hdf(self.h5_path + '/' + var + '/' + name + '.h5') return df def demo_run(self,strategy_name): t = time.time() # 计时开始 # 1.加载数据 stocklist=self.加载数据('stocklist','list') stocklist['codenum'] = stocklist['code'].apply(lambda x: x[:6]) closef_pd=self.加载数据('closef_pd','day') openf_pd=self.加载数据('openf_pd','day') highf_pd=self.加载数据('highf_pd','day') lowf_pd=self.加载数据('lowf_pd','day') amt_pd=self.加载数据('amt_pd','day') # 2.选股思路计算 # MACD() def MACD(): t = time.time() # 计时开始 p = (12, 26, 9) def get_macd(x): DIF, DEA, MACD= talib.MACD(x.values, p[0], p[1], p[2]) return MACD dfA = closef_pd.apply(get_macd, axis=0) print(time.time() - t) # 计时结束 npA = dfA.values.T N = 1 maxt = np.max(npA[:, -N - 5:-N-1], axis=1) ind=np.where( (np.max(npA[:, -N - 5:-N-1], axis=1) < 0) & (npA[:, -N] > 0) )[0] return ind # 可以扩展写一下其他的指标 # KDJ def KDJ(): t = time.time() # 计时开始 def get_kdj(x): ndim=x.name try: k,d=talib.STOCH(highf_pd[ndim].values,lowf_pd[ndim].values,x.values,9,3,0,3,0) j=3*d-2*k except: j=np.array( [np.nan]*len(highf_pd) ) return j dfA = closef_pd.apply(get_kdj, axis=0) print(time.time() - t) # 计时结束 npA = dfA.values.T N = 1 ind=np.where( (npA[:, -N-1] < 20) & (npA[:, -N] > 20) )[0] return ind # ind=KDJ() # RSI def RSI(): t = time.time() # 计时开始 def get_rsi(x): ndim=x.name rsi6=talib.RSI(x.values,6) rsi12=talib.RSI(x.values,12) rsi24=talib.RSI(x.values,24) rsi=rsi6-rsi12 if rsi6[-2]<50 and rsi[-2]<0 and rsi[-1]>0: return 1 else: return 0 dfA = closef_pd.apply(get_rsi, axis=0) print(time.time() - t) # 计时结束 npA = dfA.values.T N = 1 ind=np.where( npA==1 )[0] return ind # BOLL def BOLL(): t = time.time() # 计时开始 def get_rsi(x): upper, middle, lower= talib.BBANDS(x.values, 20,2,2) return x.values-upper dfA = closef_pd.apply(get_rsi, axis=0) print(time.time() - t) # 计时结束 npA = dfA.values.T N = 1 ind=np.where( (np.max(npA[:, -N - 10:-N-1], axis=1) < 0) & (npA[:, -N] > 0) )[0] return ind # TRIX def TRIX(): pass t = time.time() # 计时开始 def get_trix(x): trix_data= talib.TRIX(x.values, 12) try: trix_ma=talib.MA(trix_data,20) except: trix_ma=np.array( [np.nan]*len(x) ) return trix_data-trix_ma dfA= closef_pd.apply(get_trix, axis=0) print(time.time() - t) # 计时结束 npA = dfA.values.T N = 1 ind=np.where( (np.max(npA[:, -N - 10:-N-1], axis=1) < 0) & (npA[:, -N] > 0) )[0] return ind def 共振(): # 求交集 pass indA=TRIX() indB=MACD() indC=RSI() indD=BOLL() #数组的交集 ind=np.intersect1d(indC,indB) return ind ind=eval(strategy_name+'()') temp = ind npB = stocklist.iloc[ind] print(time.time() - t) # 计时结束 return npB if __name__=='__main__': self=demo() listMACD=self.demo_run(strategy_name='MACD') #listKDJ=self.demo_run(strategy_name='KDJ') #listRSI=self.demo_run(strategy_name='RSI') # listBOLL=self.demo_run(strategy_name='BOLL') #listTRIX=self.demo_run(strategy_name='TRIX') #list共振=self.demo_run(strategy_name='共振')