tushare日線資料的名額計算
Tushare是一個免費、開源的python财經資料接口包。主要實作對股票等金融資料從資料采集、清洗加工 到 資料存儲的過程,能夠為金融分析人員提供快速、整潔、和多樣的便于分析的資料,為他們在資料擷取方面極大地減輕工作量,使他們更加專注于政策和模型的研究與實作上。考慮到Python pandas包在金融量化分析中展現出的優勢,Tushare傳回的絕大部分的資料格式都是pandas DataFrame類型,非常便于用pandas/NumPy/Matplotlib進行資料分析和可視化。
注冊一個tushare賬号,到這裡注冊:https://tushare.pro/register?reg=350968
上一篇降到,日線資料的下載下傳儲存後,可以根據不同的周期進行讀取,咱們封裝了周,月,季度,半年和年度的擷取資料的接口,
def getGpDailyInfo_Week(conn, gpCode = ‘’, endDate = dt.datetime.today().strftime(’%Y-%m-%d’)):
def getGpDailyInfo_Month(conn, gpCode = ‘’, endDate = dt.datetime.today().strftime(’%Y-%m-%d’)):
#擷取季度的日線資料
def getGpDailyInfo_Quarter(conn, gpCode = ‘’, endDate = dt.datetime.today().strftime(’%Y-%m-%d’)):
#擷取半年的日線資料
def getGpDailyInfo_HalfYear(conn, gpCode = ‘’, endDate = dt.datetime.today().strftime(’%Y-%m-%d’)):
#擷取一年的日線資料
def getGpDailyInfo_Year(conn, gpCode = ‘’, endDate = dt.datetime.today().strftime(’%Y-%m-%d’)):
還有一個通用的擷取日線資料接口:
def getGpDailyInfo(conn, gpCode = ‘’, stDate = ‘1990-12-19’, endDate = dt.datetime.today().strftime(’%Y-%m-%d’)):
這些擷取日線行情資料的封裝接口,最後都會傳回一個Pandas Dataframe,咱們就用Dataframe進行分析操作。
一般來說,日線行情資料有一些重要的名額,一是均線名額,二是MACD名額,三是DKX名額,另外,根據均線還有均線空頭排列,多頭排列等。
如果要計算MACD名額,就要用到EMA函數,這個函數的計算是一個數學期望值的計算,函數定義如下:
#定義EMA
def get_EMA(cps, days):
ar_EMA = cps.copy()
for cnt in range(len(cps)):
if cnt == 0:
ar_EMA[cnt] = cps[cnt]
else:
ar_EMA[cnt] = (ar_EMA[cnt-1]*(days-1)+2*cps[cnt])/(days+1)
return ar_EMA
EMA函數是一個數學期望公式的計算,具體什麼原理大家自行百度,不口水。
有了EMA之後,就可以進行MACD的計算了:
#定義MACD
def macd(df, short = 12, long = 26, mid = 9):
# 首先計算DIF
c = df.close
dif = get_EMA(c, short) - get_EMA(c, long)
dea = get_EMA(dif, mid)
macd = 2*(dif - dea)
return dif, dea, macd
還可以計算多空線:
#定義多空線名額
def dkx(df, m=10):
mid = (df.close*3+df.open+df.high+df.low)/6
dkx = (mid*20 + 19*mid.shift(1)+ 18*mid.shift(2)+ 17*mid.shift(3) + 16*mid.shift(4) \
+ 15 * mid.shift(5) + 14*mid.shift(6)+ 13*mid.shift(7) + 12*mid.shift(8) + 11*mid.shift(9) \
+ 10 * mid.shift(10)+ 9*mid.shift(11)+ 8*mid.shift(12)+ 7*mid.shift(13)+ 6*mid.shift(14) \
+ 5 * mid.shift(15)+ 4*mid.shift(16)+ 3*mid.shift(17)+ 2*mid.shift(18)+ mid.shift(20))/210
madkx = dkx.rolling(m).mean()
return dkx, madkx
有了這兩個名額計算後,就可以定義一個名額計算函數了:
#計算收盤均價MA5,MA10,MA20,MA30,MA60,MA120
def calMAIndex(df):
#均線處理
MA5 = df.close.rolling(5).mean()
MA10 = df.close.rolling(10).mean()
MA20 = df.close.rolling(20).mean()
MA21 = df.close.rolling(21).mean()
MA30 = df.close.rolling(30).mean()
MA34 = df.close.rolling(34).mean()
MA60 = df.close.rolling(60).mean()
MA89 = df.close.rolling(89).mean()
MA120= df.close.rolling(120).mean()
MA144 = df.close.rolling(144).mean()
MA250 = df.close.rolling(250).mean()
d_MA=pd.DataFrame()
d_MA['MA5'] = MA5[:]
d_MA['MA10'] = MA10[:]
d_MA['MA20'] = MA20[:]
d_MA['MA21'] = MA21[:]
d_MA['MA30'] = MA30[:]
d_MA['MA34'] = MA34[:]
d_MA['MA60'] = MA60[:]
d_MA['MA89'] = MA89[:]
d_MA['MA120'] = MA120[:]
d_MA['MA144'] = MA144[:]
d_MA['MA250'] = MA250[:]
d_MA.index = df.index
initVal_kt = [False] * df.ts_code.count()
initVal_dt = [False] * df.ts_code.count()
initVal_kf = [False] * df.ts_code.count()
initVal_dh = [False] * df.ts_code.count()
for i in range(0, df.ts_code.count()):
#空頭市場标志
initVal_kt[i] = MA5[i] < MA10[i] and MA10[i] < MA20[i] and MA20[i] < MA30[i] and MA30[i] < MA60[i]
#多頭市場标志
initVal_dt[i] = MA5[i] > MA10[i] and MA10[i] > MA20[i] and MA20[i] > MA30[i] and MA30[i] > MA60[i]
#空頭反彈
initVal_kf[i] = MA30[i] < MA60[i] and MA5[i] > MA30[i]
#多頭回調标志
initVal_dh[i] = MA30[i] > MA60[i] and MA5[i] < MA30[i]
d_MA['iskt'] = initVal_kt
d_MA['isdt'] = initVal_dt
d_MA['ktft'] = initVal_kf
d_MA['dtht'] = initVal_dh
#多空線名額
mid = (3*df.close + df.high + df.open + df.low)/6
d_MA['mid'] = mid
#計算MACD名額,并放入df中
dif,dea,macd = zb.macd(df)
d_MA['dif'] = dif
d_MA['dea'] = dea
d_MA['macd']= macd
#計算dkx名額,并放入df中
dkx, madkx = dkx(df, 10)
d_MA['dkx'] = dkx
d_MA['madkx'] = madkx
return
這樣,在整個Dataframe中,咱們就有了各周期的均線,還有均線多頭排列标志,空頭排列标志,以及MACD,DKX等名額。
可以用一個主函數調用來看一下效果:
#入口主函數
def main():
conn, cursor = init_cursor()
gpc = "000001.sz"
df1 = getGpDailyInfo(conn, gpc, stDate='2020-07-01')
close_conn(conn, cursor)
df2 = CalRet.calMAIndex(df1)
df = df1.join(df2)
df.set_index(keys = 'trade_date')
plt.style.use('seaborn-darkgrid')#設定畫風
plt.rc('font', family='SimHei', size=6)
plt.rc('figure', figsize=(4,3),dpi=200)
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
df[['dif', 'dea']].plot(kind='line', subplots=False, sharex=True, sharey=True, layout=(1, 1),figsize=(10, 8), title=u'MACD名額', grid=True, fontsize=13)
if __name__ == '__main__':
main()
調用出來效果是這樣的: