通達信公式改寫成python代碼的最簡實現方式


MyTT

https://blog.csdn.net/u011218867/article/details/118242517

MyTT是您量化工具箱里的瑞士軍刀,精煉而高效,它將通達信,同花順,文華麥語言等指標公式indicators,最簡移植到Python中,核心庫單個文件,僅百行代碼,實現和轉換同花順通達信所有常見指標MACD,RSI,BOLL,ATR,KDJ,CCI,PSY等,全部基於numpy和pandas的函數封裝,簡潔且高性能,能非常方便的應用在各自股票股市技術分析,股票自動程序化交易,數字貨幣BTC等量化等領域

功能特點
核心庫輕量化: 項目庫就一個文件MyTT.py,不用安裝,不用設置,隨用隨走 ( from MyTT import * 即可 )

代碼人類化:) 沒有什么炫耀的編程花樣,初學者也能看懂,自己就能自行增加指標,馬上就能用在項目中。

不需要安裝ta-lib庫,是純python代碼實現的的核心邏輯,很多人都有安裝ta-lib庫的痛苦經歷

和通達信,同花順的指標寫法完全兼容,一個新的指標基本不用做修改,直接拿來即可使用

超高性能,基本不用循環,全是靠numpy,pandas的內置函數實現各種指標

和Talib庫一樣是多天參數進,多天指標出(序列進,序列出),便於畫圖和觀察趨勢

MyTT實現的各種指標和通達信,同花順,雪球等軟件的技術指標一致到小數點后2位
————————————————

#股市行情數據獲取和作圖 -2
from  Ashare import *          #股票數據庫    https://github.com/mpquant/Ashare
from  MyTT import *            #myTT麥語言工具函數指標庫  https://github.com/mpquant/MyTT
    
# 證券代碼兼容多種格式 通達信,同花順,聚寬
# sh000001 (000001.XSHG)    sz399006 (399006.XSHE)   sh600519 ( 600519.XSHG ) 

df=get_price('000001.XSHG',frequency='1d',count=120)      #獲取今天往前120天的日線實時行情
print('上證指數日線行情\n',df.tail(5))

#-------有數據了,下面開始正題 -------------
CLOSE=df.close.values;         OPEN=df.open.values       #基礎數據定義,只要傳入的是序列都可以 
HIGH=df.high.values;           LOW=df.low.values         #例如  CLOSE=list(df.close) 都是一樣     

MA5=MA(CLOSE,5)                                #獲取5日均線序列
MA10=MA(CLOSE,10)                              #獲取10日均線序列
up,mid,lower=BOLL(CLOSE)                       #獲取布林帶指標數據

print('BTC5日均線', MA5[-1] )                          # 只取最后一個數   
print('BTC10日均線',RET(MA10))                         # RET(MA10) == MA10[-1]
print('今天5日線是否上穿10日線',RET(CROSS(MA5,MA10)))
print('最近5天收盤價全都大於10日線嗎?',EVERY(CLOSE>MA10,5) )
#上證指數日線行情----------------------------------------------------
              open    close     high      low       volume
2021-06-07  3597.14  3599.54  3600.38  3581.90  303718677.0
2021-06-08  3598.75  3580.11  3621.52  3563.25  304491470.0
2021-06-09  3576.80  3591.40  3598.71  3572.64  298323296.0
2021-06-10  3587.53  3610.86  3624.34  3584.13  318174808.0
2021-06-11  3614.11  3589.75  3614.40  3587.15  360554970.0


#貴州茅台60分鍾線----------------------------------------------------
                       open    close     high      low    volume
2021-06-10 14:00:00  2237.00  2224.16  2245.00  2222.00   4541.53
2021-06-10 15:00:00  2222.21  2238.48  2240.34  2222.21   4146.88
2021-06-11 10:30:00  2239.00  2220.00  2244.00  2197.86  12030.00
2021-06-11 11:30:00  2220.01  2210.18  2231.80  2200.18   4868.00
2021-06-11 14:00:00  2210.10  2223.35  2224.48  2206.01   4544.00
2021-06-11 15:00:00  2223.33  2178.81  2226.80  2178.81  12529.00

