龙听期货论坛's Archiver

龙听 发表于 2021-11-1 19:21

通达信,同花顺中国式SMA指标,EMA指数平均,MACD,RSI的最简python代码实现

通达信,同花顺指标中的中国式SMA,EMA的python实现

同花顺,通达信指标计算有个非常重要的函数SMA,和EMA,下面仅仅用python库panadas和numpy的内置函数实现

[code]
import numpy as np; import pandas as pd

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周期才精确        
    K = pd.Series(S).rolling(N).mean()    #先求出平均值
    for i in range(N+1, len(S)):  K[i] = (M * S[i] + (N -M) * K[i-1]) / N  # 因为要取K[i-1],所以 range(N+1, len(S))        
    return K[/code]


EMA实现的很成功,pandas内置函数,速度快,SMA需要循环才能实现,不是最优的解决方案,下面采用pandas的内置函数来实现!

[code]def SMA(S, N, M=1):        # 1)高效的方法
    return pd.Series(S).ewm(alpha=M/N, adjust=True).mean().values  

def SMA(S, N, M=1):        # 2)高效写法2
    return pd.Series(S).ewm(com=N-M, adjust=True).mean().values  

def SMA(S, N, M=1):        # 3)高效写法3
    return pd.Series(S).ewm(span=2N/M-1, adjust=True).mean().values  

def SMA(S, N, M=1):        # 4)python2的pandas没有ewm,用ewma实现
    return pd.ewma(S,com=N-M,adjust=True)  

#以上4种写法得到的数值是一样的[/code]


有了这两个关键函数,就可以用它们构造出MACD指标和RSI指标,代码非常简单

[code]
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 DIF,DEA,MACD
   
def RSI(CLOSE, N=24):      
    DIF = CLOSE-REF(CLOSE,1)
    return SMA(MAX(DIF,0), N) / SMA(ABS(DIF), N) * 100   [/code]


以上函数实现的macd,rsi指标和雪球,同花顺,通达信等软件对照完全一致

坦克 发表于 2021-11-9 23:24

very good

依力哈木艾买尔 发表于 2024-2-5 15:08

感謝分享

页: [1]