強化学習にオシレーターを学ばせるという発想
テクニカル指標をどう扱うか。
これはアルゴリズムトレードにおける永遠のテーマです。
「RSI や MACD を駆使して裁量トレードしてたけど、結局勝てる気がしない」
「最適な指標って、もう自分で作るしかないのでは?」
読者のなかには
「強化学習(actionによるポジションチェンジ)を試してみたけど上手く学習しなかった」
という人も多いかもしれません。
そんな悩みを 根本から覆すアイデア があります。
既存のインジケータなどを特徴量に使って、
新たなオシレータ(もしくはインジケータ)をエージェント自身に学ばせ生成する。
これが結構うまくいきそうなので紹介したいと思います。
1. まずは「オシレータによる取引ルール」
強化学習の action を [0, 1] の二択とし、
オシレーターは以下のように更新します。
eps = 1.0e-8
oscillator += 2*action-1
oscillator = np.clip(oscillator, -oscillator_threshold, oscillator_threshold)
if oscillator <= -oscillator_threshold + eps:
now_position = 0 if previous_position == 1 else -1
elif oscillator >= oscillator_threshold - eps:
now_position = 0 if previous_position == -1 else 1
else:
now_position = previous_position
action によってオシレータが上下し、
閾値に到達するとポジションを反転またはクローズする──という構造です。
いわば 「指標の値」=「行動履歴が蓄積されたもの」 という設計。
2. osc_ratio を状態に追加する
オシレーターをそのまま使うのではなく、正規化して状態に入れます。
osc_ratio = oscillator / oscillator_threshold
状態へ追加:
state = np.concatenate([
state,
[previous_position],
[now_position],
[osc_ratio]
]).astype(np.float32)
これによりエージェントは常に市場がどちら方向へ “どれくらい” 傾いているか
という「勢い」の情報を観察しながら行動するようになります。
後は強化学習に任せれば、
どう使えば利益につながるのかを 自律的に学習してくれます。
3. さらに発展:osc_ratio を使った報酬再構築
状態に入れるだけでも十分ですが、
さらに踏み込むなら 報酬の調整 が効果を上げてくれます。
- 市場が買い方向に強い → 買い行動にボーナス
- 市場が売り方向に強い → 売り行動にボーナス
- 逆方向ならペナルティ
つまり、利益だけではなく、市場状態と行動の整合性を報酬に反映するという設計です。
ただし──
報酬再構築が難しければ無理にやらなくても OK です。
osc_ratio を状態に入れるだけで、エージェントはそこそこ合理的に学習します。
これは実際に非常に重要なポイントで、状態の設計だけで
エージェントは“判断基準”を作り始める のです。
4. 結果:オシレーターを “使う” のではなく “生成する”
この仕組みを入れておくとエージェントは次第に、
- どんな osc_ratio のときに勝ちやすいのか
- そのときどんなアクションを選ぶべきか
を自分で掘り当てていきます。
つまり、私たちが人力で RSI や MACD を調整する必要はなく、
エージェントが学習過程で “自前のオシレーター” を構築し始める
ということです。
まとめ
- osc_ratio を状態に追加するだけでも学習は進む
- 報酬まで調整すればさらに市場への適応が進む
- 最終的には、エージェント自身が“内部オシレーター(判断基準)”を生成する
お役に立てるかどうか分かりませんが、シストレの強化学習に行き詰ったとき
ちょっと試してみようかと思い出していただければ幸いです。
~ 最後に ~
教科書通りにまず試すのは良いことですが、
多くの場合、大した成果は得られません。
日々工夫して、さらに上を目指す意思を持ち続けること、
執念こそが勝てるBOTを育てる源泉だと信じてやみません。
Discussion