メインコンテンツへスキップ
見出し画像

Pythonライブラリ(テクニカル指標):TA-Lib

    1.概要・前提

     株価、FX、仮想通貨のデータ(以下:株価)からテクニカル指標を取得するライブラリとしてTA-Libを紹介します。

     前提として自作取引ツールを作る時の売買指標のために使用しており、ローソクチャートや計算されたテクニカル指標から自分で売買判断する場合は証券会社の取引ツールを使うほうが圧倒的に便利です。

    2.テクニカル指標

     テクニカル指標とは株価の動きや状態を予測するための指標です。様々なものがありますが自分で使用しそうなやつだけ選択しました。

    画像

    3.サンプルデータの準備

     pandas_datareaderにより商船三井の株価を使用します。取得データの都合上、前処理を2つ加えておきます。

    前処理1:別のライブラリTA-Lib使用のためにデータを昇順にします。
    前処理2:データが500個以上あると見えにくくなるため1年分に絞ります。

    [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')
    画像

    あとがき

     いろいろな機能はあるけど、取り急ぎ自分が使う奴だけ作成して公開。使う奴が増えてきたら追って追加予定。



     
     

    KIYO

     
     
    普段は製造業で企画/開発/設計しております。記事はプログラミング・機械学習、IoT関係の記事をメインで作成し、なるべく1つの記事で知りたいことを網羅していきます。内容は学術的より実装・アウトプット(ほしくなるもの)を重視して作成しています。 面白そうな仕事があればやりたいです!

    あなたへのおすすめ