接上一节,我们获取了000001.SZ股票过去一年的历史数据stock_df,接下来我们就计算技术指标
所用包
pandas_ta
import pandas_ta as ta
关于pandas_ta 可以在GitHub - twopirllc/pandas-ta: Technical Analysis Indicators - Pandas TA is an easy to use Python 3 Pandas Extension with 130+ Indicators 这里了解更多
我们可以通过以下代码,了解pandas_ta的说明
import pandas_ta as ta
# Create a DataFrame so 'ta' can be used.
df = pd.DataFrame()
# Help about this, 'ta', extension
help(df.ta)
也可以通过一下代码,了解pandas_ta 目前含有的功能
df.ta.indicators()
Pandas TA - Technical Analysis Indicators - v0.3.14b0
Total Indicators & Utilities: 205
Abbreviations:
aberration, above, above_value, accbands, ad, adosc, adx, alma, amat, ao, aobv, apo, aroon, atr, bbands, below, below_value, bias, bop, brar, cci, cdl_pattern, cdl_z, cfo, cg, chop, cksp, cmf, cmo, coppock, cross, cross_value, cti, decay, decreasing, dema, dm, donchian, dpo, ebsw, efi, ema, entropy, eom, er, eri, fisher, fwma, ha, hilo, hl2, hlc3, hma, hwc, hwma, ichimoku, increasing, inertia, jma, kama, kc, kdj, kst, kurtosis, kvo, linreg, log_return, long_run, macd, mad, massi, mcgd, median, mfi, midpoint, midprice, mom, natr, nvi, obv, ohlc4, pdist, percent_return, pgo, ppo, psar, psl, pvi, pvo, pvol, pvr, pvt, pwma, qqe, qstick, quantile, rma, roc, rsi, rsx, rvgi, rvi, short_run, sinwma, skew, slope, sma, smi, squeeze, squeeze_pro, ssf, stc, stdev, stoch, stochrsi, supertrend, swma, t3, td_seq, tema, thermo, tos_stdevall, trima, trix, true_range, tsi, tsignals, ttm_trend, ui, uo, variance, vhf, vidya, vortex, vp, vwap, vwma, wcp, willr, wma, xsignals, zlma, zscore
Candle Patterns:
2crows, 3blackcrows, 3inside, 3linestrike, 3outside, 3starsinsouth, 3whitesoldiers, abandonedbaby, advanceblock, belthold, breakaway, closingmarubozu, concealbabyswall, counterattack, darkcloudcover, doji, dojistar, dragonflydoji, engulfing, eveningdojistar, eveningstar, gapsidesidewhite, gravestonedoji, hammer, hangingman, harami, haramicross, highwave, hikkake, hikkakemod, homingpigeon, identical3crows, inneck, inside, invertedhammer, kicking, kickingbylength, ladderbottom, longleggeddoji, longline, marubozu, matchinglow, mathold, morningdojistar, morningstar, onneck, piercing, rickshawman, risefall3methods, separatinglines, shootingstar, shortline, spinningtop, stalledpattern, sticksandwich, takuri, tasukigap, thrusting, tristar, unique3river, upsidegap2crows, xsidegap3methods
计算MACD、KDJ、5 10 20MA
macd(close, fast=None, slow=None, signal=None, talib=None, offset=None, **kwargs)
这里需要的参数close是股票每日收盘价,即stock_df [ ' close ' ] 的数据,fast、slow、signal默认是12、26、9可以根据实际需要更改数值
#MACD
macd_df = ta.macd(stock_df['close'])
macd_df
输出数据如下
MACD_12_26_9的数据表示DIF线、MACDs_12_26_9的数据表示DEA线、MACDh_12_26_9的数据表示柱方图
kdj(high=None, low=None, close=None, length=None, signal=None, offset=None, **kwargs)
这里需要的参数high、low、close分别是股票每日最高价、最低价、收盘价,即stock_df [ ' high ' ] 、stock_df [ ' low ' ] 、stock_df [ ' close ' ] 的数据,length、signal默认是9、3可以根据实际需要更改数值
#KDJ
kdj_df = ta.kdj(stock_df['high'],stock_df['low'],stock_df['close'])
kdj_df
输出数据如下
K_9_3的数据表示K线、D_9_3的数据表示D线、J_9_3的数据表示J线
sma(close, length=None, talib=None, offset=None, **kwargs)
sma(simple moving average)即普通均线,这里需要的参数close是股票每日收盘价,即stock_df [ ' close ' ] 的数据,length是天数,默认是10天,可以根据实际需要更改数值。这里需要显示的分别是5天均线、10天均线、20天均线。
由于返回的值是series,我们需要转换为DataFrame。
#均线 5、10、20天
ma5_df = pd.DataFrame(ta.sma(stock_df['close'],length=5))
ma10_df = pd.DataFrame(ta.sma(stock_df['close'],length=10))
ma20_df = pd.DataFrame(ta.sma(stock_df['close'],length=20))
把计算所得结果用concat函数连结到total_df表示,用于后续分析使用
#连接所有技术指标结果与收盘价以列形式在一个DataFrame
total_df = pd.concat([macd_df,kdj_df,ma5_df,ma10_df,ma20_df,stock_df['close']],axis=1)
total_df
输出数据如下
将代码封装在get_technical函数里,实现total_df=get_technical(stock_df)
def get_technical(stock_df):
#MACD
macd_df = ta.macd(stock_df['close'])
#KDJ
kdj_df = ta.kdj(stock_df['high'],stock_df['low'],stock_df['close'])
#均线 5、10、20天
ma5_df = pd.DataFrame(ta.sma(stock_df['close'],length=5))
ma10_df = pd.DataFrame(ta.sma(stock_df['close'],length=10))
ma20_df = pd.DataFrame(ta.sma(stock_df['close'],length=20))
#连接所有技术指标结果与收盘价以列形式在一个DataFrame
total_df = pd.concat([macd_df,kdj_df,ma5_df,ma10_df,ma20_df,stock_df['close']],axis=1)
#返回对应技术指标用于后面画图使用
return macd_df,kdj_df,ma5_df,ma10_df,ma20_df,total_df
完整代码
import tushare as ts
import pandas as pd
import datetime
import pandas_ta as ta
token='你的token'
ts.set_token(token)
pro=ts.pro_api()
#定义获取股票历史数据函数
def get_stock(num):
stocknum=num
today = datetime.datetime.today()
startday=today+datetime.timedelta(days=-365)
today = today.strftime('%Y%m%d')
startday =startday.strftime('%Y%m%d')
stock_df= pro.daily(ts_code=stocknum, start_date=startday,end_date=today)
stock_df['trade_date'] = pd.to_datetime(stock_df['trade_date'])
stock_df.set_index('trade_date',inplace=True)
stock_df=stock_df.rename(columns={'vol':'volume'})
stock_df=stock_df.iloc[::-1]
return stock_df
#定义计算技术指标函数
def get_technical(stock_df):
#MACD
macd_df = ta.macd(stock_df['close'])
#KDJ
kdj_df = ta.kdj(stock_df['high'],stock_df['low'],stock_df['close'])
#均线 5、10、20天
ma5_df = pd.DataFrame(ta.sma(stock_df['close'],length=5))
ma10_df = pd.DataFrame(ta.sma(stock_df['close'],length=10))
ma20_df = pd.DataFrame(ta.sma(stock_df['close'],length=20))
#连接所有技术指标结果与收盘价以列形式在一个DataFrame
total_df = pd.concat([macd_df,kdj_df,ma5_df,ma10_df,ma20_df,stock_df['close']],axis=1)
return macd_df,kdj_df,ma5_df,ma10_df,ma20_df,total_df
get_stocknum =pd.read_excel('股票代码.xlsx')
stock_df = get_stock(get_stocknum.iloc[0,0])
macd_df,kdj_df,ma5_df,ma10_df,ma20_df,total_df=get_technical(stock_df)