Signal Pilot
🔴 上級 • レッスン 57/82

取引の自動化:優位性をコードにし、感情を取り除く

読了時間 15分 • 自動執行とAPI
Signal Pilot
プロ向けトレーディング教育
0%
順調に進んでいます。
読み進めるとこのレッスンが完了になります

午前3時。スイープのセットアップが点灯する。あなたは眠っている。

ボットが注文を出し、ストップを置き、3Rを狙う。あなたが夢を見ている間に。

午前6時。目が覚める。ポジションは決済済み。+2.8Rの利益。コーヒーがうまい。

🎯 自動化が約束するもの

FOMOなし。恐怖なし。ためらいなし。あなたのルールを毎回完璧に実行するコードだけがある。

SFの話ではない。2024年のプロはこう取引している。

📉 ケーススタディ:マイクの1万9,000ドルの追証

場面: マイク・サリバン(合成事例)、Python開発者、口座20万ドル。AlpacaのAPIで動くボット(RSI<30でSPYを買う)。2020〜2023年のbacktest:勝率67%、+14万ドル。安全装置ゼロで本番投入。

惨事(CPIショックの朝): ボットは8週間動いた(+1万4,000ドル、勝率71%)。SPYが-2.8%のギャップで510ドルに寄り付く。ボットはRSI 22を見て買い続けた:510ドル、505ドル、495ドル、490ドルで各20万ドル = 80万ドルのポジション(レバレッジ4倍、平均取得499.87ドル)。15時:SPYは488ドル — 前日終値より7%安い — ポジションの評価額は78万1,000ドル、1万9,005ドルの含み損となり、追証が飛んできた。マイクは職場にいて何もできなかった。

立て直し: 破裂後の口座:19万5,000ドル。5つの安全装置を入れて作り直した:ポジションは最大5万ドル、VIX>25で停止、1日3トレードまで、高値から-5%で通知、-10%で完全停止。その後8か月の結果:19万5,000ドル → 21万8,000ドル(+12%)、そして安全装置が働かなかったことは一度もない。

教訓: 安全装置を最初にコードにすること:(1) ポジション上限、(2) ボラティリティフィルター、(3) 最大drawdownでの遮断、(4) 緊急停止。backtestは嘘をつく — ブラックスワンを飛ばしているからだ。

設問:マイクのボットはたった一晩の朝で追証を食らった。原因は何か?

A) 執行のslippageとレイテンシーの問題
B) 暴落中にAPIの接続が切れた
C) 安全装置がゼロ — ボットは1日で7%下げる中で4回ナンピンし、20万ドルの口座で80万ドル(レバレッジ4倍)のポジションを抱えた
D) コードのバグで注文が二重に出た
正解:C。 マイクは「RSIが売られすぎたら買う」はコードにしたが、ポジション上限もボラティリティフィルターも緊急停止も一度もコードにしなかった。暴落のさなかにボットはレバレッジ4倍のポジションを組み上げ、彼がキーボードにたどり着く前に1万9,005ドルの含み損と追証が確定した。立て直し:5つの安全装置を追加し、8か月で19万5,000ドルを21万8,000ドルに。安全装置を最初にコードにすること。
⚡ 明日からできること(クリックで展開)
  1. まずはペーパートレードから — 検証していない自動化に実弾を置いてはいけない。まずペーパー、そしてパート2の基準では数週間ではなく数か月だ。
  2. ポジション上限を足す — 最大ポジションサイズをコードに埋め込む:1トレードあたり口座の2%リスク、かつ想定元本の上限も。2%のリスクは2%のエクスポージャーではない。
  3. 緊急停止を作る — ワンクリックか1コマンドでボットの全活動を止める手動シャットダウンを用意する。
パート1:なぜ取引を自動化するのか

トレーディングにおける人間の問題

あなたは6か月かけて戦略を磨いた。backtestもした。フォワードテストもした。勝率62%。平均R 2.3。優位性は確認済みだ。

それを実弾で回し始める。結果は?

戦略の成績(完璧に従った場合) あなたの実際の成績 問題
1か月目 +4,200ドル(勝率62%) +1,800ドル(勝率48%) 3つのセットアップを見送った(連敗後の恐怖)
2か月目 +3,900ドル(勝率60%) -2,100ドル(勝率38%) リベンジトレード、損失後にサイズを倍にした
3か月目 +5,100ドル(勝率65%) +900ドル(勝率52%) ブレイクアウトのセットアップで迷い、シグナルの40%を逃した

身も蓋もない事実: あなたには利益の出る戦略がある。だが弱い環はあなた自身だ。

執行を殺す3つの要因

1. ためらい(恐怖による見送り)

  • 直前に2連敗したところだ。3つ目のセットアップが出る。あなたは思う。「確認を待とうか……」
  • 待つ。価格はあなたを置いて走る。4Rの勝ちトレードだった。恐怖のせいで取り逃がした。
  • 影響: 勝ちトレードの見送りはプラスの期待値を壊す

2. オーバートレード(FOMOでの入り)

  • 相場が上に走る。戦略は「セットアップなし」と言う。だが見ているだけに耐えられない。結局入る。
  • ストップも置かない。計画もない。あるのは願望だけ。反転。負ける。
  • 影響: でたらめな入りは優位性をノイズで薄める

3. ポジションサイズが一定しない

  • セットアップA:1%だけリスクを取る(直近の負けで慎重になっている)
  • セットアップB:5%リスクを取る(自信満々、「これは来る」)
  • セットアップAは3Rで勝つ。あなたは3%増やす。セットアップBは1R負ける。あなたは5%失う。差し引き:-2%。
  • 影響: サイズの判断を一度誤るだけで、良いトレード3回分が消える

💡 自動化が解決すること

自動売買ボットが持つのは 完璧な規律:

  • ためらいなし: セットアップ出現 → トレード執行(5連敗の直後でも)
  • FOMOなし: セットアップなし → ボットは待つ(相場がどれだけ退屈でも)
  • 完璧なサイズ: どのトレードもきっかり2%(あるいは設定した値)のリスク、毎回同じ

結果: backtestの成績が、そのまま実運用の成績になる。検証した優位性が、そのまま手に入る優位性だ。

スケールの問題(手動売買の限界)

手動売買はあなたの可能性に天井を作る:

制約 手動の限界 自動化した場合の可能性
市場 1〜3銘柄を見る(人間の注意力の限界) 50銘柄超を同時に監視
時間軸 多くても1〜2の時間軸 5分、15分、1時間、日足を一度にスキャン
時間 1日6〜8時間の取引(燃え尽きのリスク) 24時間取引(暗号資産)または立会時間をフルに(株式)
セットアップ 週に5〜10回とらえる(裁量トレーダーとして現実的) 週に50〜200回とらえる(ボットは眠らず、取りこぼさない)

例: ある手動トレーダーがES(S&P先物)を15分足で見ている。週に約8回セットアップをとらえる。月平均3,200ドルを稼ぐ — 1セットアップあたり約92ドルだ。

同じトレーダーを自動化すると: ボットはES、NQ、RTY(株価指数先物)に加えてGC、CL(金属とエネルギー)を5分、15分、1時間でスキャンする。週に約24回セットアップをとらえる。1セットアップ92ドルのままなら、月9,600ドルになる。

ここが解ける: あなたは上手く取引しているのではない。より多く取引しているのだ — 燃え尽きずに。

そして天井: ES、MES、SPY、QQQはおおむね同じトレードだ。相関の高い銘柄を足してもシグナルの数が増えるだけで優位性は増えない — そして4つが同時に点灯すればリスクだけが増える。数えるべきはティッカーではなく、相関していない機会だ。

自動化が向く場面と向かない場面

自動化が最も向くのは:

  • ルールベースの戦略: 入り方と出方の基準が明確なもの(例:「価格が安値を掃いて、そこを取り返したら買う」)
  • 高頻度のセットアップ: 週に10回以上点灯する戦略(回数がコードを書く手間に見合う)
  • 退屈な執行: 裁量が価値を足さない戦略(機械的な優位性)

自動化が苦手なのは:

  • 裁量のセットアップ: 「*しっくり来る*ときだけ取る」(直感はコードにできない)
  • 文脈に依存するトレード: 「このブレイクアウトは出来高が平均の2倍超で、かつニュースの材料があるときに機能する」(複雑な文脈は数値化が難しい)
  • 低頻度の戦略: 月に1〜2回しか点灯しないセットアップ(コードを書く労力に見合わない)

⚠️ 自動化は悪い戦略を直さない

よくある間違い: 「手動ではうまくいかない戦略なんだ。ボットにすれば利益が出るかも?」

実際: 自動化はあなたの戦略をコードどおり正確に実行する。戦略に優位性がなければ、ボットは着実に負ける — ただし、より速く、より効率よく。

ルール: 手動で100トレード以上を重ねて期待値がプラスだと確かめた戦略だけを自動化すること。自動化は優位性を増幅する。優位性を生み出しはしない。

パート2:APIとブローカーを選ぶ

ブローカーAPIの比較

すべてのブローカーが自動売買に対応しているわけではない。対応していても、品質もコストも機能も大きく違う。

自動売買に向くブローカーAPIの上位

ブローカー 取扱資産 APIの品質 コスト 向いている場面
Alpaca 株式、ETF、暗号資産 ⭐⭐⭐⭐⭐ 優秀(RESTful + WebSocket、ドキュメントが充実) 株式は手数料無料、暗号資産は0.1〜0.25% 初心者(最も扱いやすいAPI、無料のペーパートレード、Pythonライブラリ)
Interactive Brokers(IBKR) 株式、オプション、先物、為替、CFD(世界の市場) ⭐⭐⭐⭐ 良好(強力だが複雑、学習曲線が急) 株式1株0.005ドル、オプション1枚0.65ドル 上級トレーダー(オプションや先物を自動化したい、世界の市場に届きたい)
Binance 暗号資産(600ペア超。本体の取引所は米国居住者には閉じており、Binance.USは別の、はるかに小さい取引所) ⭐⭐⭐⭐⭐ 優秀(REST + WebSocket、高スループット) 現物0.1%、先物0.02〜0.04%(BNB割引込み) 暗号資産のアルゴトレーダー(24時間市場、厚い流動性)
Schwab(旧TD Ameritrade/thinkorswim) 株式、オプション、先物 ⭐⭐⭐ 並(旧TD AmeritradeのAPIは2024年に廃止。後継のSchwab Trader APIはまだ成熟途上) 株式0ドル、オプション1枚0.65ドル 既存のSchwab利用者(口座があり、自動化したい)
TradeStation 株式、オプション、先物 ⭐⭐⭐⭐ 良好(EasyLanguageで記述、backtesting内蔵) 株式0ドル、オプション1枚0.60ドル アクティブトレーダー(外部でコードを書かず統合環境で済ませたい)

手早い判断ガイド

Alpacaを選ぶなら: 自動化を学んでいるとき(最も扱いやすいAPI、無料のペーパートレード、最良のドキュメント)。 Interactive Brokersを選ぶなら: オプション・先物・世界の市場が必要なとき(全資産クラス、1株0.005ドル、機関投資家水準)。 Binanceを選ぶなら: 暗号資産だけのとき(24時間市場、600ペア超、手数料0.1%)。

💡 プロの助言:必ずペーパートレードから始める

上に挙げたブローカーはどこもペーパートレード(実データを使った仮想売買)を提供している。

推奨スケジュール:

  1. 1〜2週目: APIに接続し、基本的な発注を試す(買い、売り、逆指値)
  2. 3〜8週目: 戦略をコードにし、ペーパートレードで動かし、毎日確認する
  3. 9〜12週目: 戦略の成績を検証する(backtestと一致しているか?)
  4. 4か月目以降: ペーパーで3か月連続して利益が出ていれば、資金の10%で実弾に移す
  5. 6か月目以降: 引き続き利益が出ていれば、フル配分まで引き上げる

ペーパートレードは絶対に飛ばさない。 マイク(上のケーススタディ)は飛ばして、一晩の朝で追証を食らった。

パート3:最初の自動戦略を作る

トレードのアイデアから実行可能なコードへ

手動の戦略がある。それをボットが実行できるコードにどう翻訳するのか。

戦略を翻訳する5ステップの枠組み

ステップ1:エントリー条件を定める(明示的なルールだけ)

手動トレーダーはこう考える: 「価格が安値を掃いて、上に戻ったら買う。」

ボットにはこれでは曖昧すぎる。ボットには厳密なロジックが要る:

  • 「スイープ」とは? → 現在の足の安値が、直前のスイング安値を少なくとも0.3%下回ること
  • 「上に戻る」とは? → 1〜3本の足のうちに、価格がスイング安値より上で引けること
  • 「スイング安値」とは? → 直近20本の足のうち最も低い安値

