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列まで指標が増えています。