最近の株価評価運用⑤—強化学習でスコア重みを少しずつ調整する


最近の株価評価運用⑤—強化学習でスコア重みを少しずつ調整する

強化学習による重み調整

前回は、銘柄同士の関係を扱うオントロジーについて書いた。今回は、株価評価基盤に入れている強化学習の考え方を整理する。

「強化学習で株価」と聞くと、AIが売買タイミングを自動で決めるようなものを想像しやすい。しかし、この基盤で使っている強化学習はかなり控えめだ。売買判断をさせるのではなく、総合スコアを作るときの重みを、事後成績を見ながら少しずつ調整するために使っている。

> 本記事は評価システムの設計メモです。ここでいう強化学習は、自動売買や投資助言ではありません。あくまで評価スコアの重みを検証するshadow運用です。

何を学習するのか

総合スコアは、複数の成分から作っている。現在の中心は次の3つだ。

  • `biz`: AIによる事業評価、競争優位、成長性、リスク
  • `value`: PBR、収益性、財務、割安度などの定量要素
  • `momentum`: 株価や売買代金の勢い

固定重みでは、biz 0.60、value 0.25、momentum 0.15を使っている。これは事業評価を重めにしつつ、割安度とモメンタムも見る設計だ。

強化学習の役割は、この3つの重みをいきなり最適化することではない。将来の成績を見て、「最近はどの成分が比較的効いていたか」を少しずつ反映することだ。

報酬は未来の確定後にしか使わない

株価評価で一番怖いのはリークだ。未来の価格を見て、過去の評価を良く見せてしまうと、システム全体が信用できなくなる。

そのため、学習は `eval_outcomes` に事後リターンが保存された成熟日だけを使う。評価日から5営業日、20営業日、60営業日後のリターンを記録し、学習の主対象は20営業日ホライズンにしている。

価格が確定していない日は学習しない。さらに、消化済みの成熟日は `consumed_through` で管理し、同じ日を二重に学習しない。同日再実行しても、同じ報酬を何度も食べないようにしている。

報酬は成分別IC

報酬には、成分別のクロスセクションICを使う。ここでのICは、評価スコアとその後のリターンの順位相関、具体的にはSpearman相関だ。

ある成熟日について、bizスコアが高かった銘柄ほどその後のリターンも良かったなら、bizのICはプラスになる。valueが効いていた日もあれば、momentumが効いていた日もある。逆に、ある成分がその期間では効いていなければ、ICは低くなる。

この考え方は、個別銘柄を当てるというより、「横断的にどの評価成分が効いているか」を見るものだ。銘柄ごとの勝ち負けではなく、成分の相対的な貢献を見る。

Exponentiated Gradientで更新する

重み更新には、Exponentiated Gradient、いわゆるHedge系の更新を使っている。考え方はシンプルで、良い報酬を得た成分の重みを少し増やし、悪かった成分の重みを少し減らす。

式としては、各成分の重みに `exp(η × 報酬)` を掛け、全体が1になるように正規化する。現在の学習率ηは0.05。大きく動かしすぎないため、控えめな値にしている。

さらにFixed-Shareを入れている。これは非定常な市場に対応するための混合で、全成分に少しずつ重みを戻す。ある成分が一時的に悪かったからといって、完全に捨てると、相場環境が変わったときに復帰できない。

下限ガードを入れる

重みには下限もある。現在は各成分の重みが0.05を下回らないようにしている。

これはかなり重要だ。もしmomentumがしばらく効かなかったとしても、完全にゼロにしてしまうと、モメンタム相場が戻ったときに反応できない。同じように、valueやbizもゼロにはしない。評価システムは、短期の成績に過剰適応しないことが大事だ。

shadow運転で本番には未適用

現在の強化学習はshadow運転だ。本番の総合スコアにはまだ適用していない。設定上も、学習重みの本番適用フラグはオフになっている。

直近DBでは、policy_stateはwarmup状態で、学習重みは固定重みと同じ biz 0.60、value 0.25、momentum 0.15 のままだった。事後リターンは蓄積されているが、20営業日の成熟待ちや最低サンプル数の条件があるため、いきなり本番重みを変えない。

この段階を置く理由は、一目シグナルの検証運転と同じだ。新しい仕組みは、まず表示や記録だけで動かし、十分なデータがたまってから本番に入れる。

強化学習を入れる価値

固定重みでも運用はできる。むしろ、固定重みのほうが説明しやすい。では、なぜ強化学習を入れるのか。

理由は、市場環境が変わるからだ。ある時期は事業の質が評価されやすく、別の時期は割安株が強く、また別の時期はモメンタムが効く。人間が毎回重みを手で変えると、後付けになりやすい。そこで、事後成績を使って機械的に重みを観測する。

ただし、観測と本番適用は分ける。学習重みが固定重みより良いかをレポートで比較し、一定期間の検証で安定してから適用を検討する。

失敗しやすいポイント

強化学習を株価評価に入れるとき、危険なのは過剰最適化だ。過去20営業日の結果に合わせすぎると、次の20営業日で逆に悪くなる可能性がある。

そのため、この基盤ではいくつかのガードを入れている。

  • 未来価格が確定した成熟日しか使わない
  • 最小クロスセクション数を満たさない日は学習しない
  • warmup期間中は本番適用しない
  • Fixed-Shareで復帰余地を残す
  • 重み下限で一成分を完全に捨てない
  • 本番適用は明示フラグで分離する

強化学習という名前に引っ張られて、いきなり自動売買や過激な最適化へ進めないことが大切だ。

まとめ

この基盤での強化学習は、売買判断をAIに任せる仕組みではない。biz、value、momentumという3つの評価成分の重みを、事後リターンの横断ICで少しずつ観測・更新する仕組みだ。

現在はshadow運転で、本番スコアには未適用。これは慎重すぎるように見えるかもしれないが、株価評価ではそのくらいがちょうどよい。まず記録し、成熟を待ち、比較し、効果が安定してから適用する。

今回までで、最近の評価運用アップデートとして、日次選定、一目検証、テーマヒート、オントロジー、強化学習まで整理できた。次に発展させるなら、これらを日次ダッシュボードでどう読むか、あるいは失敗ログからどう改善サイクルを回すかを記事にできる。


Back to top