🥰

強化学習にオシレーターを学ばせるという発想

に公開

テクニカル指標をどう扱うか。
これはアルゴリズムトレードにおける永遠のテーマです。

「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