天天看點

tushare日線資料的名額計算

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()
           

調用出來效果是這樣的:

tushare日線資料的名額計算