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

前回は、銘柄同士の関係を扱うオントロジーについて書いた。今回は、株価評価基盤に入れている強化学習の考え方を整理する。
「強化学習で株価」と聞くと、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運転で、本番スコアには未適用。これは慎重すぎるように見えるかもしれないが、株価評価ではそのくらいがちょうどよい。まず記録し、成熟を待ち、比較し、効果が安定してから適用する。
今回までで、最近の評価運用アップデートとして、日次選定、一目検証、テーマヒート、オントロジー、強化学習まで整理できた。次に発展させるなら、これらを日次ダッシュボードでどう読むか、あるいは失敗ログからどう改善サイクルを回すかを記事にできる。
