[numerai signals] セクター情報を追加した場合のモデル精度
この記事は Numerai Advent Calendar 2021 の23日目の記事です。
概要
株価データにセクターと国の情報を特徴量として追加した際のモデル性能について簡単な検証を行ったので報告します。
本検討はもともと上手くいっていなかったのですが、@pegion_HOLEさんと@regonn_haizineさんの貴重なポロリにより継続できました。ありがとうございます。
セクター情報
yfinanceでは、16のセクターが各銘柄に割り振られており、API経由で簡単に入手可能です。そのまま実行すると凄く時間がかかるので、必要に応じて工夫してください。
sector_li = []
for i in tqdm(ytickers): # yfinanceのtiker list
try:
sector = yfinance.Ticker(i).info['sector']
except KeyError:
sector = "error"
except AttributeError:
sector = "error"
sector_li.append([i, sector])
入手不可であったtickerのいくつかをyfinanceのHPで確認してみたところ、セクター情報が記載されていませんでした。セクター情報が入手不可であったtickerについては、別のデータベースから入手する必要がありそうです。今回は入手不可を1つのカテゴリとして扱います。
国情報
bloomberg tickerの後ろ2文字を抽出しました。
日足データ
次に日足データを用いた特徴量生成を行いました。今回は、taliibで生成可能な特徴量の一部を作成しました。さらに一部の特徴量に関しては過去(20, 40, 60日前)との比率に変換し、合計で212の特徴量を生成しました。
後は単純に株価データを元に作成した特徴量にラベルエンコーディング処理したセクター情報と国情報を加え、学習を行います。
その他の前処理
・終値の異常値の簡単な除去
結果
検証にはlightGBMを用いました。パラメータは以下の通りです。
params = {'task': 'train',
'boosting_type': 'gbdt',
'objective': 'regression',
'metric': 'rmse',
'learning_rate': 0.01 }
model = lgb.train(params, train_data, valid_sets=eval_data,
num_boost_round=1000,
early_stopping_rounds=100,)
validationの結果を以下に示します。
日足データ | 日足データ(+セクター, 国) | |
---|---|---|
Mean Correlation | 0.0171 | 0.0205 |
Median Correlation | 0.0162 | 0.0185 |
Standard Deviation | 0.0232 | 0.0261 |
corrlationが改善していますね。しかし、SDが高くなっているのが少し気になります...。
実験不足感は否めませんが、最低限の条件での性能が確認できたのでひとまず本検証を終わろうと思います。
次はyfinance以外からOHLCVデータを入手する記事でも書こうかなと考えています。
ご指摘等ありましたら、Twitterまでご連絡いただければ助かります。
Discussion