AIで株の買いシグナルを作るとき、初心者がハマる罠

クオンツ構築

~ scale_pos_weightってなに? 実例つきでやさしく解説 ~

最近は株やFXの予測にAI(機械学習)を使う人が増えています。
でも、初心者が一番最初にハマるポイントが何か知っていますか?

それはズバリ 「データの偏り」 です。


📊 どういう偏りがあるの?

例えばあなたが、

「5分足の9本後(つまり45分後)に +1.5%以上 上昇するタイミングを見つけたい!」

と思ってデータを作ったとします。

このとき、実際にデータを見てみると

状態件数
普通の動き(+1.5%未満)950
大きく上昇(+1.5%以上)50

みたいなことがよく起こります。

つまり、あなたが本当に取りたいのは全体のたった 5% のチャンス です。


🤔 これをAIに学ばせるとどうなる?

AIは素直です。
なので「950対50か。だったら全部 ‘普通’(0)と予測しちゃえば95%当たるじゃん!」と思ってしまいます。

これでは欲しかった大きな上昇のタイミングを全然見つけられません。

こういう 「予測したいもの(今回なら+1.5%以上の上昇)が少なくて、データが偏っている状態」
機械学習の世界では「クラスの不均衡」と呼びます。


✅ そこで scale_pos_weight の出番

この問題を解決するために、XGBoost などでは
scale_pos_weight というパラメータがあります。

簡単に言うと、

「大きく上がる場面(正例)を外したら、普通の動きを外すよりずっと重いミスだよ!」

とAIに教えてあげる設定です。


🔢 数字で見てみよう

自動設定

よく使う目安が

scale_pos_weight = 負例の数 / 正例の数

このデータだと

scale_pos_weight = 950 / 50 = 19

つまり

「正例を外したら、負例を19回外したのと同じくらい重大なミスだよ」

と学習させます。


⚠️ でも自動計算だと危険なことも

この 19 は結構大きいです。
私が実際に検証したときも、自動設定にしたら

  • Precision(当たりの確率)が下がり
  • 総損益もマイナス

になってしまいました。


🛠 固定値で安定するケースも多い

だから実務では

  • scale_pos_weight = 2
  • scale_pos_weight = 3

のように、固定の小さな値にする人も多いです。

実際に同じデータで scale_pos_weight=2 にしたら

設定Precision総損益
自動(19)0.33-500,000円
固定(2)0.56+1,000,000円

と、大きく改善しました。


🖥 scale_pos_weight はどこでどう使うの?

PythonのXGBoostでは、モデルを定義するときにパラメータとして渡します。

例えばこんな感じです。

import xgboost as xgb

params = {
'objective': 'binary:logistic',
'scale_pos_weight': 2,
'max_depth': 5,
'eta': 0.1
}

model = xgb.train(params, dtrain, num_boost_round=100)

scikit-learn風の XGBClassifier でも同じで、

from xgboost import XGBClassifier

model = XGBClassifier(
scale_pos_weight=2,
max_depth=5,
learning_rate=0.1
)
model.fit(X_train, y_train)

この scale_pos_weight=2 が、まさに「正例を負例の2倍重く扱う」という指示です。


🎯 まとめ:初心者ほど scale_pos_weight を試してみよう

状況おすすめ設定
まずモデルを試すなら自動(負例 ÷ 正例)
実際に利益を狙うなら固定(2〜3)で調整
さらに追い込みたいならグリッドやOptunaで探索

scale_pos_weight は最初はちょっと難しそうに見えますが、
要は「少ないチャンスをしっかり拾うための重み調整」です。

これを上手に設定すれば、あなたのAIが大事な5%のチャンスを見逃さずに狙い撃ちしてくれるようになります。

タイトルとURLをコピーしました