こんにちは、AIシステムズです。
この記事は、代表コバが自分で日経マイクロ先物の自動売買システムを実装した過程をもとに、AIで構成・執筆し、弊社にて最終チェックを行ったものです。
📚 本記事はシリーズ第1回 構築編です
- 第1回 構築編 ← 今ここ
- 第2回 1ヶ月運用レポート編(近日公開)
- 第3回 パラメータ調整編(予定)
- 第4回 ミニ昇格編(予定)
「個人投資家が、AIアシスタントを相棒にして、どこまで自動売買システムを作れるのか?」――この問いに正面から取り組んだ記録を、本シリーズで公開します。結論から書くと、Claudeと一緒に開発した日経マイクロ先物の完全自動売買システムが完成し、すでに実弾運用フェーズに入っています。初日は4回ラウンドトリップ成立、収支プラスで終了しました。
本記事ではここに至るまでの「設計」「実装」「ハマりどころ」「初日の検証結果」を、再現可能な粒度で残します。
- なぜ題材に 日経マイクロ先物 を選んだのか
- 楽天証券 マーケットスピードII(MarketSpeed2 RSS)と Excel VBA の組み合わせ
- Claude をどう使って実装を進めたか
- 実弾発注で本当にハマった9つの落とし穴
- 多層化した安全装置の中身
目次
- なぜ日経マイクロ先物を選んだのか
- 使用したツール・環境
- 戦略の設計:朝レンジブレイクアウト
- Claude を使った開発の進め方
- 多層の安全装置
- 実装で本当にハマった9つの落とし穴
- VBA コードの主要ポイント
- 初日の実弾検証結果
- Claude を使ってよかった点・気をつけた点
- 次回予告
- まとめ
なぜ日経マイクロ先物を選んだのか
個人で自動売買を組むときの題材選びは、システムの成否を半分決めます。筆者は最終的に 日経225マイクロ先物 を選びました。理由を整理すると次のとおりです。
- 1pt=10円で検証コストが圧倒的に低い。100pt 負けても1,000円。実弾フェーズに入っても致命傷にならない金額でロジックを磨ける。
- 楽天証券 RSS との相性が抜群。
RssFOPxxx系の関数群で板・建玉・発注・約定が一通り取れる。 - 銘柄選定が不要。日経225というシングル銘柄なので、ロジックがクリーンに書ける。株のような特別気配・ストップ高安に振り回されない。
- 取引時間が規則的。日中は9:00寄付〜15:15引け、夜間は16:30〜翌6:00。VBA 側のスケジューラと相性がよい。
- スケールパスが明確。マイクロ(1pt=10円)→ ミニ(100円)→ ラージ(1,000円)と、同じロジックのまま 最大100倍まで段階的にスケールできる。
- レバレッジは効くがマイクロなら最大ロスが小さい。検証期間の損失上限が読める。
他の候補との比較は次のとおりです。
| 選択肢 | 長所 | 短所 | 自動売買適性 |
|---|---|---|---|
| 株式 | 銘柄豊富、流動性 | 銘柄選定がボトルネック、特別気配・ストップ高安等の不規則性 | △ |
| FX | 24時間、低コスト | 個人負け率が高い、指標発表時の暴騰暴落リスク | △ |
| オプション | 戦略の自由度 | ギリシャ文字/IV/限月など要素が多すぎ、自動売買向きでない | × |
| 日経マイクロ先物 | 低コスト・単一銘柄・規則的時間・スケール可 | 夜間流動性は薄い | ◎ |
「いきなり大きく」ではなく 最小単位で実弾を回しながら改善する という方針に、マイクロ先物は最適な乗り物でした。
使用したツール・環境
本システムを構成するツールは次のとおりです。
- 楽天証券 マーケットスピード II:本体トレーディングツール。発注インフラの本丸。
- マーケットスピード II RSS:Excel から相場・建玉・発注を扱える純正アドイン。
RssFOPxxx関数群を提供。 - Microsoft Excel(Office 365):戦略ロジックと設定を保持する母艦。
- Excel VBA:シグナル判定・発注・約定確認・ログ書き込みの実装言語。
- Claude(Anthropic 社の対話型AI):本開発の主役。日本語の要件をコードに落とす役割。
Claude の使い方はシンプルです。「要件を日本語で伝える → コードが生成される → エラーが出れば画面やテキストを共有 → 修正版が返ってくる」の繰り返し。VBA は型・スコープ・遅延バインディングなど癖がある言語ですが、Claude は楽天 RSS の関数仕様を含めて把握しており、ほぼ初日から実装に入れました。
戦略の設計:朝レンジブレイクアウト
最初のロジックは、王道の 朝レンジブレイクアウト を採用しました。
- 9:00〜9:30 の30分で 高値・安値(朝レンジ) を記録
- 10:00〜13:30 の間に価格がレンジを上抜けたら LONG、下抜けたら SHORT
- 損切り 100pt、利確 200pt、トレーリング 20pt 戻り、14:45 に強制決済
- ブレイク超過幅に応じて 1〜3 枚の動的枚数(5pt 未満は様子見)
- 1日1取引のみ。負けたら撤収、勝っても撤収。
理由は次のとおりです。寄付き直後はボラが出やすく、王道の機械的戦略との相性が良い。ただし寄付き直後は ダマシ も多いので、9:30 までレンジを観察してエントリーは 10:00 以降に限定します。1日1取引としているのは、損失コントロールを最優先したいから。連敗の精神的ダメージは個人投資家にとって最大の敵で、ここは 「機会損失を許容してでも防御を優先」 という設計です。
これらのパラメータは全部 Excel の Config シートで管理し、コード本体を触らずに調整できる構成にしています。
Claude を使った開発の進め方
開発は次の順で進めました。
- 仕様を日本語で全部書く:「日経マイクロ先物を朝レンジブレイクで自動売買したい。1日1回まで、損切100pt、利確200pt、寄付き後30分は様子見……」とベタ書きで Claude に渡す。
- シート設計から AI と相談する:
Config / Market / Position / Signal / Log / PnLの6シート構成にした。役割分離を最初に決めると、後の改修で衝突しない。 - PAPER(仮想売買)モードからスタート:実発注はしないが、シグナル発生→約定想定→PnL記録までを一通り回す。ここで2日かけてロジックの挙動を確認した。
- 安全装置を先に組む:機能拡張より先に「止め方・落ち方」を実装した(後述)。
- LIVE モードへの切替を二重承認制にする:
LIVE_SETUP_CONFIRMEDとLIVE_CONFIRMEDの両方がTRUEでないと実発注に行かない。 - 最小ロットで実弾検証:マイクロ1枚から。ロジックよりも環境(権限・設定・証拠金)の検証が目的。
特に重要なのは、「実弾発注のロジックは AI に任せきらず、人間が必ず最後に読む」 という線引きです。Claude は安全な提案をしてくれますが、口座の中身に責任を持つのは人間。コードレビューは AI と人で二重に行う運用にしました。
多層の安全装置
自動売買で最も怖いのは 「想定外の状態で動き続けること」 です。発注ループの暴走・建玉ズレ・データ停止のいずれも、放置すれば破産経路に直結します。そこで次の安全装置を実装しました。
- Tick 二重起動防止:
g_IsRunningフラグで、前回 Tick 処理中の再入を遮断。 - OnTime 予約のリトライ:
Application.OnTimeの取消失敗は無視せず、WARN ログに残してリトライ。 - 注文ロック:直近の注文から60秒は新規発注禁止。連打事故を物理的に防ぐ。
- RSS 停止検知:RSS の更新時刻を毎 Tick 監視し、180秒以上更新が止まったら取引停止&通知。
- 緊急停止マクロ
EmergencyStop:ボタン1つで全予約解除・全フラグFALSE・全ポジションは手動決済へ。 - 建玉ズレ検知:Excel 側の建玉状態と楽天側の
RssFOPPositionListを毎 Tick 照合。ズレたら停止。 - PENDING タイムアウト:注文後30秒以内に約定確認が取れなければ自動キャンセル&停止。
- 10重ガード
IsLiveOrderAllowed:MODE/AUTO_MODE/QTY 範囲/取引回数上限/時刻範囲/RSS 鮮度/建玉ズレなし/注文ロック解除済/二重承認済/緊急停止フラグ未セットの全てを満たさないと発注しない。
「機能を増やす前に止め方を作る」。これが個人開発の自動売買で最も大事な原則だと、今回の開発を通じて改めて確信しました。
実装で本当にハマった9つの落とし穴
ここがシリーズで最も価値ある部分です。実弾発注で本当に詰まったエラーと、その解決法を9個まとめます。
① 成行注文に価格0を渡してエラー
入力エラー:成行指定時は、注文価格の指定はできません
最初に必ず引っかかります。成行のときに Price:=0 を渡すと弾かれる。解決:Empty を渡す。VBA の Empty はバリアントの未初期化値で、楽天 RSS 側は「指定なし」と解釈します。
② 当セッション注文に注文期限を渡してエラー
入力エラー:注文期限は、執行条件が5(期間指定)の場合のみ入力してください
こちらも同じく、当セッション扱いのときは期限フィールドに Empty を渡します。「条件不要のフィールドは 0 でも空文字でもなく Empty」と覚えておくのが安全です。
③ MarketSpeed II 本体側で「RSS発注機能」が無効だった
コードは正しいのに ret が空のまま戻ってくる。原因は MarketSpeed II 本体側の設定でした。解決:設定 → 注文・約定2 → RSS注文機能を ON。デフォルトは OFF なので最初に必ず確認します。
④ 取引暗証番号の省略設定が漏れていた
関数を呼んでも沈黙、エラーすら出ない。解決:設定 → 注文・約定2 →「取引暗証番号を省略する」にチェック。自動売買の前提として、暗証番号入力ダイアログをスキップする設定が必要です(自己責任で)。
⑤ 注文確認画面が裏で出ていた
画面の奥でモーダルが出ていて、それが閉じられるまで RSS が空応答を返し続け、30秒タイムアウトで EmergencyStop が発火するという挙動。解決:Excel リボン「マーケットスピードII」→ 各種設定 → RSSの設定 →「注文確認画面」「取引注意喚起画面」をいずれも OFF。
⑥ 受入証拠金が不足していた(本命)
上記すべて設定済みでも ret が空のまま続く現象が再発。原因は 受入証拠金不足。マイクロといえど証拠金は必要なので、口座残高を確認して入金 → 即座に約定が通るようになりました。「設定を全部見直したのに動かない」ときは、実は資金条件が原因というのは盲点になりがちです。
⑦ 銘柄種類フィルタ N225UF が照会系で効かない
発注系の RssFOPCode("N225UF",…) は機能するのに、照会系の RssFOPPositionList("N225UF",…) では建玉が見えない、という現象。解決:照会系はフィルタを空にして、VBA 側で銘柄コードでフィルタする。
⑧ Application.OnTime の 1004 エラー
Tick の予約・取消で時々 1004 エラーが発生。完全な抑止は難しいので、On Error Resume Next で囲み、失敗時は WARN ログを残してリトライ。これは仕様と割り切る運用にしています。
⑨ RssFOPOpenOrder_V の戻り値の解釈
戻り値が 注文番号ではなく、空文字のことが多い。発注は成功しているのに戻り値だけ空、というケースが頻発する。解決:注文番号は RssFOPOrderList から銘柄+数量+時刻で照合して取得。戻り値はログ保存用にだけ持っておく方針にしました。
VBA コードの主要ポイント
完全なコードは長すぎるのでシリーズ後半で部分公開していきますが、肝になる部分だけ抜粋します。
(a) Tick の二重起動防止
Public Sub OnTick()
If g_IsRunning Then Exit Sub
g_IsRunning = True
On Error GoTo Cleanup
Call ProcessTick
Cleanup:
g_IsRunning = False
End Sub
g_IsRunning をモジュールレベルで持ち、Tick 中の再入を一切受け付けない構成です。
(b) 10重ガード IsLiveOrderAllowed
Public Function IsLiveOrderAllowed() As Boolean
IsLiveOrderAllowed = False
If GetMode() <> "LIVE" Then Exit Function
If Not GetAutoMode() Then Exit Function
If GetTodayTradeCount() >= MAX_TRADES_PER_DAY Then Exit Function
If Not IsRssFresh() Then Exit Function
If IsPositionMismatch() Then Exit Function
If IsOrderLockActive() Then Exit Function
If Not GetLiveSetupConfirmed() Then Exit Function
If Not GetLiveConfirmed() Then Exit Function
If GetEmergencyStopFlag() Then Exit Function
IsLiveOrderAllowed = True
End Function
ガードは 全て True で初めて発注に進む。1つでも欠ければ即 Exit Function です。
(c) RssFOPOpenOrder_V の呼び出し
ret = Application.Run("RssFOPOpenOrder_V", _
Code, BuySell, Qty, _
OrderType, Empty, _
SessionType, Empty, _
AccountType, Password)
指定不要なフィールドは Empty を必ず使うのがポイントです。
(d) 約定確認フロー ConfirmPendingEntry
If Now - g_PendingSince > TimeSerial(0, 0, 30) Then
Call CancelPending
Call EmergencyStop("PENDING TIMEOUT")
Exit Sub
End If
orderInfo = LookupOrderList(g_PendingCode, g_PendingQty)
If orderInfo.Status = "FILLED" Then
Call UpdatePositionFromOrder(orderInfo)
End If
発注後30秒以内に約定が確認できなければ自動キャンセル&停止。
(e) WritePnLRow による損益自動記録
With Sheets("PnL")
nextRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(nextRow, 1).Value = Date
.Cells(nextRow, 2).Value = Direction
.Cells(nextRow, 3).Value = Qty
.Cells(nextRow, 4).Value = EntryPrice
.Cells(nextRow, 5).Value = ExitPrice
.Cells(nextRow, 6).Value = PnL
.Cells(nextRow, 7).Formula = "=SUM(F2:F" & nextRow & ")"
End With
ラウンドトリップが完了するたびに PnL シートに1行追加し、累計を再計算します。
(f) 起動時診断 DiagnoseLiveSetup
RSS 接続・銘柄取得・発注権限・建玉照会・暗証番号設定・残高の6項目を順番にチェックし、1つでも NG があれば LIVE に遷移しません。「気付かないまま動き始める」を避けるための最終防衛線です。
初日の実弾検証結果
構築編の締めとして、実弾運用初日の結果を簡潔に共有します。
- PAPER モードで2日かけて挙動検証
- LIVE 初日:朝チェック → 9:00 スタンバイ → 朝レンジ形成 → 10:00 エントリー待機
- 初取引:4回ラウンドトリップ成功(買建 → 転売 を含む)
- 累計損益:+250円(初日プラスで終了)
- PnL シートに自動記録(日付/方向/数量/建値/決済値/損益/累計)
金額は小さいですが、目的は 「資金を増やすこと」ではなく「実弾環境でロジックが想定どおり動くこと」 の検証なので、十分な手応えでした。本格的な統計(勝率・最大DD・時間帯別パフォーマンス)は、第2回の運用レポート編で公開します。
Claude を使ってよかった点・気をつけた点
個人開発で AI アシスタントを相棒にして感じた、率直なところです。
よかった点
- 要件を日本語で伝えるだけで、動く VBA コードが返ってくる
- エラーメッセージを貼れば、原因の仮説と修正版がすぐに揃う
- 楽天 RSS の関数仕様も把握しており、引数の埋め方を質問できる
- コードだけでなく 「次に何をすべきか」 も提案してくれる
- 危険な実装(実弾発注の暴走経路など)は止めてくれる
気をつけた点
- 実発注ロジックは 必ず人間がレビュー。AI 任せにしない。
- 実弾前に PAPER モードで2日以上動作検証する。
- 機能拡張より 安全装置を先に組む。
- 楽天証券の仕様は 公式ドキュメントで一次確認(AI が古い情報を出すことがある)。
- 実弾は 必ず最小単位(マイクロ)から。いきなりミニ・ラージは厳禁。
次回予告
次回 第2回 1ヶ月運用レポート編 では、以下を公開予定です。
- 1ヶ月の総取引回数 / 勝率 / 損益
- 最大ドローダウン
- 時間帯別パフォーマンス
- 朝レンジ幅と勝率の相関
- 失敗パターンの分析
- 第3回で行うパラメータ調整の方針
リアルタイムで運用結果を共有していきます。うまくいかなかった月もそのまま正直に書きます。シリーズをブックマークして次回をお待ちください。
その後の 第3回 パラメータ調整編 ではデータドリブンな改善を、第4回 ミニ昇格編 ではマイクロからミニへのスケールアップを扱う予定です。
- 第1回 構築編 ← 今ここ
- 第2回 1ヶ月運用レポート編(近日公開)
- 第3回 パラメータ調整編(予定)
- 第4回 ミニ昇格編(予定)
まとめ
個人投資家でも、AI アシスタントを相棒にすれば 完全自動売買システムは作れる時代 になりました。本記事のポイントを整理します。
- 題材は 低コスト・規則的・スケール可 な日経マイクロ先物が最適
- 開発の主役は Claude、しかし 実弾ロジックは人間が最終確認
- 機能拡張より 安全装置を先に。多層化が事故を防ぐ
- ハマりどころは 本体設定/資金条件/戻り値の解釈 に集中する
- 必ず 最小単位で実弾検証、ロジックの正しさより環境の確認が目的
なお、本記事は実装事例の共有を目的としたものであり、特定の投資手法を推奨するものではありません。投資判断は自己責任でお願いします。過去の運用成績は将来の結果を保証しません。
本記事は代表コバの実装記録をもとに AI で構成し、弊社にて最終確認を行っています。
「AI を使った業務システム・自動化ツールを社内で作りたい」「Excel VBA や Claude を組み合わせた業務効率化の事例を知りたい」など、相談ベースでも対応しています。費用感だけ知りたい方も、お気軽にご相談ください。