コードにすると:

swing_low = min([bar.low for bar in last_20_bars])
current_low = current_bar.low
current_close = current_bar.close

if current_low < swing_low * 0.997:  # 0.3%下まで掃いた
    if current_close > swing_low:     # 取り返した
        ENTRY = True  # スイープのセットアップ確定

ステップ2:エグジット条件を定める(ストップと目標)

手動トレーダー: 「ストップはスイープの下に置いて、リスクリワード3対1で利確する。」

コードにすると:

entry_price = current_close
stop_loss = swing_low * 0.995  # スイープのすぐ下
stop_distance = entry_price - stop_loss
target = entry_price + (stop_distance * 3)  # 3Rの目標

ステップ3:ポジションサイズを定める(リスク管理)

手動トレーダー: 「1トレードあたり2%くらいリスクを取る。」

コードにすると:

account_equity = 100000  # 10万ドルの口座
risk_per_trade = 0.02    # 2%
risk_amount = account_equity * risk_per_trade  # 2,000ドル

stop_distance = entry_price - stop_loss
position_size = risk_amount / stop_distance  # 買う株数

# 例:エントリー520ドル、ストップ518ドル、距離2ドル
# ポジションサイズ = 2,000ドル / 2ドル = 1,000株
# ...つまり10万ドルの口座でSPYを52万ドル。2%のリスクルールは
# 想定元本について何も言わない。狭いストップは静かにレバレッジを買う。
max_notional = account_equity * 1.5   # 上限は自己資本の1.5倍で固定
position_size = min(position_size, max_notional / entry_price)
# 上限適用後:288株。実際のリスクは2,000ドルではなく576ドル -
# それが代償であり、その代償こそがあなたを退場させずに残す。

ステップ4:トレード管理を定める(任意)

分割して降りるか。ストップを追随させるか。部分利確するか。

例: 「2Rで50%利確し、残りは3Rまで走らせる。」

if current_price >= entry_price + (stop_distance * 2):
    SELL_HALF = True  # 2Rで50%を利確
    # 残り50%のストップを建値に移す

ステップ5:フィルターを定める(悪いセットアップを弾く)

どんな条件がセットアップを無効にするか。

  • 時間フィルター: 寄り付きから2時間だけ取引する(東部時間9:30〜11:30)
  • ボラティリティフィルター: VIXが30を超えたらトレードを見送る(荒れすぎ)
  • トレンドフィルター: 価格が50期間EMAの上にあるときだけロングのセットアップを取る
if VIX > 30:
    SKIP_TRADE = True  # 相場が荒れすぎ

if current_time < "09:30" or current_time > "11:30":
    SKIP_TRADE = True  # 取引ウィンドウの外

✅ 戦略の完全な例(スイープボットのロジック)

5つのステップを実行可能な擬似コードにまとめる:

# ステップ1:エントリー条件
swing_low = min([bar.low for bar in last_20_bars])
if current_bar.low < swing_low * 0.997:  # スイープ
    if current_bar.close > swing_low:     # 取り返した

        # ステップ2:エグジット
        entry = current_bar.close
        stop = swing_low * 0.995
        target = entry + ((entry - stop) * 3)

        # ステップ3:ポジションサイズ
        risk_amount = account_equity * 0.02
        size = risk_amount / (entry - stop)

        # ステップ4:トレード管理(2Rで50%)
        profit_target_partial = entry + ((entry - stop) * 2)

        # ステップ5:フィルター
        if VIX < 30 and time_in_window():
            PLACE_ORDER(symbol, size, entry, stop, target)

これでもう実行できる。ボットはこのルールを毎回完璧に守れる。

ボットの完全な実装(スイープ反転戦略)

import alpaca_trade_api as tradeapi
from alpaca_trade_api.rest import TimeFrame
import os, time

# セットアップ
API_KEY = os.getenv('ALPACA_API_KEY')  # 絶対にコードへ直書きしない!
API_SECRET = os.getenv('ALPACA_API_SECRET')
api = tradeapi.REST(API_KEY, API_SECRET, 'https://paper-api.alpaca.markets')

MAX_NOTIONAL_MULT = 1.5   # 自己資本の1.5倍を超えて持たない
MAX_DAILY_LOSS = 0.03     # 緊急停止:-3%でその日は撤退

def get_swing_low(bars, lookback=20):
    # 現在の足を除くこと。含めるとスイング安値が現在の安値そのものになり、
    # 下のスイープ判定が真になることはなく、ボットは一度も発火しない。
    lows = [bar.l for bar in bars[-(lookback + 1):-1]]
    return min(lows)

def check_sweep(current_price, current_low, swing_low):
    # スイープ = 現在の安値 < スイング安値(0.3%)、その後に上へ取り返す
    if current_low < swing_low * 0.997 and current_price > swing_low:
        return True
    return False

def calculate_position_size(api, entry, stop):
    equity = float(api.get_account().equity)
    risk_amount = equity * 0.02                        # 2%のリスク
    by_risk = risk_amount / (entry - stop)
    by_notional = (equity * MAX_NOTIONAL_MULT) / entry  # マイクが省いた安全装置
    return int(min(by_risk, by_notional))

def kill_switch_tripped(api):
    acct = api.get_account()
    move = (float(acct.equity) - float(acct.last_equity)) / float(acct.last_equity)
    return move <= -MAX_DAILY_LOSS

def in_position(api, symbol):
    # ブローカーに聞くこと。ローカル変数を信用しない。夜のうちに約定して
    # 決済されたブラケットが、翌日のセットアップを塞いではいけない。
    try:
        api.get_position(symbol)
        return True
    except Exception:
        return False

def place_bracket_order(api, symbol, size, entry, stop, target):
    try:
        order = api.submit_order(
            symbol=symbol, qty=size, side='buy', type='limit',
            limit_price=entry, time_in_force='gtc',
            order_class='bracket',
            stop_loss={'stop_price': stop},
            take_profit={'limit_price': target}
        )
        print(f"✓ 注文: {size}株 @ ${entry} | ストップ: ${stop} | 目標: ${target}")
        return order
    except Exception as e:
        print(f"✗ 注文失敗: {e}")
        return None

def run_bot(symbol='SPY'):
    print(f"ボット起動。{symbol}のスイープのセットアップを監視中...")

    while True:
        try:
            if not api.get_clock().is_open:      # 安全装置1:立会時間
                time.sleep(60)
                continue
            if kill_switch_tripped(api):         # 安全装置2:1日の損失上限
                print("🛑 1日の損失上限に到達。撤退します。")
                break

            bars = api.get_bars(symbol, TimeFrame.Minute, limit=50)
            current_price = bars[-1].c
            current_low = bars[-1].l
            swing_low = get_swing_low(bars)

            if not in_position(api, symbol) and check_sweep(current_price, current_low, swing_low):
                print(f"🎯 スイープ検知 @ ${current_price}")
                entry = current_price
                stop = swing_low * 0.995
                target = entry + (entry - stop) * 3  # 3R
                size = calculate_position_size(api, entry, stop)   # 安全装置3:想定元本の上限
                if size > 0:
                    place_bracket_order(api, symbol, size, entry, stop, target)

            time.sleep(60)  # 1分ごとに確認
        except Exception as e:
            print(f"エラー: {e}")
            time.sleep(60)

run_bot()  # 約75行 - そのうち最も重要な3行が安全装置だ。

これが何をしているか: Alpacaに接続し、SPYの1分足を取得し、スイープ後の反転(安値がスイング安値の下を掃いてから取り返す)を検知し、2%リスクでサイズを算出したうえで 想定元本で上限をかけ、ブラケット注文(エントリー + ストップ + 3Rの目標)を出し、それを60秒ごとに繰り返す — ただし市場が開いている間だけ、ブローカーがポジションなしと答えたときだけ、そしてその日が-3%になったあとは決してやらない。完璧な規律、ゼロの感情、そして3つのブレーキ。

💡 腑に落ちる瞬間

あなたは今、人間という層を取り除いた。「これ、取るべきか?」はもうない。「もう少し待とうか」ももうない。

セットアップ出現 → ボットが取引。出現しない → ボットは待つ。完璧な規律。

パート4:本番投入(ここが難所)

ペーパートレード ≠ 実運用

あなたのボットはペーパーでは完璧に動く。実弾に移す。落ちる。注文が弾かれる。わけがわからない。

本番環境へようこそ。

よくあるエラー(とその扱い方)

よくあるエラー: 接続タイムアウト、注文の拒否、部分約定、レート制限、市場が閉じている。 対処: リトライ処理(3回、指数的バックオフ)、事前チェック(資金、立会時間、価格)、部分約定の処理、レート制限(毎分200リクエスト)、立会時間の確認(東部時間9:30〜16時)。プロのボットはエラーを丁寧に扱う。

リトライ処理(必須)

import uuid

def place_order_with_retry(api, **order_params):
    """注文の送信を最大3回まで再試行する"""
    max_retries = 3

    # どの試行でも同じidを使う。最初のリクエストが実際にはブローカーへ届き、
    # 応答だけが失われた場合、再試行は重複として弾かれる。ポジションが
    # 二倍になることはない。
    order_params.setdefault('client_order_id', f"bot-{uuid.uuid4()}")

    for attempt in range(max_retries):
        try:
            order = api.submit_order(**order_params)
            return order  # 成功!

        except Exception as e:
            if attempt < max_retries - 1:
                wait = 2 ** attempt  # 1秒、次に2秒(指数的バックオフ)
                print(f"注文失敗: {e}. {wait}秒後に再試行...")
                time.sleep(wait)
            else:
                # 最後の試行も失敗
                print(f"{max_retries}回試行しても注文失敗: {e}")
                # 通知を送る(メール、SMS)
                raise  # 例外を投げ直す

監視とアラート(きわめて重要)

あなたのボットはクラウドのVPSで動いている。あなたは夕食中だ。ボットはエラーに突き当たる。

ここでちょうど折り返し地点です。重要な戦略はすでに学びました。

順調ですね! 必要なら軽く伸びをして、そのあと先の応用的な内容に進みましょう。

どうやって気づくのか。

解答: アラートで。

import smtplib
from email.mime.text import MIMEText

def send_alert(subject, message):
    """メールでアラートを送る"""
    msg = MIMEText(message)
    msg['Subject'] = subject
    msg['From'] = 'bot@yourbot.com'
    msg['To'] = 'you@gmail.com'

    # GmailのSMTPで送る - ここにはアカウントのパスワードではなく
    # Gmailのアプリパスワードが要る。基本認証は2022年に停止された。
    with smtplib.SMTP('smtp.gmail.com', 587) as server:
        server.starttls()
        server.login('bot@yourbot.com', os.getenv('EMAIL_PASSWORD'))
        server.send_message(msg)

# 使い方
try:
    # トレードのロジック
    pass
except Exception as e:
    send_alert(
        subject="🚨 トレーディングボットのエラー",
        message=f"ボットがエラーに遭遇しました: {e}"
    )
    raise

これで何かが壊れても数分で気づける。

🚨 緊急停止(交渉の余地なし)

次の場合、ボットは自動で取引をやめなければならない:

  • 1日のdrawdownが-3%を超えたとき(マイクの作り直した版は、高値から-10%で完全に停止もした)
  • 5連敗したとき
  • APIのエラーが1時間に10件を超えたとき
  • 想定外の挙動を検知したとき

これをコードにすること。テストすること。あなたの口座がそこに懸かっている。

ホスティング:ボットをどこで動かすか

自宅PCが破綻する理由

  • 停電: PCが落ち、ボットが止まる
  • 回線障害: 接続なし = トレードの取りこぼし
  • Windowsの更新: 午前3時に自動再起動 = ボット死亡
  • あなた: 「ちょっとPCを再起動するだけ……」

稼働率: 95%(アルゴ取引には受け入れがたい)

クラウドVPSが勝つ理由

  • 稼働率99.9%: AWS、DigitalOcean、Linode
  • 停電なし: 冗長化された電源、バックアップ
  • 速い回線: ブローカーのAPIまで低レイテンシー
  • 自動再起動: ボットが落ちた? 30秒で復帰

コスト: 月5〜20ドル(あなたが買う中で最も安い優位性の増幅装置)

パート5:現実の点検

自動化は「置いて忘れる」ものではない

ボットを投入する。1か月動く。成功率65%。backtestどおりだ。あなたは有頂天になる。

2か月目:成功率が48%に落ちる。わけがわからない。

何が起きたか。

相場のレジームが変わったのだ。 あなたの戦略はトレンド相場で機能する。相場はレンジに移った。ボットは取引を続けた。成績は悪化した。

🚨 厳しい事実

自動化はあなたの優位性を増幅する。だがレジームの変化に自動で適応はしない。

それでも監視し、見直し、調整する必要がある。ただし頻度はずっと低い。

ボットの月次メンテナンス項目

1. 成績の指標: 勝率はbacktestの5%以内か? 平均Rはプラスか? Drawdownは許容範囲か? Slippageは悪化していないか? 2. エラーログ: 接続エラー、注文の拒否、想定外のケース。 3. レジーム点検: 相場はまだこの戦略に向いているか? VIXが高い → 一時停止。低ボラ → ブレイクアウトは苦戦する。

🎓 要点

  • 自動化は感情を取り除く — だが悪い戦略は直さない
  • APIに手軽に触れるならAlpaca(株式)かBinance(暗号資産)から始める
  • 実弾に移る前に3〜6か月ペーパートレードする
  • エラー処理が肝心:リトライ処理、アラート、緊急停止
  • クラウドVPS(月5〜20ドル)でホスティングし、稼働率99.9%を取る
  • 月に一度は点検:成績、エラー、レジームとの相性

📝 実践演習

最初のAPIトレーディングスクリプトを作る

  1. Alpacaのペーパートレード口座を用意する
    • alpaca.marketsで登録する(ペーパートレードは無料)
    • APIキーとシークレットを発行する
    • Pythonライブラリを入れる: pip install alpaca-trade-api
  2. 簡単な戦略スクリプトを書く
    • AlpacaのAPIに接続する
    • 60秒ごとにSPYの価格を取得する
    • 基本ロジックを実装する:価格が20期間SMAを上抜けたら買い注文を出す
    • ポジションサイズの計算を追加する(1トレードあたり2%のリスク)
    • -1Rにストップロスを入れる
  3. エラー処理を追加する
    • APIの呼び出しをtry/exceptで包む
    • すべてのエラーをファイルに記録する
    • リトライ処理を実装する(3回まで)
  4. ペーパートレードで1週間試す
    • 執行を監視する:注文は正しく約定しているか?
    • ログを確認する:接続エラーはないか?
    • 成績を振り返る:backtestと一致しているか?

目的: 最初の自動売買スクリプトを作り、ペーパートレードで動かす。実弾を張る前に基本を身につけよう。

🎮 理解度チェック(気楽にどうぞ)

設問1:ペーパートレードで完璧に動くボットを書いた。実弾に移る前の最低限のテスト期間は?

A) 1週間(動くなら投入だ!)
B) 1か月(利益が出るか見るには十分)
C) 3〜6か月(さまざまな相場条件での一貫性を確かめる)
D) テストは不要(backtestで十分)

設問2:ボットの成功率はbacktestで65%だったが、実運用2か月で48%になっている。最も可能性の高い原因は?

A) ブローカーがあなたのトレードを妨害している
B) コードにバグがある(挙動がランダム)
C) 相場のレジームが変わった(戦略が今の環境に合っていない)
D) Backtestingは無意味(実運用では必ず崩れる)

ここまで読んだあなたは、自動化が魔法ではないと理解した。規律ある執行を規模で回すことだ。優位性をコードにし、厳しく検証し、慎重に投入し、絶えず監視しよう。

関連レッスン

上級 第55回

トレーディングにおける機械学習

MLモデルを使って自動売買のシグナルを生成する。

レッスンを読む →
中級 #32

上級のbacktesting

自動戦略を実弾に出す前に検証する。

レッスンを読む →
上級 #59

パフォーマンス要因分析

どの自動戦略がリターンに寄与しているかを分析する。

レッスンを読む →

⏭️ 次回

レッスン #58:上級ポートフォリオ理論 — 現代ポートフォリオ理論、効率的フロンティア、リスクパリティ、そしてプロのポートフォリオ構築の枠組み。

💬 ディスカッション (コメント0件)

0/1000

コメントを読み込んでいます…

← 前のレッスン 次のレッスン →
教育目的のみ。 トレードには重大な損失リスクが伴います。金融助言ではありません。過去の実績は将来の結果を保証するものではありません。