MyTT庫中的部分工具函數

#------------------ 0級:核心工具函數 --------------------------------------------      
def RD(N,D=3):   return np.round(N,D)        #四舍五入取3位小數 
def RET(S,N=1):  return np.array(S)[-N]      #返回序列倒數第N個值,默認返回最后一個
def ABS(S):      return np.abs(S)            #返回N的絕對值
def MAX(S1,S2):  return np.maximum(S1,S2)    #序列max
def MIN(S1,S2):  return np.minimum(S1,S2)    #序列min
         
def MA(S,N):           #求序列的N日平均值,返回序列                    
    return pd.Series(S).rolling(N).mean().values     # pd.rolling_mean(S,N)  (Python2)

def REF(S, N=1):       #對序列整體下移動N,返回序列(shift后會產生NAN)    
    return pd.Series(S).shift(N).values  

def DIFF(S, N=1):      #前一個值減后一個值,前面會產生nan 
    return pd.Series(S).diff(N)  #np.diff(S)直接刪除nan,會少一行

def STD(S,N):           #求序列的N日標准差,返回序列    
    return  pd.Series(S).rolling(N).std(ddof=0).values     

def IF(S_BOOL,S_TRUE,S_FALSE):          #序列布爾判斷 res=S_TRUE if S_BOOL==True  else  S_FALSE
    return np.where(S_BOOL, S_TRUE, S_FALSE)

def SUM(S, N):            #對序列求N天累計和,返回序列    N=0對序列所有依次求和         
    return pd.Series(S).rolling(N).sum().values if N>0 else pd.Series(S).cumsum()    #pd.rolling_sum(S,N)  (Python2)

def HHV(S,N):             # HHV(C, 5)  # 最近5天收盤最高價        
    return pd.Series(S).rolling(N).max().values      # pd.rolling_max(S,N)  (Python2)

def LLV(S,N):             # LLV(C, 5)  # 最近5天收盤最低價     
    return pd.Series(S).rolling(N).min().values      # pd.rolling_min(S,N)  (Python2)

def EMA(S,N):             #指數移動平均,為了精度 S>4*N  EMA至少需要120周期       
    return pd.Series(S).ewm(span=N, adjust=False).mean().values    

def SMA(S, N, M=1):        #中國式的SMA,至少需要120周期才精確 (雪球180周期)    alpha=1/(1+com)
    return pd.Series(S).ewm(com=N-M, adjust=True).mean().values     

def AVEDEV(S,N):           #平均絕對偏差  (序列與其平均值的絕對差的平均值)   
    avedev=pd.Series(S).rolling(N).apply(lambda x: (np.abs(x - x.mean())).mean())    
    return avedev.values

def SLOPE(S,N,RS=False):    #返S序列N周期回線性回歸斜率 (默認只返回斜率,不返回整個直線序列)
    M=pd.Series(S[-N:]);   poly = np.polyfit(M.index, M.values,deg=1);    Y=np.polyval(poly, M.index); 
    if RS: return Y[1]-Y[0],Y
    return Y[1]-Y[0]

已經實現的技術指標,基本涵蓋了絕大多數常用指標

#------------------   2級:技術指標函數(全部通過0級,1級函數實現) ------------------------------
def MACD(CLOSE,SHORT=12,LONG=26,M=9):            # EMA的關系,S取120日,和雪球小數點2位相同
    DIF = EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);  
    DEA = EMA(DIF,M);      MACD=(DIF-DEA)*2
    return RD(DIF),RD(DEA),RD(MACD)

def KDJ(CLOSE,HIGH,LOW, N=9,M1=3,M2=3):         # KDJ指標
    RSV = (CLOSE - LLV(LOW, N)) / (HHV(HIGH, N) - LLV(LOW, N)) * 100
    K = EMA(RSV, (M1*2-1));    D = EMA(K,(M2*2-1));        J=K*3-D*2
    return K, D, J

def RSI(CLOSE, N=24):      
    DIF = CLOSE-REF(CLOSE,1) 
    return RD(SMA(MAX(DIF,0), N) / SMA(ABS(DIF), N) * 100)  

