Pythonライブラリ(テクニカル指標):TA-Lib
1.概要・前提
株価、FX、仮想通貨のデータ(以下:株価)からテクニカル指標を取得するライブラリとしてTA-Libを紹介します。
前提として自作取引ツールを作る時の売買指標のために使用しており、ローソクチャートや計算されたテクニカル指標から自分で売買判断する場合は証券会社の取引ツールを使うほうが圧倒的に便利です。
2.テクニカル指標
テクニカル指標とは株価の動きや状態を予測するための指標です。様々なものがありますが自分で使用しそうなやつだけ選択しました。
3.サンプルデータの準備
pandas_datareaderにより商船三井の株価を使用します。取得データの都合上、前処理を2つ加えておきます。
[In]
import pandas_datareader as pdr
import pandas as pd
df = pdr.data.DataReader('9104.jp', 'stooq') #商船三井:9104.jp
df_sorted = df.sort_index(ascending=True) #処理前に昇順ソート
df_sorted = df_sorted.iloc[-365:, :] #見にくいためデータを365に絞る
df_sorted
[Out]
下記参照(※左図:df、右図:df_sorted)
4.移動平均線:SMA()
移動平均線は当日よりx日前の値を平均値にしたものです。これにより瞬間的な変動が抑制され平均的な傾向が確認できます。
4-1.SMAの算出:talib.SMA()
一番シンプルなテクニカル指標の移動平均線を作成します。これはtalib.SMA(x日)で作成可能です。
[In]
import talib
df = pdr.data.DataReader('9104.jp', 'stooq') #商船三井:9104.jp
df_sorted = df.sort_index(ascending=True) #処理前に昇順ソート
df_sorted = df_sorted.iloc[-150:, :] #見にくいためデータを150に絞る
df_close = df_sorted['Close'] #終値(CLOSE)のみ取得
sma_5 = talib.SMA(df_close, timeperiod=5) #5日移動平均
sma_25 = talib.SMA(df_close, timeperiod=25) #25日移動平均
sma_75 = talib.SMA(df_close, timeperiod=75) #75日移動平均
#出力確認用
df_output = pd.concat([df_close, sma_5, sma_25, sma_75], axis=1) #データフレーム結合
df_output.columns = ['Close', 'SMA5', 'SMA25', 'SMA75'] #カラム名変更
df_output
[Out]
なおPandasではrollingメソッドで同様に移動平均線が取得できます。
[In]
sma_5_r = df_close.rolling(5).mean()
sma_25_r = df_close.rolling(25).mean()
sma_75_r = df_close.rolling(75).mean()
[Out]
同上になります。
4-2.結果の可視化:Matplotlib()
参考までに正しく作成できているか可視化しました。
[In]
import matplotlib.pyplot as plt
import japanize_matplotlib
plt.figure(figsize=(12, 6))
plt.plot(df_close, label='Close', color='black')
plt.plot(sma_5, label='5日移動平均', linestyle='--')
plt.plot(sma_25, label='25日移動平均', linestyle='--')
plt.plot(sma_75, label='75日移動平均', linestyle='--')
plt.legend(); plt.grid() #凡例、グリッド表示
plt.figure()
別パターンの可視化も実施しました。
[In]
import matplotlib.pyplot as plt
import japanize_matplotlib
fig = mpf.figure(figsize=(11,8))
ax1 = fig.subplots()
ax1.plot(sma_5, label='5日移動平均', linestyle='--', linewidth=1) #5日移動平均
ax1.plot(sma_25, label='25日移動平均', linestyle='--', linewidth=1) #25日移動平均
ax1.plot(sma_75, label='75日移動平均', linestyle='--', linewidth=1) #75日移動平均
ax2 = ax1.twiny() #軸をコピー
mpf.plot(df_sorted, ax=ax2, type='candle', style='yahoo') #ローソク足
japanize_matplotlib.japanize() #日本語化
ax1.grid(); ax1.legend()
mpf.show()
5.MACD
トレンド分析の有名な指標でありMACDとMACDシグナルのクロスで売買を判断します。
5-1.MACDの算出:talib.MACD()
[In]
import talib
df = pdr.data.DataReader('9104.jp', 'stooq') #商船三井:9104.jp
df_sorted = df.sort_index(ascending=True) #処理前に昇順ソート
df_sorted = df_sorted.iloc[-150:, :] #見にくいためデータを150に絞る
df_close = df_sorted['Close'] #終値(CLOSE)のみ取得
df_MACD = pd.DataFrame(talib.MACD(df_close, fastperiod=12, slowperiod=26, signalperiod=9), index=["MACD(12,26)","MACDsignal", "MACDhist"]).T
df_MACD
5-2.結果の可視化:mlp.finance()
こちらは参考用としてmlp.financeで可視化してみました。
[In]
import mplfinance as mpf
addplot = [
mpf.make_addplot((df_MACD['MACD(12,26)']),panel=2, ylabel='MACD(12,26)', color='g'),
mpf.make_addplot((df_MACD['MACDsignal']),panel=2, ylabel='MACDsignal', color='r'),
]
mpf.plot(df_sorted, addplot=addplot ,type='candle',mav=(5,25,100),volume=True, figratio=(10,4), style='yahoo')
あとがき
いろいろな機能はあるけど、取り急ぎ自分が使う奴だけ作成して公開。使う奴が増えてきたら追って追加予定。