最近在看乐学偶得(公众号:乐学Fintech)William老师讲的Python系列与量化交易的内容,公众号干货很多,一遍搬运一遍在这里做笔记记录一下,方便以后复习:
之前跟大家分享过用Python调用talib实现技术指标分析,但是许多小伙伴有更高的需求:比如需要指标自定义,或者想明白技术分析背后的原理。所以,这一期我们跟大家分享一下通过纯Python+Pandas+Numpy+Math实现talib中的常见指标,是学习底层算法与自定义交易指标,提升内功的非常好的材料。
我们需要的库非常简单,只需要这三个:
import numpy
from pandas import *
from math import *
*关于pandas版本的问题,我们视频中跟大家分享过,注意以下用法需要pandas的版本为0.21,若报ewma无法调用的错误,可以指定安装此版本的pandas,或者通过
pandas.DataFrame(ts).ewm(span=12).mean()
这样调用的方法解决。
1.移动平均
def MA(df, n):
MA = Series(rolling_mean(df['Close'], n), name = 'MA_' + str(n))
df = df.join(MA)
return df
2.指数移动平均
def EMA(df, n):
EMA = Series(ewma(df['Close'], span = n, min_periods = n - 1), name = 'EMA_' + str(n))
df = df.join(EMA)
return df
3.动量
def MOM(df, n):
M = Series(df['Close'].diff(n), name = 'Momentum_' + str(n))
df = df.join(M)
return df
4.变化率
def ROC(df, n):
M = df['Close'].diff(n - 1)
N = df['Close'].shift(n - 1)
ROC = Series(M / N, name = 'ROC_' + str(n))
df = df.join(ROC)
return df
5.均幅指标
def ATR(df, n):
i = 0
TR_l = [0]
while i < df.index[-1]:
TR = max(df.get_value(i + 1, 'High'), df.get_value(i, 'Close')) - min(df.get_value(i + 1, 'Low'), df.get_value(i, 'Close'))
TR_l.append(TR)
i = i + 1
TR_s = Series(TR_l)
ATR = Series(ewma(TR_s, span = n, min_periods = n), name = 'ATR_' + str(n))
df = df.join(ATR)
return df
6.布林线
def BBANDS(df, n):
MA = Series(rolling_mean(df['Close'], n))
MSD = Series(rolling_std(df['Close'], n))
b1 = 4 * MSD / MA
B1 = Series(b1, name = 'BollingerB_' + str(n))
df = df.join(B1)
b2 = (df['Close'] - MA + 2 * MSD) / (4 * MSD)
B2 = Series(b2, name = 'Bollinger%b_' + str(n))
df = df.join(B2)
return df
7.转折、支撑、阻力点
def PPSR(df):
PP = Series((df['High'] + df['Low'] + df['Close']) / 3)
R1 = Series(2 * PP - df['Low'])
S1 = Series(2 * PP - df['High'])
R2 = Series(PP + df['High'] - df['Low'])
S2 = Series(PP - df['High'] + df['Low'])
R3 = Series(df['High'] + 2 * (PP - df['Low']))
S3 = Series(df['Low'] - 2 * (df['High'] - PP))
psr = {'PP':PP, 'R1':R1, 'S1':S1, 'R2':R2, 'S