def WR(CLOSE, HIGH, LOW, N=10, N1=6):            #W&R 威廉指標
    WR = (HHV(HIGH, N) - CLOSE) / (HHV(HIGH, N) - LLV(LOW, N)) * 100
    WR1 = (HHV(HIGH, N1) - CLOSE) / (HHV(HIGH, N1) - LLV(LOW, N1)) * 100
    return RD(WR), RD(WR1)

def BIAS(CLOSE,L1=6, L2=12, L3=24):              # BIAS乖離率
    BIAS1 = (CLOSE - MA(CLOSE, L1)) / MA(CLOSE, L1) * 100
    BIAS2 = (CLOSE - MA(CLOSE, L2)) / MA(CLOSE, L2) * 100
    BIAS3 = (CLOSE - MA(CLOSE, L3)) / MA(CLOSE, L3) * 100
    return RD(BIAS1), RD(BIAS2), RD(BIAS3)

def BOLL(CLOSE,N=20, P=2):                       #BOLL指標,布林帶    
    MID = MA(CLOSE, N); 
    UPPER = MID + STD(CLOSE, N) * P
    LOWER = MID - STD(CLOSE, N) * P
    return RD(UPPER), RD(MID), RD(LOWER)    

def PSY(CLOSE,N=12, M=6):  
    PSY=COUNT(CLOSE>REF(CLOSE,1),N)/N*100
    PSYMA=MA(PSY,M)
    return RD(PSY),RD(PSYMA)

def CCI(CLOSE,HIGH,LOW,N=14):  
    TP=(HIGH+LOW+CLOSE)/3
    return (TP-MA(TP,N))/(0.015*AVEDEV(TP,N))
        
def ATR(CLOSE,HIGH,LOW, N=20):                    #真實波動N日平均值
    TR = MAX(MAX((HIGH - LOW), ABS(REF(CLOSE, 1) - HIGH)), ABS(REF(CLOSE, 1) - LOW))
    return MA(TR, N)

def BBI(CLOSE,M1=3,M2=6,M3=12,M4=20):             #BBI多空指標   
    return (MA(CLOSE,M1)+MA(CLOSE,M2)+MA(CLOSE,M3)+MA(CLOSE,M4))/4    

def DMI(CLOSE,HIGH,LOW,M1=14,M2=6):               #動向指標:結果和同花順,通達信完全一致
    TR = SUM(MAX(MAX(HIGH - LOW, ABS(HIGH - REF(CLOSE, 1))), ABS(LOW - REF(CLOSE, 1))), M1)
    HD = HIGH - REF(HIGH, 1);     LD = REF(LOW, 1) - LOW
    DMP = SUM(IF((HD > 0) & (HD > LD), HD, 0), M1)
    DMM = SUM(IF((LD > 0) & (LD > HD), LD, 0), M1)
    PDI = DMP * 100 / TR;         MDI = DMM * 100 / TR
    ADX = MA(ABS(MDI - PDI) / (PDI + MDI) * 100, M2)
    ADXR = (ADX + REF(ADX, M2)) / 2
    return PDI, MDI, ADX, ADXR  

def TAQ(HIGH,LOW,N):                               #唐安奇通道(海龜)交易指標,大道至簡,能穿越牛熊
    UP=HHV(HIGH,N);    DOWN=LLV(LOW,N);    MID=(UP+DOWN)/2
    return UP,MID,DOWN

def KTN(CLOSE,HIGH,LOW,N=20,M=10):                 #肯特納交易通道, N選20日,ATR選10日
    MID=EMA((HIGH+LOW+CLOSE)/3,N)
    ATRN=ATR(CLOSE,HIGH,LOW,M)
    UPPER=MID+2*ATRN;   LOWER=MID-2*ATRN
    return UPPER,MID,LOWER       
  
def TRIX(CLOSE,M1=12, M2=20):                      #三重指數平滑平均線
    TR = EMA(EMA(EMA(CLOSE, M1), M1), M1)
    TRIX = (TR - REF(TR, 1)) / REF(TR, 1) * 100
    TRMA = MA(TRIX, M2)
    return TRIX, TRMA

