量化工具TA-Lib 使用例子


转发自:http://30daydo.com/article/196

TA-Lib主要用来计算一些股市中常见的指标。 比如MACD,BOLL,均线等参数。  

#-*-coding=utf-8-*- 
import Tkinter as tk 
from Tkinter import * 
import ttk 
import matplotlib.pyplot as plt 
 
import numpy as np 
import talib as ta 
 
series = np.random.choice([1, -1], size=200) 
close = np.cumsum(series).astype(float) 
 
# 重叠指标 
def overlap_process(event): 
    print(event.widget.get()) 
    overlap = event.widget.get() 
 
    upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0) 
    fig, axes = plt.subplots(2, 1, sharex=True) 
    ax1, ax2 = axes[0], axes[1] 
    axes[0].plot(close, '', markersize=3) 
    axes[0].plot(upperband, '') 
    axes[0].plot(middleband, '') 
    axes[0].plot(lowerband, '') 
    axes[0].set_title(overlap, fontproperties="SimHei") 
 
    if overlap == '布林线': 
        pass 
    elif overlap == '双指数移动平均线': 
        real = ta.DEMA(close, timeperiod=30) 
        axes[1].plot(real, '') 
    elif overlap == '指数移动平均线 ': 
        real = ta.EMA(close, timeperiod=30) 
        axes[1].plot(real, '') 
    elif overlap == '希尔伯特变换——瞬时趋势线': 
        real = ta.HT_TRENDLINE(close) 
        axes[1].plot(real, '') 
    elif overlap == '考夫曼自适应移动平均线': 
        real = ta.KAMA(close, timeperiod=30) 
        axes[1].plot(real, '') 
    elif overlap == '移动平均线': 
        real = ta.MA(close, timeperiod=30, matype=0) 
        axes[1].plot(real, '') 
    elif overlap == 'MESA自适应移动平均': 
        mama, fama = ta.MAMA(close, fastlimit=0, slowlimit=0) 
        axes[1].plot(mama, '') 
        axes[1].plot(fama, '') 
    elif overlap == '变周期移动平均线': 
        real = ta.MAVP(close, periods, minperiod=2, maxperiod=30, matype=0) 
        axes[1].plot(real, '') 
    elif overlap == '简单移动平均线': 
        real = ta.SMA(close, timeperiod=30) 
        axes[1].plot(real, '') 
    elif overlap == '三指数移动平均线(T3)': 
        real = ta.T3(close, timeperiod=5, vfactor=0) 
        axes[1].plot(real, '') 
    elif overlap == '三指数移动平均线': 
        real = ta.TEMA(close, timeperiod=30) 
        axes[1].plot(real, '') 
    elif overlap == '三角形加权法 ': 
        real = ta.TRIMA(close, timeperiod=30) 
        axes[1].plot(real, '') 
    elif overlap == '加权移动平均数': 
        real = ta.WMA(close, timeperiod=30) 
        axes[1].plot(real, '') 
    plt.show() 
 
# 动量指标 
def momentum_process(event): 
    print(event.widget.get()) 
    momentum = event.widget.get() 
 
    upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0) 
    fig, axes = plt.subplots(2, 1, sharex=True) 
    ax1, ax2 = axes[0], axes[1] 
    axes[0].plot(close, '', markersize=3) 
    axes[0].plot(upperband, '') 
    axes[0].plot(middleband, '') 
    axes[0].plot(lowerband, '') 
    axes[0].set_title(momentum, fontproperties="SimHei") 
 
    if momentum == '绝对价格振荡器': 
        real = ta.APO(close, fastperiod=12, slowperiod=26, matype=0) 
        axes[1].plot(real, '') 
    elif momentum == '钱德动量摆动指标': 
        real = ta.CMO(close, timeperiod=14) 
        axes[1].plot(real, '') 
    elif momentum == '移动平均收敛/散度': 
        macd, macdsignal, macdhist = ta.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9) 
        axes[1].plot(macd, '') 
        axes[1].plot(macdsignal, '') 
        axes[1].plot(macdhist, '') 
    elif momentum == '带可控MA类型的MACD': 
        macd, macdsignal, macdhist = ta.MACDEXT(close, fastperiod=12, fastmatype=0, slowperiod=26, slowmatype=0, signalperiod=9, signalmatype=0) 
        axes[1].plot(macd, '') 
        axes[1].plot(macdsignal, '') 
        axes[1].plot(macdhist, '') 
    elif momentum == '移动平均收敛/散度 固定 12/26': 
        macd, macdsignal, macdhist = ta.MACDFIX(close, signalperiod=9) 
        axes[1].plot(macd, '') 
        axes[1].plot(macdsignal, '') 
        axes[1].plot(macdhist, '') 
    elif momentum == '动量': 
        real = ta.MOM(close, timeperiod=10) 
        axes[1].plot(real, '') 
    elif momentum == '比例价格振荡器': 
        real = ta.PPO(close, fastperiod=12, slowperiod=26, matype=0) 
        axes[1].plot(real, '') 
    elif momentum == '变化率': 
        real = ta.ROC(close, timeperiod=10) 
        axes[1].plot(real, '') 
    elif momentum == '变化率百分比': 
        real = ta.ROCP(close, timeperiod=10) 
        axes[1].plot(real, '') 
    elif momentum == '变化率的比率': 
        real = ta.ROCR(close, timeperiod=10) 
        axes[1].plot(real, '') 
    elif momentum == '变化率的比率100倍': 
        real = ta.ROCR100(close, timeperiod=10) 
        axes[1].plot(real, '') 
    elif momentum == '相对强弱指数': 
        real = ta.RSI(close, timeperiod=14) 
        axes[1].plot(real, '') 
    elif momentum == '随机相对强弱指标': 
        fastk, fastd = ta.STOCHRSI(close, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0) 
        axes[1].plot(fastk, '') 
        axes[1].plot(fastd, '') 
    elif momentum == '三重光滑EMA的日变化率': 
        real = ta.TRIX(close, timeperiod=30) 
        axes[1].plot(real, '') 
 
    plt.show() 
 
# 周期指标 
def cycle_process(event): 
    print(event.widget.get()) 
    cycle = event.widget.get() 
 
    upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0) 
    fig, axes = plt.subplots(2, 1, sharex=True) 
    ax1, ax2 = axes[0], axes[1] 
    axes[0].plot(close, '', markersize=3) 
    axes[0].plot(upperband, '') 
    axes[0].plot(middleband, '') 
    axes[0].plot(lowerband, '') 
    axes[0].set_title(cycle, fontproperties="SimHei") 
 
    if cycle == '希尔伯特变换——主要的循环周期': 
        real = ta.HT_DCPERIOD(close) 
        axes[1].plot(real, '') 
    elif cycle == '希尔伯特变换,占主导地位的周期阶段': 
        real = ta.HT_DCPHASE(close) 
        axes[1].plot(real, '') 
    elif cycle == '希尔伯特变换——相量组件': 
        inphase, quadrature = ta.HT_PHASOR(close) 
        axes[1].plot(inphase, '') 
        axes[1].plot(quadrature, '') 
    elif cycle == '希尔伯特变换——正弦曲线': 
        sine, leadsine = ta.HT_SINE(close) 
        axes[1].plot(sine, '') 
        axes[1].plot(leadsine, '') 
    elif cycle == '希尔伯特变换——趋势和周期模式': 
        integer = ta.HT_TRENDMODE(close) 
        axes[1].plot(integer, '') 
 
    plt.show() 
 
 
# 统计功能 
def statistic_process(event): 
    print(event.widget.get()) 
    statistic = event.widget.get() 
 
    upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0) 
    fig, axes = plt.subplots(2, 1, sharex=True) 
    ax1, ax2 = axes[0], axes[1] 
    axes[0].plot(close, '', markersize=3) 
    axes[0].plot(upperband, '') 
    axes[0].plot(middleband, '') 
    axes[0].plot(lowerband, '') 
    axes[0].set_title(statistic, fontproperties="SimHei") 
 
    if statistic == '线性回归': 
        real = ta.LINEARREG(close, timeperiod=14) 
        axes[1].plot(real, '') 
    elif statistic == '线性回归角度': 
        real = ta.LINEARREG_ANGLE(close, timeperiod=14) 
        axes[1].plot(real, '') 
    elif statistic == '线性回归截距': 
        real = ta.LINEARREG_INTERCEPT(close, timeperiod=14) 
        axes[1].plot(real, '') 
    elif statistic == '线性回归斜率': 
        real = ta.LINEARREG_SLOPE(close, timeperiod=14) 
        axes[1].plot(real, '') 
    elif statistic == '标准差': 
        real = ta.STDDEV(close, timeperiod=5, nbdev=1) 
        axes[1].plot(real, '') 
    elif statistic == '时间序列预测': 
        real = ta.TSF(close, timeperiod=14) 
        axes[1].plot(real, '') 
    elif statistic == '方差': 
        real = ta.VAR(close, timeperiod=5, nbdev=1) 
        axes[1].plot(real, '') 
 
    plt.show() 
 
 
# 数学变换 
def math_transform_process(event): 
    print(event.widget.get()) 
    math_transform = event.widget.get() 
 
    upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0) 
    fig, axes = plt.subplots(2, 1, sharex=True) 
    ax1, ax2 = axes[0], axes[1] 
    axes[0].plot(close, '', markersize=3) 
    axes[0].plot(upperband, '') 
    axes[0].plot(middleband, '') 
    axes[0].plot(lowerband, '') 
    axes[0].set_title(math_transform, fontproperties="SimHei") 
 
 
    if math_transform == '反余弦': 
        real = ta.ACOS(close) 
        axes[1].plot(real, '') 
    elif math_transform == '反正弦': 
        real = ta.ASIN(close) 
        axes[1].plot(real, '') 
    elif math_transform == '反正切': 
        real = ta.ATAN(close) 
        axes[1].plot(real, '') 
    elif math_transform == '向上取整': 
        real = ta.CEIL(close) 
        axes[1].plot(real, '') 
    elif math_transform == '余弦': 
        real = ta.COS(close) 
        axes[1].plot(real, '') 
    elif math_transform == '双曲余弦': 
        real = ta.COSH(close) 
        axes[1].plot(real, '') 
    elif math_transform == '指数': 
        real = ta.EXP(close) 
        axes[1].plot(real, '') 
    elif math_transform == '向下取整': 
        real = ta.FLOOR(close) 
        axes[1].plot(real, '') 
    elif math_transform == '自然对数': 
        real = ta.LN(close) 
        axes[1].plot(real, '') 
    elif math_transform == '常用对数': 
        real = ta.LOG10(close) 
        axes[1].plot(real, '') 
    elif math_transform == '正弦': 
        real = ta.SIN(close) 
        axes[1].plot(real, '') 
    elif math_transform == '双曲正弦': 
        real = ta.SINH(close) 
        axes[1].plot(real, '') 
    elif math_transform == '平方根': 
        real = ta.SQRT(close) 
        axes[1].plot(real, '') 
    elif math_transform == '正切': 
        real = ta.TAN(close) 
        axes[1].plot(real, '') 
    elif math_transform == '双曲正切': 
        real = ta.TANH(close) 
        axes[1].plot(real, '') 
 
    plt.show() 
 
 
# 数学操作 
def math_operator_process(event): 
    print(event.widget.get()) 
    math_operator = event.widget.get() 
 
    upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0) 
    fig, axes = plt.subplots(2, 1, sharex=True) 
    ax1, ax2 = axes[0], axes[1] 
    axes[0].plot(close, '', markersize=3) 
    axes[0].plot(upperband, '') 
    axes[0].plot(middleband, '') 
    axes[0].plot(lowerband, '') 
    axes[0].set_title(math_operator, fontproperties="SimHei") 
 
 
    if math_operator == '指定的期间的最大值': 
        real = ta.MAX(close, timeperiod=30) 
        axes[1].plot(real, '') 
    elif math_operator == '指定的期间的最大值的索引': 
        integer = ta.MAXINDEX(close, timeperiod=30) 
        axes[1].plot(integer, '') 
    elif math_operator == '指定的期间的最小值': 
        real = ta.MIN(close, timeperiod=30) 
        axes[1].plot(real, '') 
    elif math_operator == '指定的期间的最小值的索引': 
        integer = ta.MININDEX(close, timeperiod=30) 
        axes[1].plot(integer, '') 
    elif math_operator == '指定的期间的最小和最大值': 
        min, max = ta.MINMAX(close, timeperiod=30) 
        axes[1].plot(min, '') 
        axes[1].plot(max, '') 
    elif math_operator == '指定的期间的最小和最大值的索引': 
        minidx, maxidx = ta.MINMAXINDEX(close, timeperiod=30) 
        axes[1].plot(minidx, '') 
        axes[1].plot(maxidx, '') 
    elif math_operator == '合计': 
        real = ta.SUM(close, timeperiod=30) 
        axes[1].plot(real, '') 
 
    plt.show() 
 
 
root = tk.Tk() 
 
# 第一行:重叠指标 
rowframe1 = tk.Frame(root) 
rowframe1.pack(side=tk.TOP, ipadx=3, ipady=3) 
tk.Label(rowframe1, text="重叠指标").pack(side=tk.LEFT) 
 
overlap_indicator = tk.StringVar() # 重叠指标 
combobox1 = ttk.Combobox(rowframe1, textvariable=overlap_indicator) 
combobox1['values'] = ['布林线','双指数移动平均线','指数移动平均线 ','希尔伯特变换——瞬时趋势线', 
                       '考夫曼自适应移动平均线','移动平均线','MESA自适应移动平均','变周期移动平均线', 
                       '简单移动平均线','三指数移动平均线(T3)','三指数移动平均线','三角形加权法 ','加权移动平均数'] 
combobox1.current(0) 
combobox1.pack(side=tk.LEFT) 
 
combobox1.bind('<<ComboboxSelected>>', overlap_process) 
 
 
# 第二行:动量指标 
rowframe2 = tk.Frame(root) 
rowframe2.pack(side=tk.TOP, ipadx=3, ipady=3) 
tk.Label(rowframe2, text="动量指标").pack(side=tk.LEFT) 
 
momentum_indicator = tk.StringVar() # 动量指标 
combobox2 = ttk.Combobox(rowframe2, textvariable=momentum_indicator) 
combobox2['values'] = ['绝对价格振荡器','钱德动量摆动指标','移动平均收敛/散度','带可控MA类型的MACD', 
                       '移动平均收敛/散度 固定 12/26','动量','比例价格振荡器','变化率','变化率百分比', 
                       '变化率的比率','变化率的比率100倍','相对强弱指数','随机相对强弱指标','三重光滑EMA的日变化率'] 
 
combobox2.current(0) 
combobox2.pack(side=tk.LEFT) 
 
combobox2.bind('<<ComboboxSelected>>', momentum_process) 
 
 
 
# 第三行:周期指标 
rowframe3 = tk.Frame(root) 
rowframe3.pack(side=tk.TOP, ipadx=3, ipady=3) 
tk.Label(rowframe3, text="周期指标").pack(side=tk.LEFT) 
 
cycle_indicator = tk.StringVar() # 周期指标 
combobox3 = ttk.Combobox(rowframe3, textvariable=cycle_indicator) 
combobox3['values'] = ['希尔伯特变换——主要的循环周期','希尔伯特变换——主要的周期阶段','希尔伯特变换——相量组件', 
                       '希尔伯特变换——正弦曲线','希尔伯特变换——趋势和周期模式'] 
 
combobox3.current(0) 
combobox3.pack(side=tk.LEFT) 
 
combobox3.bind('<<ComboboxSelected>>', cycle_process) 
 
 
# 第四行:统计功能 
rowframe4 = tk.Frame(root) 
rowframe4.pack(side=tk.TOP, ipadx=3, ipady=3) 
tk.Label(rowframe4, text="统计功能").pack(side=tk.LEFT) 
 
statistic_indicator = tk.StringVar() # 统计功能 
combobox4 = ttk.Combobox(rowframe4, textvariable=statistic_indicator) 
combobox4['values'] = ['贝塔系数;投资风险与股市风险系数','皮尔逊相关系数','线性回归','线性回归角度', 
                       '线性回归截距','线性回归斜率','标准差','时间序列预测','方差'] 
 
combobox4.current(0) 
combobox4.pack(side=tk.LEFT) 
 
combobox4.bind('<<ComboboxSelected>>', statistic_process) 
 
 
# 第五行:数学变换 
rowframe5 = tk.Frame(root) 
rowframe5.pack(side=tk.TOP, ipadx=3, ipady=3) 
tk.Label(rowframe5, text="数学变换").pack(side=tk.LEFT) 
 
math_transform = tk.StringVar() # 数学变换 
combobox5 = ttk.Combobox(rowframe5, textvariable=math_transform_process) 
combobox5['values'] = ['反余弦','反正弦','反正切','向上取整','余弦','双曲余弦','指数','向下取整', 
                       '自然对数','常用对数','正弦','双曲正弦','平方根','正切','双曲正切'] 
 
combobox5.current(0) 
combobox5.pack(side=tk.LEFT) 
 
combobox5.bind('<<ComboboxSelected>>', math_transform_process) 
 
 
# 第六行:数学操作 
rowframe6 = tk.Frame(root) 
rowframe6.pack(side=tk.TOP, ipadx=3, ipady=3) 
tk.Label(rowframe6, text="数学操作").pack(side=tk.LEFT) 
 
math_operator = tk.StringVar() # 数学操作 
combobox6 = ttk.Combobox(rowframe6, textvariable=math_operator_process) 
combobox6['values'] = ['指定期间的最大值','指定期间的最大值的索引','指定期间的最小值','指定期间的最小值的索引', 
                       '指定期间的最小和最大值','指定期间的最小和最大值的索引','合计'] 
 
combobox6.current(0) 
combobox6.pack(side=tk.LEFT) 
 
combobox6.bind('<<ComboboxSelected>>', math_operator_process) 
 
 
 
 
root.mainloop()


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM