对照通达信一些指标的Python实现

行情软件里习惯了通达信的简介,虽然很多时候还是要依赖大智慧,但平时看图形基本都是用通达信。因此在有时候做数据分析的时候,不可避免的需要再次的实现一些指标功能,所以在Python里整理了一下,写了部分的指标工具。

# 威廉指标
def williams(df, n, column='williams'):
# 100*(10日内最高价的最高值-收盘价)/(10日内最高价的最高值-10日内最低价的最低值)
for i in range(len(df)):
if i < n-1: continue
df.ix[i, column] = 100 * (df.high.values[i-n+1:i+1].max()-df.close.values[i])/(
df.high.values[i-n+1:i+1].max()-df.low.values[i-n+1:i+1].min())
return df

# 布林指标
def bollinger(df,n):
for i in range(len(df)):
if i < n-1: continue
df.ix[i, 'BOLL'] = df.close.values[i-n+1:i+1].mean()
df.ix[i, 'UB'] = df.ix[i, 'BOLL'] + 2 * numpy.std(df.close.values[i-n+1:i+1], ddof=1)
df.ix[i, 'LB'] = df.ix[i, 'BOLL'] - 2 * numpy.std(df.close.values[i-n+1:i+1], ddof=1)
return df

# 轨道线
def ene(df,n,m1,m2):
for i in range(len(df)):
if i < n-1: continue
df.ix[i, 'UPPER'] = (1+m1/100)*df.close.values[i-n+1:i+1].mean()
df.ix[i, 'LOWER'] = (1-m2/100)*df.close.values[i-n+1:i+1].mean()
df.ix[i, 'ENE'] = (df.ix[i, 'UPPER'] + df.ix[i, 'LOWER'])/2
return df

def kdj(df,n,m1,m2):
for i in range(len(df)):
if i < n-1: continue
df.ix[i, 'rsv'] = (df.close.values[i]-df.low.values[i-n+1:i+1].min()) / (df.high.values[i-n+1:i+1].max()-df.low.values[i-n+1:i+1].min())*100
df = getSMA(df,m1,1,'rsv','K')
df = getSMA(df,m2,1,'K','D')
for i in range(len(df)):
df.ix[i, 'J'] = 3*df.K.values[i] - 2*df.D.values[i]
return df

所有数据都是Dataframe类型,以时间为Index顺序排列。关于getSMA这个函数可以在本博另一帖子《

行情软件里的平均函数以及Python的实现》中可以找到。

行情软件里的平均函数以及Python的实现

在行情软件里,有很多的平均公式,一直没有深入的去了解,用得也是糊里糊涂的,现结合百度谷歌,对各种公式做个总结记录。

MA(x,n)–移动平均,是最简单的n日内的平均值;

计算公式:(X1+X2+X3+X4+…+Xn)/n

Python代码:

def getMA(df,n):
    for i in range(len(df)):
        if i >= n:
            df.ix[i,'ma'] = df.close.values[i-n:i].mean()
    return df

EMA(x,n)–指数移动平均,这个函数以相关周期为权重进行计算;

计算公式:[2*X+(n-1)*Y]/(n+1) 其中'Y'表示上一周期的Y值

例如:每天X值不同,由远到近标示分别为X1、X2、X3、X4……Xn

如果n=1,那么EMA(X,1) 则等于 [2*X1+(1-1)*Y]/(1+1)=X1

如果n=2,那么EMA(X,2) 则等于 [2*X2+(2-1)*Y]/(2+1)=(2/3)*X2+(1/3)*X1

如果n=3,那么EMA(X,3) 则等于 [2*X3+(3-1)*Y]/(3+1)

                                                  =[2*X3+2*((2/3)*X2+(1/3)*X1)]/4

                                                  =(1/2)*X3+(1/3)*X2+(1/6)*X1

以此类推,往下循环……

Python代码:

def getEMA(df,n):  
    for i in range(len(df)):  
        if i==0:  
            df.ix[i,'ema']=df.ix[i,'close']  
        if i>0:  
            df.ix[i,'ema']=(1-n)*df.ix[i-1,'close']+n*df.ix[i,'close']  
    return df

SMA(x,n,m)–简单移动平均,m为当日的权重,是个0~1之间的值;

计算公式:(X*M+Y'*(N-M))/N 其中Y表示上一周期值

SMA 就是把EMA(X,N) 中的权重2,变成了一个可自己定义的变数。要求M<N,M/N, (N-M)/N 就是一个加起来等于1的小数,于是定义动态平均值。

Python代码:

def getSMA(df,n,m):
    for i in range(len(df)):
        if i==0:
            df.ix[i,'sma'] = df.ix[i,'close']*m/n
        else:
            df.ix[i,'sma'] = [df.ix[i,'close']*m + (n-m)*df.ix[i-1,'sma']]/n
    return df

DMA(x,m)–动态移动平均,这个函数以动态设定的权重m进行计算;

计算公式:m*X+(1-m)*Y  其中Y表示上一周期值,A必须小于1

Python代码:

def getDMA(df,m):
    for i in range(len(df)):
        if i == 0:
            df.ix[i,'dma'] = df.ix[i,'close']/m
        else:
            df.ix[i,'dma'] = df.ix[i,'close']/m + (1-m)*df.ix[i-1,'dma']
    return df

TMA(x,n,m)–递归移动平均,这个函数可以完全控制当前周期的权重和上一次值的权重;

计算公示:m*X+n*Y 其中Y表示上一周期值,初值为m*X。

Python代码:

def getTMA(df,n,m):
    for i in range(len(df)):
        if i==0:
            df.ix[i,'sma'] = df.ix[i,'close']*m
        else:
            df.ix[i,'sma'] = df.ix[i,'close']*m + df.ix[i-1,'sma']*n
    return df

WMA(x,n)–加权移动平均,这个函数对于近日的权重会比其它函数敏感。

计算公式:n*X0+(n-1)*X1+(n- 2)*X2)+…+1*Xn)/(n+(n-1)+(n-2)+…+1)

X0表示本周期值,X1表示上一周期值。

Python代码:

def getWMA(df,n):
    weight = 0
    for i in range(n):
        weight += i
    for i in range(len(df)):
        if i >= n:
            sum = 0
            for j in range(n):
                 sum += (j+1)*df.ix[i-n+j,'close']
            df.ix[i,'wma'] = sum/weight

ps: 关于加权移动平均,有多个加权的计算方式,代码里的仅仅只是其中一种,如果需求不同,也可以换做其他计算方式。

1、末日加权移动平均线: 

计算公式=(C1+C2+……+Cn×2)/(n+1)

我们用C代表收盘价。末日指的是最后一日哦,可不是世界末日。我们看到只有最后一天的收盘价(Cn)乘了一个2。这样,原来的n个价格就变成了(n+1)个,所以在求的平均的时候要除以(n+1)。

2、线性加权移动平均线:

计算公式=(C1×1+C2×2+……+Cn×n)/(1+2+…+n)

这一种均线计算起来有一点点麻烦,就是计算时每个价格都乘以一个权值,这个权值刚好是它的编号。对于线性这个词,如果大家不理解,那么请继续关注慧济,以后我会为大家详细解释。

3、梯型加权移动平均线:计算方法如下(5日为例):

计算公式=((C1+C2)×1+(C2+C3)×2+(C3+C4)×3+(C4+C5)×4)/(2×1+2×2+2×3+2×4)

是不是有点像梯形的面积公式啊?梯形面积=(上底+下底)×高/2

4、平方系数加权移动平均线:计算方法如下(5日为例):

MA=((C1×1×1)+( C2×2×2)+(C3×3×3)+(C4×4×4)+( C5×5×5))/(1×1+2×2+3×3+4×4+5×5)