0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TA-Libで計算可能な指標を全部出すコード

Posted at

1.概要

Python の TA-Lib(金融のテクニカル指標を計算してくれるライブラリ) で計算可能な指標を全部出すコードを書いてみました。
MACDとかRSIとか有名どころの指標は知ってたのですが、ほかの知らない指標のパラメーター等を考えるのが難しく…
「とりあえず脳死で全指標出して、特徴量増やしたい」みたいなケースで役立てば幸いです。

2.コード

まず必要なモジュールをインポートします。

モジュールのインポートとか
import datetime
from dateutil.relativedelta import relativedelta
import yfinance as yf
import talib
import warnings

# 警告は非表示
warnings.filterwarnings('ignore')

次に元となるデータを取ります。
一例として、Yahoo!ファイナンスのライブラリを使って、ビットコインの5年分のデータを取ってみます。

ビットコインのデータを取る
#取得するデータをビットコインに指定
tickers = ['BTC-JPY']

#取得終了日
end = datetime.date.today()

#取得開始日(5年前)
start = end - relativedelta(years=10)

#データの取得を実行 、結果を`data`に代入
df = yf.download(tickers, start=start, end=end)
print(df.tail())

取れたデータは以下です。

取れたデータ
                  Open        High         Low       Close   Adj Close         Volume
Date
2024-10-31  11145274.0  11184766.0  10934059.0  11085854.0  11085854.0  6228995631066
2024-11-01  11085165.0  11075262.0  10577821.0  10667934.0  10667934.0  6172679937563
2024-11-02  10668194.0  10927428.0  10469330.0  10632555.0  10632555.0  7649688435745
2024-11-03  10633099.0  10691452.0  10559054.0  10602992.0  10602992.0  2782700265275
2024-11-04  10604079.0  10614068.0  10321790.0  10468447.0  10468447.0  5310024836189

次に、TA-Libの全ての指標を計算し、データフレームに追加する関数を定義します。
ざっくりとした関数の内容は以下のような感じです。

1. 関数リストの取得: talib.get_function_groups()を使って、TA-Libの全ての関数を取得します。
2. 関数ごとの引数設定: 各関数が必要とする引数に応じて、適切なデータを渡します。
3. 複数の戻り値の処理: 複数の戻り値を持つ関数に対して、各戻り値を個別の列としてデータフレームに追加します。
4. エラーハンドリング: 計算中にエラーが発生した場合、その関数をスキップして次に進みます。

全ての指標を計算
# TA-Libで利用可能な全ての指標を特徴量として追加
def add_ta_features(df):
    # TA-Libの関数リストを取得
    talib_functions = talib.get_function_groups()
    
    for group, functions in talib_functions.items():
        for func in functions:
            try:
                # 各指標を計算
                if func in ['ADX', 'ADXR', 'DX', 'MINUS_DI', 'PLUS_DI', 'WILLR', 'CCI', 'ATR', 'NATR', 'TRANGE']:
                    indicator = getattr(talib, func)(df['High'], df['Low'], df['Close'])
                elif func in ['AROON', 'AROONOSC', 'MINUS_DM', 'PLUS_DM', 'MIDPRICE']:
                    indicator = getattr(talib, func)(df['High'], df['Low'])
                elif func in ['BOP']:
                    indicator = getattr(talib, func)(df['Open'], df['High'], df['Low'], df['Close'])
                elif func in ['MFI', 'ADOSC']:
                    indicator = getattr(talib, func)(df['High'], df['Low'], df['Close'], df['Volume'])
                elif func in ['ULTOSC']:
                    indicator = getattr(talib, func)(df['High'], df['Low'], df['Close'], timeperiod1=7, timeperiod2=14, timeperiod3=28)
                elif func in ['STOCH', 'STOCHF']:
                    indicator = getattr(talib, func)(df['High'], df['Low'], df['Close'])
                elif func in ['SAR', 'SAREXT']:
                    indicator = getattr(talib, func)(df['High'], df['Low'])
                elif func in ['AVGPRICE']:
                    indicator = getattr(talib, func)(df['Open'], df['High'], df['Low'], df['Close'])
                elif func in ['MEDPRICE']:
                    indicator = getattr(talib, func)(df['High'], df['Low'])
                elif func in ['TYPPRICE', 'WCLPRICE']:
                    indicator = getattr(talib, func)(df['High'], df['Low'], df['Close'])
                elif func in ['BETA', 'CORREL']:
                    indicator = getattr(talib, func)(df['High'], df['Low'])
                elif func in ['AD']:
                    indicator = getattr(talib, func)(df['High'], df['Low'], df['Close'], df['Volume'])
                elif func in ['OBV']:
                    indicator = getattr(talib, func)(df['Close'], df['Volume'])
                elif func in ['ADD', 'DIV', 'MULT', 'SUB']:
                    indicator = getattr(talib, func)(df['Close'], df['Volume'])  # 例としてCloseとVolumeを使用
                elif func.startswith('CDL'):
                    indicator = getattr(talib, func)(df['Open'], df['High'], df['Low'], df['Close'])
                elif func in ['MAVP']:
                    indicator = getattr(talib, func)(df['Close'], df['Volume'])  # 例としてCloseとVolumeを使用
                else:
                    indicator = getattr(talib, func)(df['Close'])
                
                # 複数の戻り値がある場合の処理
                if isinstance(indicator, tuple):
                    for i, ind in enumerate(indicator):
                        df[f"{func}_{i}"] = ind
                else:
                    df[func] = indicator
            except Exception as e:
                print(f"Error calculating {func}: {e}")
    
    return df

# 特徴量を追加
df_with_features = add_ta_features(df)

結果、以下のようになります。

結果
                  Open        High         Low       Close   Adj Close         Volume  HT_DCPERIOD  HT_DCPHASE    HT_PHASOR_0  ...         STDDEV           TSF           VAR            ATR      NATR    TRANGE            AD         ADOSC           OBV
Date                                                                                                                           ...
2024-10-31  11145274.0  11184766.0  10934059.0  11085854.0  11085854.0  6228995631066    22.443418  207.885592   56942.047864  ...  371010.372868  1.084529e+07  1.376487e+11  305945.021562  2.759779  250707.0  6.402238e+14  6.560909e+12  1.931631e+14
2024-11-01  11085165.0  11075262.0  10577821.0  10667934.0  10667934.0  6172679937563    22.390614  205.066937   23626.147432  ...  281265.822812  1.087885e+07  7.911046e+10  320379.877164  3.003205  508033.0  6.362875e+14  4.912113e+12  1.869905e+14
2024-11-02  10668194.0  10927428.0  10469330.0  10632555.0  10632555.0  7649688435745    22.268785  199.792479  215589.752166  ...  221091.018115  1.090389e+07  4.888124e+10  330216.885938  3.105715  458098.0  6.340891e+14  3.091571e+12  1.793408e+14
2024-11-03  10633099.0  10691452.0  10559054.0  10602992.0  10602992.0  2782700265275    22.086398  194.981511  467442.688923  ...  237526.874335  1.090573e+07  5.641902e+10  316086.965514  2.981111  132398.0  6.331534e+14  1.768013e+12  1.765581e+14
2024-11-04  10604079.0  10614068.0  10321790.0  10468447.0  10468447.0  5310024836189    21.940354  192.309659  769212.684739  ...  208389.653133  1.087441e+07  4.342625e+10  314386.325120  3.003180  292278.0  6.331722e+14  1.071818e+12  1.712480e+14

[5 rows x 181 columns]

「Open、High、Low、Close、Adj Close、Volume」の6列から、181列まで指標が増えています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?