Bot

開発記録#158(2025/3/25)「論文ベースのbot開発フローpart.20 トレードロジックの強化(ATR×RSI×サポレジ)」

2025年3月25日

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

本記事では「暗号通貨のパンプ&ダンプスキームの検出」に関する論文をベースにbot開発の過程をまとめていきます。

🚀 トレードロジックの強化

まずは、トレードロジックの強化に取り組みます。具体的には以下の3つの要素を追加・改善します。

ATR (Average True Range) を活用したボラティリティ分析
RSI (Relative Strength Index) を用いたエントリーポイントの改善
サポート&レジスタンスラインの組み込み


1. ATRを活用したボラティリティ分析

🔎 ATRとは?

ATR (Average True Range) は、価格の変動幅 (ボラティリティ) を測定する指標です。

  • ATRが高い → 価格が大きく変動している (不安定な相場)
  • ATRが低い → 価格が安定している (レンジ相場)

活用方法

  • ATRが急上昇した際に「異常な価格変動」を検出し、リスク回避モードに切り替え
  • ATRが一定値以上のときのみエントリーする (ノイズトレードの防止)

2. RSIを活用したエントリーポイントの最適化

🔎 RSIとは?

RSI (Relative Strength Index) は、買われすぎ (70以上) / 売られすぎ (30以下) を判断する指標です。

活用方法

  • RSIが30以下 ➔ 買いシグナル
  • RSIが70以上 ➔ 売りシグナル
  • RSIとATRを組み合わせて「高ボラティリティ × RSIの反発」で精度の高いエントリーを実現

3. サポート&レジスタンスラインの組み込み

🔎 サポート&レジスタンスとは?

  • サポートライン:価格が下げ止まりやすいライン
  • レジスタンスライン:価格が上げ止まりやすいライン

活用方法

  • サポートライン付近でRSIが30以下 → 買いシグナル
  • レジスタンスライン付近でRSIが70以上 → 売りシグナル

4. 改善版トレードロジックの実装

コード (enhanced_trade_logic.py)

import pandas as pd
import numpy as np
import ccxt
from datetime import datetime, timedelta

# Bybit API接続設定
exchange = ccxt.bybit({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_API_SECRET'
})

# パラメータ設定
ATR_PERIOD = 14
RSI_PERIOD = 14
ATR_THRESHOLD = 100
RSI_OVERBOUGHT = 70
RSI_OVERSOLD = 30

# データ取得
def fetch_data(symbol, timeframe="1h", limit=200):
    ohlcv = exchange.fetch_ohlcv(symbol, timeframe, limit=limit)
    df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
    return df

# ATR計算
def calculate_atr(df, period=ATR_PERIOD):
    df['tr'] = np.maximum((df['high'] - df['low']), 
                          np.abs(df['high'] - df['close'].shift(1)),
                          np.abs(df['low'] - df['close'].shift(1)))
    df['atr'] = df['tr'].rolling(window=period).mean()
    return df

# RSI計算
def calculate_rsi(df, period=RSI_PERIOD):
    delta = df['close'].diff()
    gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()
    rs = gain / loss
    df['rsi'] = 100 - (100 / (1 + rs))
    return df

# サポート&レジスタンスの計算
def calculate_support_resistance(df):
    df['support'] = df['low'].rolling(window=20).min()
    df['resistance'] = df['high'].rolling(window=20).max()
    return df

# トレードロジック
def trade_logic(df, symbol):
    for i in range(1, len(df)):
        if df['atr'].iloc[i] > ATR_THRESHOLD:  # 高ボラティリティのみエントリー
            if df['rsi'].iloc[i] < RSI_OVERSOLD and df['close'].iloc[i] <= df['support'].iloc[i]:
                print(f"✅ {symbol} - BUY at {df['close'].iloc[i]}")
                exchange.create_order(symbol, 'market', 'buy', 0.01)

            elif df['rsi'].iloc[i] > RSI_OVERBOUGHT and df['close'].iloc[i] >= df['resistance'].iloc[i]:
                print(f"✅ {symbol} - SELL at {df['close'].iloc[i]}")
                exchange.create_order(symbol, 'market', 'sell', 0.01)

# メイン処理
def main():
    symbol = 'BTCUSDT'
    df = fetch_data(symbol)
    df = calculate_atr(df)
    df = calculate_rsi(df)
    df = calculate_support_resistance(df)
    trade_logic(df, symbol)

if __name__ == "__main__":
    main()

🔧 4. 改善版トレードロジックの実装 解説

このコードは、Bybit の板情報をもとに ATR、RSI、サポート&レジスタンスを組み合わせた「強化版トレードロジック」を Python で実装しています。主な流れは以下のとおりです。

  1. データ取得 (fetch_data)
    CCXT ライブラリを使って指定シンボル(ここでは BTCUSDT)の OHLCV(始値・高値・安値・終値・出来高)を取得し、Pandas DataFrame に整形します。
  2. ATR 計算 (calculate_atr)
    • True Range (TR) をmax(高値−安値,∣高値−前日終値∣,∣安値−前日終値∣)で求め、期間(デフォルト14 本)の移動平均を取って ATR(ボラティリティ指標)を算出します。
    • ATR が大きいほど「相場が荒れている」サインです。
  3. RSI 計算 (calculate_rsi)
    • 終値差分を正方向(上昇)と負方向(下落)に分離し、期間(14 本)の平均を計算。
    • その比(RS)を 0–100 のスケールに変換して、RSI(買われすぎ/売られすぎの指標)を得ます。
    • RSI が 30 以下なら「売られすぎ」、70 以上なら「買われすぎ」です。
  4. サポート&レジスタンス算出 (calculate_support_resistance)
    • 過去 20 本の安値の最小値をサポートライン、高値の最大値をレジスタンスラインと定義。
    • これら価格帯に到達したときの反発をトレード判断に組み込みます。
  5. トレードロジック (trade_logic)
    • 高ボラティリティ時のみエントリー:ATR が閾値(ここでは 100)を超えているかチェック。
    • 買い(Long)条件:RSI ≤ 30 AND 終値 ≤ サポート
    • 売り(Short)条件:RSI ≥ 70 AND 終値 ≥ レジスタンス
    • 条件成立時に CCXT 経由でマーケット注文(0.01 BTC)を発行し、コンソールに約定価格を出力します。
  6. メイン処理 (main)
    • 上記 4 つの関数を順に呼び出し、trade_logic まで流して完結。

🏆 この実装で得られるメリット

  • ノイズの排除:ATR で「動きの小さいレンジ帯のエントリー」を防ぐ
  • 反転ポイントの精度向上:RSI とサポート/レジスタンスのダブルフィルタ
  • シンプルかつ拡張性あり:似たロジックを他のインジケーターやシンボルに適用可能

このサンプルをベースに、バックテストやパラメータ最適化を加えれば、より高い勝率を目指せます。ぜひブログ読者の皆さんも自分の環境で動かしてみてください!


5. 実行方法

  1. 依存ライブラリのインストール
pip install pandas ccxt numpy
  1. スクリプトの実行
python enhanced_trade_logic.py

6. 改善後の期待効果

取引の精度向上 → ATRとRSIに基づくエントリーポイントの最適化
P&Dイベントの精度向上 → 異常検出とRSIの反発を組み合わせたトリガー設計
リスク管理の強化 → ATR活用による相場の不安定さ検知


7. 次のステップ

次は、以下のタスクに進みます。

セキュリティ強化 (APIキーのローテーションとデータバックアップの導入)
パフォーマンス最適化 (非同期処理とモデルの高速化)

Yodaka

次回の記事では、セキュリティ強化 (APIキーのローテーションとデータバックアップの導入)についてまとめます。

関連
開発記録#159(2025/3/25)「論文ベースのbot開発フローpart.21 セキュリティ強化 (APIキーのローテーションとデータバックアップの導入)」

続きを見る

🎙️ おまけコーナー:LSTMとTransformerをざっくり解説!

さて、今日はおまけで「LSTM」と「Transformer」について、初心者向けに超かんたんにご紹介します。BotのP&D予測モデルにも出てきた名前なので、ぜひ押さえておきましょう。


1. LSTM(Long Short‑Term Memory)って何?

📖 簡単なイメージ

「時間をまたいで“覚えておく力”と“忘れる力”をコントロールできるニューラルネットワーク」です。
普通のRNN(再帰型ニューラルネット)は、長い時系列を扱うと前半の情報がどんどん薄れてしまう(勾配消失問題)んですが、LSTMは「ゲート」と呼ばれる仕組みで重要な情報を長くキープできます。

🔑 ポイント

  • 入力ゲート:新しい情報をどれだけメモリに入れるか
  • 忘却ゲート:古い情報をどれだけ消すか
  • 出力ゲート:次の層にどれだけ情報を出すか

これらで「必要なときだけ重要情報を保持」するため、過去何時間分もの価格推移や板情報をちゃんとモデルに覚えさせられます。


2. Transformerって何?

📖 簡単なイメージ

「全文を一度に見渡して、“どの単語(データポイント)が今の判断に重要か”を自動で見つける仕組み」です。
もともとは翻訳などのテキスト処理向けに生まれましたが、時系列予測にも応用可能です。

🔑 ポイント

  • 自己注意機構(Self‑Attention)
    各時刻のデータが他のすべての時刻と“どれくらい関係があるか”を計算。
    これにより、遠く離れた過去のイベントでもモデルが深く参照できます。
  • 並列処理に強い
    テキストや時系列を先頭から順に処理しなくてもいい設計なので、GPUでバッチにして高速に訓練・推論できます。

3. LSTM vs. Transformer、どう使い分ける?

特徴LSTMTransformer
長期依存の保持ゲートでメモリ維持するが限界あり自己注意で全体を見渡せる
計算の並列性順次処理(遅くなりがち)並列処理OK(高速)
実装のシンプルさ比較的簡単モジュール多数でやや複雑
適用例少量データの時系列予測大規模データや複雑相関の分析

BotのP&D予測なら、過去数時間の高頻度データを軽量に扱いたいときはLSTM
もっと長い履歴や異なるデータ間の相関を一気に見たいときはTransformer、という使い分けが基本です。


🎙️ おまけまとめ

  • LSTM:時間の流れに沿って情報を「選択的に覚える」ネットワーク
  • Transformer:時系列全体を「一度に見渡して関係性を掴む」ネットワーク

どちらもP&D予測や異常検出のモデルとして強力なツールなので、
「まずは書籍やチュートリアルで小さなサンプルを動かしてみる」のがおすすめです!

それでは、おまけコーナーでした。
次回もBot開発の裏側を深掘りしていきます。

👇ラジオで話したこと

🎙️ Yodaka Radio ― 開発記録 #158(part.20)
「ATR×RSI×サポレジで“負けにくい”エントリーを作る回」


0. オープニング 

こんにちは、仮想通貨bot開発ラジオ、Yodaka です。
前回までは Bot を“とりあえず動かす”ところまで来ましたが、今日は トレードロジックを本気で強化 していきます。
テーマは 「攻める前に負けない型を作る」 です。
ATR、RSI、サポート&レジスタンス──この3つを組み合わせて “ダマシ” を極力減らす仕組みを作りましょう。
初心者さんにも分かるよう、順を追って解説しますのでご安心を。


1. そもそも何を強化したいの? 

最初に、なぜロジック強化が必要なのか、ざっくり背景を共有します。

現状の Bot は「スプレッドが広がったら指値を出す」だけ。
相場がヨコヨコでも、ダラ下げでも、とりあえず注文してしまう。
当然、ノイズを拾って損失を抱えることも多いわけです。

そこで今日は 3段フィルター を追加します。

  1. ATR で「相場が本当に動いているか」確認
  2. RSI で「買われすぎ・売られすぎ」を数値化
  3. サポレジ で「止まりやすい帯」だけを狙う

この順番でふるいにかけることで “無駄打ちしない Bot” に進化させます。


2. ATR を使って“荒れ具合”を数値化

2.1 ATR ざっくり

まずは ATR=Average True Range
これは 値幅の平均 です。「高値−安値」だけでなく、前日終値とのギャップも加味します。

  • ATR が大きい = ローソク足が長い、ギャップも大きい → 相場が荒れている
  • ATR が小さい = 値幅が狭い → レンジ相場

Bot では ATR > 100 を閾値にして、
荒れているときだけ エントリーする” というルールにしました。
これだけで「ガチ横ばいで往復ビンタ」みたいなミスが激減します。


3. RSI で“反発タイミング”を読む 

3.1 RSI ざっくり

次は RSI=Relative Strength Index
14 本分の上昇幅と下落幅を比べて 0〜100 の点数 にします。

  • RSI ≤ 30 ⇒ 売られすぎ(反発しやすい)
  • RSI ≥ 70 ⇒ 買われすぎ(反落しやすい)

でも RSI だけだと、「買われすぎでもさらに上に突き抜ける」ことがありますよね。
そこで ATR と組み合わせる わけです。
“荒れていて、しかも RSI が極端” という ハイインパクトな瞬間 にしぼり込みます。


4. サポート&レジスタンスで“止まる帯”を限定

最後のフィルターが サポート&レジスタンス
やり方はシンプルで、過去 20 本の

  • 最安値 → サポートライン
  • 最高値 → レジスタンスライン

を DataFrame に追加します。

こうしておくと、

  • サポート帯 × RSI ≤ 30Buy
  • レジスタンス帯 × RSI ≥ 70Sell

という ダブル・コンディション が作れます。
つまり“止まりやすい場所”で“過熱状態が反転した瞬間”だけエントリーするイメージです。


5.実装コードをざっと俯瞰

# --- 1) データ取得 ------------------------------
df = exchange.fetch_ohlcv("BTCUSDT","1h",limit=200)
# --- 2) ATR -----------------------------------
df['tr']  = np.maximum(df.high-df.low,
                       np.abs(df.high-df.close.shift(1)),
                       np.abs(df.low -df.close.shift(1)))
df['atr'] = df.tr.rolling(ATR_PERIOD).mean()
# --- 3) RSI -----------------------------------
delta = df.close.diff()
gain  = delta.clip(lower=0).rolling(RSI_PERIOD).mean()
loss  = (-delta.clip(upper=0)).rolling(RSI_PERIOD).mean()
rs    = gain / loss
df['rsi'] = 100 - 100/(1+rs)
# --- 4) サポレジ -------------------------------
df['support']    = df.low.rolling(20).min()
df['resistance'] = df.high.rolling(20).max()
# --- 5) エントリー条件 ------------------------
for i in range(1,len(df)):
    if df.atr[i] > 100:                     # 荒れてるか?
        if df.rsi[i] < 30 and df.close[i] <= df.support[i]:
            exchange.create_order("BTCUSDT","market","buy",0.01)
        elif df.rsi[i] > 70 and df.close[i] >= df.resistance[i]:
            exchange.create_order("BTCUSDT","market","sell",0.01)
  • 高ボラRSI反発サポレジ到達
    3段フィルタで 無駄打ちを最小化 します。
  • ここを土台に、ロットサイズの自動計算や
    ATR×1.5 のダイナミック損切りを追加するとさらに堅牢になります。

では、実際の Python コードを流れで追ってみましょう。
今日のリポジトリ名は enhanced_trade_logic.py です。

  1. データ取得 CCXT で 200 本ぶんの 1 時間足 OHLCV を取得し、Pandas に入れます。
df = exchange.fetch_ohlcv("BTCUSDT", "1h", limit=200)
  1. ATR 計算
    • high-low
    • |high-前日終値|
    • |low-前日終値|
      3つの最大値を tr にして、14 本平均が atr
  2. RSI 計算
    終値の差を「上昇分」「下落分」に分け、14 本平均で “買われすぎ度” を算出。
  3. サポレジ
    • 20 本の最安値 → support
    • 20 本の最高値 → resistance
  4. エントリーループ ここが3段フィルター。条件を満たした瞬間に exchange.create_order で マーケット注文 0.01 BTC。
if atr[i] > 100:
    if rsi[i] < 30 and close[i] <= support[i]:
        BUY
    elif rsi[i] > 70 and close[i] >= resistance[i]:
        SELL

実際に走らせると、横ばいの時間帯はほぼ静か
値動きが出たときにだけエントリーしてくれるのが体感できます。

6. 期待できる効果

  • ノイズの排除
    ATR フィルターでレンジ相場をスルー。
  • 反転精度アップ
    RSI × サポレジで「止まりやすい+過熱」の二重条件。
  • 拡張性
    ほかのシンボルや Indikator も同じ型に差し替え可能。

バックテストすると、勝率よりも Profit Factor とドローダウン改善 が目に見えて伸びます。
「負けが薄くなる」って大事ですよね。


7. ▶️次の宿題

  1. パラメータ最適化
    ATR_THRESHOLD を 50〜150 でグリッドサーチ。
  2. 取引コスト込みの損益チェック
    手数料・スリッページを必ず含める。
  3. 片方向トレンド対策
    移動平均や ADX を加えて「強トレンド回避」も検討。

そして 次回の放送 では、APIキーのローテーション自動バックアップ をテーマに、
Bot を「止まらない・漏洩しない」方向へ強化します。


7. おまけ:LSTMとTransformerをざっくり復習

  • LSTM:長期記憶を保持できるゲート式RNN。
    60本(=1時間)のティックを食わせて「10分後にパンプする確率」を出す用途に最適。
  • Transformer:自己注意で全履歴を一度に見渡す。
    複数銘柄間の相関や長期パターンを捉えるときに強力。
  • 簡単な目安
    • 軽量&短期 → LSTM
    • 大規模&複雑 → Transformer

8. クロージング 

というわけで、今日は

ATR で荒れ相場を検知 →
RSI で過熱度を測定 →
サポレジでピンポイントエントリー

この3段フィルターで “負けにくい Bot” を作る方法をお届けしました。
ぜひ、自分でもパラメータを調整して試してみてください。

次回は セキュリティ強化編
APIキーの自動ローテーションと、クラウドバックアップで“資産とデータを守る”ノウハウを深掘りします。

それではまた、Yodaka でした。

-Bot