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

# 1.概要
Python の TA-Lib（金融のテクニカル指標を計算してくれるライブラリ） で計算可能な指標を全部出すコードを書いてみました。
MACDとかRSIとか有名どころの指標は知ってたのですが、ほかの知らない指標のパラメーター等を考えるのが難しく…
「とりあえず脳死で全指標出して、特徴量増やしたい」みたいなケースで役立てば幸いです。
# 2.コード
まず必要なモジュールをインポートします。
```python:モジュールのインポートとか
import datetime
from dateutil.relativedelta import relativedelta
import yfinance as yf
import talib
import warnings

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

次に元となるデータを取ります。
一例として、Yahoo!ファイナンスのライブラリを使って、ビットコインの５年分のデータを取ってみます。
```python:ビットコインのデータを取る
#取得するデータをビットコインに指定
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())
```
取れたデータは以下です。
```python:取れたデータ
                  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\. エラーハンドリング: 計算中にエラーが発生した場合、その関数をスキップして次に進みます。

```python:全ての指標を計算
# 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','STOCH', 'STOCHF', 'TYPPRICE', 'WCLPRICE']:
                    indicator = getattr(talib, func)(df['High'], df['Low'], df['Close'])
                elif func in ['AROON', 'AROONOSC', 'MINUS_DM', 'PLUS_DM', 'MIDPRICE', 'SAR', 'SAREXT','MEDPRICE','BETA', 'CORREL']:
                    indicator = getattr(talib, func)(df['High'], df['Low'])
                elif func in ['BOP', 'AVGPRICE', 'CDL']:
                    indicator = getattr(talib, func)(df['Open'], df['High'], df['Low'], df['Close'])
                elif func in ['MFI', 'ADOSC', 'AD']:
                    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 ['OBV', 'ADD', 'DIV', 'MULT', 'SUB', 'MAVP']:
                    indicator = getattr(talib, func)(df['Close'], df['Volume'])
                elif func.startswith('CDL'):
                    indicator = getattr(talib, func)(df['Open'], df['High'], df['Low'], df['Close'])
                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)
```

結果、以下のようになります。
```python:結果
                  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列まで指標が増えています。