def VR(CLOSE,VOL,M1=26):                            #VR容量比率
    LC = REF(CLOSE, 1)
    return SUM(IF(CLOSE > LC, VOL, 0), M1) / SUM(IF(CLOSE <= LC, VOL, 0), M1) * 100

def EMV(HIGH,LOW,VOL,N=14,M=9):                     #簡易波動指標 
    VOLUME=MA(VOL,N)/VOL;       MID=100*(HIGH+LOW-REF(HIGH+LOW,1))/(HIGH+LOW)
    EMV=MA(MID*VOLUME*(HIGH-LOW)/MA(HIGH-LOW,N),N);    MAEMV=MA(EMV,M)
    return EMV,MAEMV


def DPO(CLOSE,M1=20, M2=10, M3=6):                  #區間震盪線
    DPO = CLOSE - REF(MA(CLOSE, M1), M2);    MADPO = MA(DPO, M3)
    return DPO, MADPO

def BRAR(OPEN,CLOSE,HIGH,LOW,M1=26):                 #BRAR-ARBR 情緒指標  
    AR = SUM(HIGH - OPEN, M1) / SUM(OPEN - LOW, M1) * 100
    BR = SUM(MAX(0, HIGH - REF(CLOSE, 1)), M1) / SUM(MAX(0, REF(CLOSE, 1) - LOW), M1) * 100
    return AR, BR

def DMA(CLOSE,N1=10,N2=50,M=10):                     #平行線差指標  
    DIF=MA(CLOSE,N1)-MA(CLOSE,N2);    DIFMA=MA(DIF,M)
    return DIF,DIFMA

def MTM(CLOSE,N=12,M=6):                             #動量指標
    MTM=CLOSE-REF(CLOSE,N);         MTMMA=MA(MTM,M)
    return MTM,MTMMA

def MASS(HIGH,LOW,N1=9,N2=25,M=6):                   # 梅斯線
    MASS=SUM(MA(HIGH-LOW,N1)/MA(MA(HIGH-LOW,N1),N1),N2)
    MA_MASS=MA(MASS,M)
    return MASS,MA_MASS
  
def ROC(CLOSE,N=12,M=6):                             #變動率指標
    ROC=100*(CLOSE-REF(CLOSE,N))/REF(CLOSE,N);    MAROC=MA(ROC,M)
    return ROC,MAROC  

def EXPMA(CLOSE,N1=12,N2=50):                        #EMA指數平均數指標
    return EMA(CLOSE,N1),EMA(CLOSE,N2);

def OBV(CLOSE,VOL):                                  #能量潮指標
    return SUM(IF(CLOSE>REF(CLOSE,1),VOL,IF(CLOSE<REF(CLOSE,1),-VOL,0)),0)/10000

def ASI(OPEN,CLOSE,HIGH,LOW,M1=26,M2=10):            #振動升降指標
    LC=REF(CLOSE,1);      AA=ABS(HIGH-LC);     BB=ABS(LOW-LC);
    CC=ABS(HIGH-REF(LOW,1));   DD=ABS(LC-REF(OPEN,1));
    R=IF( (AA>BB) & (AA>CC),AA+BB/2+DD/4,IF( (BB>CC) & (BB>AA),BB+AA/2+DD/4,CC+DD/4));
    X=(CLOSE-LC+(CLOSE-OPEN)/2+LC-REF(OPEN,1));
    SI=16*X/R*MAX(AA,BB);   ASI=SUM(SI,M1);   ASIT=MA(ASI,M2);
    return ASI,ASIT   

  
  #望大家能提交更多指標和函數  https://github.com/mpquant/MyTT

BOLL帶指標數據獲取和做圖演示 (上證綜指)

up,mid,lower=BOLL(CLOSE)                                        #獲取布林帶數據 

plt.figure(figsize=(15,8))  
plt.plot(CLOSE,label='上證');    plt.plot(up,label='up');        #畫圖顯示 
plt.plot(mid,label='mid');      plt.plot(lower,label='lower');

 

 

需安裝第三方庫(無需ta-lib庫,所有指標實現僅需要安裝pandas既可)

  • pandas

目前項目已經開源:

https://github.com/mpquant/MyTT

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM