作者:未来大佬
来源:恒生LIGHT云社区
上篇文章【量化】股市技术分析利器之 TA-Lib(一),主要介绍了 Ta-lib 的基础知识与绘制布林线,本文将着重介绍 TA-Lib 中强大的价格转换、周期指标、波动率指标函数、数学运算、统计函数和数学转换及其应用实例。
1、Price Transform 价格转换
TA-Lib 模块中提供的价格转换函数有四个,主要用于计算开盘价、收盘价、最高价、最低价之间的均值,具体如下表所示。
下面使用演示这些函数的调用,并且绘图
首先我们还是使用恒有数作为数据源(主页:https://udata.hs.net/home,使用方法:https://developer.hs.net/thread/1502),获取数据后保存到文件
import talib
import hs_udata as hs
import datetime
import time
import talib
import pandas as pd
import openpyxl
#获取一段时间的股票日行情数据
def Get_stock_quote_daily(stocklist,datelist):
#单次获取股票代码数量
stock_num = 500
#变量初始化
data_i = []
for Date_i in datelist['trading_date'].to_list():
#开始计时
t1 = time.time()
#对股票列表进行循环
for i in range(0,len(stocklist),stock_num):
list_i=','.join(stocklist[i:i+stock_num])
#获取日行情数据,接口说明见 https://udata.hs.net/datas/332/
#adjust_way枚举值为:0-不复权,1-前复权,2-后复权,此处取前复权
data_i.append(hs.stock_quote_daily(en_prod_code=list_i,trading_date=Date_i,adjust_way = 1))
t2 = time.time()
# 结束计时
#打印耗时
print("{0}日行情数据,耗时为:{1}秒".format(Date_i,round(t2-t1,4)))
#拼接各段行情数据
data = pd.concat(data_i, ignore_index=True)
return data
if __name__ == '__main__':
#设置Token,注册后,获取并替换token
hs.set_token(token='SXt-DJbOiOxA5C-GXyzwaTehKvr41T564D8AQ1cgw5ZRW-gZTB_KIerid4U9Oy3S')
#获取股票列表
stocklist = ['600570.SH']
#下载2021-01-01~2021-11-23 的股票日行情数据
start='2021-01-01'
end ='2021-11-23'
#获取时间区间内,secu_market=83-沪深证券交易所交易日列表
datelist = hs.trading_calendar(secu_market='83',start_date=start,end_date=end,if_trading_day='1',fields='trading_date')
#调用函数
data = Get_stock_quote_daily(stocklist,datelist)
#导出Excel文件,方便后续本地快速调试
data.to_excel('股票日行情{0}-{1}.xlsx'.format(start, end))
print('下载数据条数为:{0}'.format(len(data)))
print(data.head())
复制代码
将获取到的数据筛选出开盘价,收盘价等数据,存为 df,后续测试都是基于该 df 进行。
import pandas as pd
def dealData():
# 获取上证指数收盘价、最高、最低价格
data = pd.read_excel("股票日行情2021-01-01-2021-11-23.xlsx")
# 剔除非交易日
data = data.loc[data.turnover_status == '交易']
# 选取日期、高开低收价格、成交量数据
df = data[['trading_date', 'open_price', 'high_price', 'low_price', 'close_price', 'business_amount']]
# 更换列名,为后面函数变量做准备
df = df.rename(
columns={'trading_date': 'Date', 'open_price': 'Open', 'close_price': 'Close', 'high_price': 'High',
'low_price': 'Low', 'business_amount': 'Volume'})
# 设置date列为索引,覆盖原来索引,这个时候索引还是 object 类型,就是字符串类型。
df.set_index('Date', inplace=True)
# 将object类型转化成 DateIndex 类型,pd.DatetimeIndex 是把某一列进行转换,同时把该列的数据设置为索引 index。
df.index = pd.DatetimeIndex(df.index)
df = df.sort_index(ascending=True)
return df
复制代码
使用函数并绘图示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 正常显示画图时出现的中文和负号
from pylab import mpl
# 引入TA-Lib库
import talib as ta
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
def doTest(df):
# 开盘价,最高价,最低价,收盘价的均值
df['average'] = ta.AVGPRICE(df.Open, df.High, df.Low, df.Close)
# 最高价,最低价的均值
df['median'] = ta.MEDPRICE(df.High, df.Low)
# 最高价,最低价,收盘价的均值
df['typical'] = ta.TYPPRICE(df.High, df.Low, df.Close)
# 最高价,最低价,收盘价的加权
df['weight'] = ta.WCLPRICE(df.High, df.Low, df.Close)
df.head()
df.loc['2020-01-04':, ['Close', 'average', 'median', 'typical', 'weight']].plot(figsize=(12, 6))
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.title('上证指数及其价格转换', fontsize=15)
plt.xlabel('')
plt.show()
复制代码
3874
2、Cycle Indicator Functions 周期指标函数
希尔伯特变换(Hilbert Transform)是积分变换中的一种,在信号处理领域得到了广泛的应用,而在工程中常用于窄带数字信号的处理。金融市场的波动是非周期、不规律的,但只要存在波动,就可以通过希尔伯特变换寻找其“周期性”。对于股价走势,一般可将其分解为:长期趋势、中短期周期性波动和噪声。在去除长期趋势的情况下,可以利用希尔伯特变换对中短期的周期性波动进行分析。关于希尔伯特变换原理及其在短线择时中的应用可参考广发证券金融工程专题报告《希尔伯特变换下的短线择时策略》
使用函数并绘图示例
def doTest(df):
df['dcperiod'] = ta.HT_DCPERIOD(df.Close)
df['dcphase'] = ta.HT_DCPHASE(df.Close)
df['inhpase'], df['quadrature'] = ta.HT_PHASOR(df.Close)
df['sine'], df['leadsine'] = ta.HT_SINE(df.Close)
df['trendmode'] = ta.HT_TRENDMODE(df.Close)
# 将上述函数计算得到的结果进行可视化
df[['Close', 'dcperiod', 'dcphase', 'inhpase', 'quadrature', 'sine', 'leadsine', 'trendmode']].plot(figsize=(20, 18), subplots=True, layout=(4, 2))
plt.subplots_adjust(wspace=0, hspace=0.2)
plt.show()
复制代码
3875
3、Volatility Indicator Functions 波动率指标
当前交易日最高价与最低价差值,前一交易日收盘价与当前交易日最高价间的差值,前一交易日收盘价与当前交易日最低价的差值,这三者中的最大值为真实波幅。即真实波动幅度 = max(最大值,昨日收盘价) − min(最小值,昨日收盘价),平均真实波动幅度等于真实波动幅度的 N 日指数移动平均数。波动幅度可以显示出交易者的期望和热情。波动幅度的急剧增加表示交易者在当天可能准备持续买进或卖出股票,波动幅度的减少则表示交易者对股市没有太大的兴趣。波动率指标可用于衡量价格的波动情况,辅助判断趋势改变的可能性,市场的交易氛围,也可以利用波动性指标来帮助止损止盈。
使用函数并绘图示例
def doTest(df):
df['atr'] = ta.ATR(df.High, df.Low, df.Close, timeperiod=14)
df['natr'] = ta.NATR(df.High, df.Low, df.Close, timeperiod=14)
df['trange'] = ta.TRANGE(df.High, df.Low, df.Close)
# 将上述函数计算得到的结果进行可视化
df[['Close', 'atr', 'natr', 'trange']].plot(figsize=(20, 18), subplots=True, layout=(4, 2))
plt.subplots_adjust(wspace=0, hspace=0.2)
plt.show()
复制代码
3876
4、Math Operator Functions 数学运算
TA-Lib 提供了向量(数组)的加减乘除、在某个周期内求和、最大最小值及其索引等计算函数,注意与 Numpy 和 Pandas 数学运算函数的联系与区别,TA-Lib 的向量计算功能类似于 pandas 的 moving window(移动窗口),得到的是一个新的序列(不是某个值)
使用函数并绘图示例
def doTest(df):
# 最高价与最低价之和
df['add'] = ta.ADD(df.High, df.Low)
# 最高价与最低价之差
df['sub'] = ta.SUB(df.High, df.Low)
# 最高价与最低价之乘
df['mult'] = ta.MULT(df.High, df.Low)
# 最高价与最低价之除
df['div'] = ta.DIV(df.High, df.Low)
# 收盘价的每30日移动求和
df['sum'] = ta.SUM(df.Close, timeperiod=30)
# 收盘价的每30日内的最大最小值
df['min'], df['max'] = ta.MINMAX(df.Close, timeperiod=30)
# 收盘价的每30日内的最大最小值对应的索引值(第N行)
df['minidx'], df['maxidx'] = ta.MINMAXINDEX(df.Close, timeperiod=30)
df.tail()
# 将上述函数计算得到的结果进行可视化
df[['Close', 'add', 'sub', 'mult', 'div', 'sum', 'min', 'max']].plot(figsize=(20, 18), subplots=True, layout=(4, 2))
plt.subplots_adjust(wspace=0, hspace=0.2)
plt.show()
复制代码
3877
5、Statistic Functions 统计学函数
TA-Lib 提供了常用的基础统计学函数,基于时间序列移动窗口进行计算。注意 TA-Lib 的 beta,示例中是求某只股票的最高价与最低价序列的移动 beta 值,默认时间周期为 5 日,而资本资产定价中一般是分析某只股票相对于市场(大盘指数)的波动情况。
函数使用并绘图示例
def doTest(df):
# 收盘价对时间t的线性回归预测值
df['linearreg'] = ta.LINEARREG(df.Close, timeperiod=14)
# 时间序列预测值
df['tsf'] = ta.TSF(df.Close, timeperiod=14)
# 画图
df.loc['2021-01-04':, ['Close', 'linearreg', 'tsf']].plot(figsize=(12, 6))
plt.show()
复制代码
3878
def doTest2(df):
df['beta'] = ta.BETA(df.High, df.Low, timeperiod=5)
df['correl'] = ta.CORREL(df.High, df.Low, timeperiod=30)
df['stdev'] = ta.STDDEV(df.Close, timeperiod=5, nbdev=1)
# 将上述函数计算得到的结果进行可视化
df[['Close', 'beta', 'correl', 'stdev']].plot(figsize=(18, 8), subplots=True, layout=(2, 2))
plt.subplots_adjust(wspace=0, hspace=0.2)
plt.show()
复制代码
3879
6、Math Transform Functions 数学转换函数
TA-Lib 提供了三角函数(正余弦、正余切、双曲)、取整、对数、平方根等数学转换函数,均是基于时间序列的向量变换。三角函数的应用比较复杂,可结合傅里叶变换和小波分析进行学习,此处不再详细展开。
函数使用并绘图示例
def doTest(df):
df['sin'] = ta.SIN(df.Close)
df['cos'] = ta.COS(df.Close)
df['ln'] = ta.LN(df.Close)
# 将上述函数计算得到的结果进行可视化
df[['Close', 'sin', 'cos', 'ln']].plot(figsize=(18, 8), subplots=True, layout=(2, 2))
plt.subplots_adjust(wspace=0, hspace=0.2)
plt.show()
复制代码
3880
评论