はじめに
先週、個人開発している自律型AIヘッジファンド『Lumina AI』のアーキテクチャ解説記事をQiitaに投稿したところ、大変ありがたいことに多くの反響とストックをいただきました。
本家のLumina AIは、**「米株・日本株の現物スイングトレード(数日〜数週間保有)」**を主戦場とし、5人のAI投資家(バフェット、グレアム、キャシー・ウッド、リスク管理者、CIO)によるマルチエージェント合議と、FRED純流動性・Alpha158数理因子・Rust常駐番犬による鉄壁の防御を特徴としています。
しかし、運用を続けていく中で、一つの強烈な野望が湧き上がってきました。
「この自律AIの頭脳と防御システムを極限まで先鋭化させたら、世界中のプロトレーダーが鎬を削る『プロップファーム(自己資金ゼロで数千万円の運用資金を勝ち取る試験)』を完全自動で突破できるのではないか?」
そこで今回、本家のクオンツ設計思想をベースに、日次ドローダウン-5%で即時失格という極限の制約下で戦う**「米国株デイトレード特化型AI(Lumina-Prop)」**をゼロから設計・実装しました。
本記事では、Linux VPS上でMetaTrader 5(MT5)とPythonを統合し、Level 2板情報(DOM)スナイパーと数々の泥臭い地雷(時間外取引の拒否、スプレッド急拡大、RPyCシリアライズ障害など)を突破したアーキテクチャの全貌を共有します。
1. プロップファーム(FTMO)という過酷な戦場
プロップファーム(Proprietary Trading Firm)とは、トレーダーに審査(チャレンジ試験)を課し、合格したトレーダーに自社の運用資金(10万ドル〜200万ドルなど)を預けて利益の80〜90%を報酬として分配する会社です。
なかでも世界最大手の「FTMO」などは有名ですが、その合格ルールは人間の精神とアルゴリズムの耐久性を粉々に破壊するレベルで厳格です。
| ルール項目 | FTMOの制約 | Lumina-Prop の自律防衛線 |
|---|---|---|
| 日次最大損失制限 | 1日で元本の -5.0% 損失で永久失格 | -3.5% で当日の全発注をハードロック |
| 全体最大損失制限 | 通算で元本の -10.0% 損失で永久失格 | -8.0% で全ポジション強制決済&凍結 |
| 目標利益 | +10.0%(Free Trialやフェーズ1) | リスクリワード 1:2.0 の高精度スナイプ |
| オーバーナイト | 翌日への持ち越しギャップダウンが致命傷に | NY引け前(04:45 JST)に全ポジション強制手仕舞い |
| 経済指標発表 | CPIやFOMC発表前後の乱高下スプレッド | 指標発表前後5分間の完全取引停止(ブラックアウト) |
市販のEA(Expert Advisor)や巷のPython Botの大半がプロップファームで瞬殺される理由は明白です。**「ナンピンやマーチンゲールで耐える」「スプレッドが広がっているのに成行を投げる」「突発的なニュースでストップを踏み抜く」**という致命的なミスを犯すからです。
プロップファーム攻略に必要なのは、高勝率の聖杯ロジックではなく、**「絶対に日次-5%を踏まない物理的ガードレール」**です。
2. 金融工学・数理理論の完全比較:本家スイングAI vs プロップ特化AI
「AIトレード」と聞くと、多くの人は**「LLM(ChatGPTやClaude)にチャートを見せて『買いですか?売りですか?』と聞くもの」**を想像しがちです。
しかし、日次ドローダウン-5%で即BANという極限の現場において、LLMの確率的な曖昧推論やハルシネーションは一切通用しません。
だからこそ、本家LuminaとプロップLuminaでは、採用する金融工学・数理モデルの哲学を180度差別化しました。
本家Lumina vs プロップLumina の数理思想比較
| 比較項目 | ① 本家Lumina(現物スイング) | ② プロップLumina(米株デイトレ特化) |
|---|---|---|
| 主戦場 | IBKR(インタラクティブ・ブローカーズ) | FTMO(MetaTrader 5 / CFD) |
| 運用スタイル | 現物スイングトレード(数日〜数週間保有) | 米国株デイトレード(数分〜数時間・日計り) |
| 取引方向 | ロング・オンリー(買い現物のみ) | ロング & ショート(買い&空売りの双方向) |
| 中核となる金融工学 | ・MPT(現代ポートフォリオ理論) ・HRP(階層リスクパリティ分散) ・Qlib Alpha158因子数理モデル ・FRED米ドル実質純流動性理論 ・市場ブレッドス(S&P500 SMA200維持率) ・Options GEX(ガンマ・エクスポージャー) |
・市場微細構造(Market Microstructure) ・OFI(Order Flow Imbalance: 注文流不均衡) ・5分足VWAP(出来高加重平均価格)執行 ・Level 2 DOM(気配値板情報)需給スナイプ ・スプレッド急拡大摩擦ガード ・ジャンプ拡散(指標ショック)完全遮断 |
| 意思決定アーキテクチャ |
5人AI合議(LLM推論)+財務堀(F-Score≧6) ※バフェット・グレアムの長期成長力と割安度 |
100%決定論的数理アルゴリズム ※LLMは取引時間前のニュース発掘にのみ限定 |
| オーバーナイト | あり(Stage 2上昇トレンドを追従) | 完全禁止(04:45 JSTに無条件全手仕舞い) |
| 破滅確率の制御 | 緩やかなドローダウン回復を許容 |
「1日-5%で永久失格」に対するハードロック (日次-3.5%で当日の全発注を物理遮断) |
プロップ特化AIに組み込んだ核心理論
-
市場微細構造理論(Market Microstructure)とOFI(注文流不均衡):
- クオンツ論文(Cont, Kukanov & Stoikov 等)で実証されている板情報の数理モデルを採用。単なる価格の上下ではなく、**「買い板と売り板の出入り速度(気配値の更新圧力)」**をリアルタイム測定し、大口機関がどちらの方向に買い上がっている(または売り叩いている)かを瞬時に判定します。
-
機関投資家の執行ベンチマーク(VWAP)への同調:
- 出来高加重平均価格(VWAP)を軸に据え、5分足レベルでのブレイクアウトおよびプルバック(押し目・戻り)を捉えます。
-
ファットテール・ジャンプリスクの根絶(04:45 JST 強制手仕舞い):
- デイトレードにおいて最も恐ろしいのは、ポジションを持ち越した翌朝に起きる「決算発表や地政学リスクによる寄り付き大暴落(ギャップダウン)」です。Lumina-Propでは、米国市場引け15分前に全ポジションを強制決済し、保有残高をキャッシュ100%に戻すことで、オーバーナイトリスクを数理的にゼロにしています。
3. システム全体アーキテクチャ
Lumina-Propは、本家Lumina(IBKR現物スイング)とはプロセス・DB・設定ファイルを完全分離し、Linux VPS上の独立チェンバーで24時間自律稼働させています。
+---------------------------------------------------------------------------------+
| Linux VPS (Ubuntu) |
| |
| [ Docker: Wine + MT5 Terminal ] [ Python 3.10 Daemon ] |
| +-----------------------------+ +---------------------------+ |
| | MetaTrader 5 (Windows x64) | | prop_us_daemon.py | |
| | - FTMO-Demo Account | RPyC / IPC | - 10-Sec Watchdog Loop | |
| | - Level 2 DOM (market_book) | <=============> | - 15-Min Cis Flow Sniper | |
| | - RPyC ClassicService:8001 | 127.0.0.1:8001 | - SQLite FTS5 BM25 Memory | |
| +-----------------------------+ +---------------------------+ |
| ^ | |
| | (OrderSend) | (yfinance/DOM) |
| v v |
| [ FTMO Liquidity / CFDs ] [ US Equity Market (40 Tickers) ] |
+---------------------------------------------------------------------------------+
なぜ Docker + Wine + RPyC なのか?
MT5の公式Pythonライブラリ(MetaTrader5)はWindowsネイティブのC拡張として提供されており、Linux上では直接 import MetaTrader5 が動作しません。
そこで、Dockerコンテナ内でWineを介してWindows版MT5を起動し、コンテナ内のWine Pythonプロセスで rpyc.classic サーバー(ポート 8001)を立ち上げ、ホスト側のネイティブLinux PythonからRPC経由でMT5 APIを透過的に操作するアーキテクチャを採用しました。
4. 実装した3大コアエンジン
① 5分足VWAP × OFI × MT5板情報スナイパー (CisFlowSniper)
デイトレードにおいて、15分足や日足の指標だけを見てエントリーするのは自殺行為です。
Lumina-Propでは、cis氏の需給思想とクオンツのOFI(Order Flow Imbalance: 注文流不均衡)を融合させたスナイパーロジックを搭載しています。
- ロング条件: 5分足がVWAPを力強くブレイク(または反発) + MT5の買い気配出来高が売り出来高を圧倒(OFI > +18.0) + 大口アイスバーグ買い板を検知
- ショート(空売り)条件: 5分足がVWAPを下方ブレイク + 売り板の重圧(OFI < -18.0) + 大口見せ板の撤退
# Level 2 DOM(板情報)から気配値不均衡(Imbalance)を計算するロジック抜粋
def get_mt5_order_book(self, symbol: str) -> dict:
mt5 = self._get_mt5_instance()
ftmo_sym = self.resolve_ftmo_symbol(mt5, symbol)
# MT5板情報の講読開始
if mt5.market_book_add(ftmo_sym):
book_items = mt5.market_book_get(ftmo_sym) or []
bids = [item for item in book_items if item.type == mt5.BOOK_TYPE_BUY]
asks = [item for item in book_items if item.type == mt5.BOOK_TYPE_SELL]
mt5.market_book_release(ftmo_sym)
bid_vol = sum(b.volume for b in bids)
ask_vol = sum(a.volume for a in asks)
tot_vol = max(1.0, bid_vol + ask_vol)
# 板の需給不均衡度 (-1.0 〜 +1.0)
dom_imbalance = (bid_vol - ask_vol) / tot_vol
return {"imbalance": dom_imbalance, "bid_vol": bid_vol, "ask_vol": ask_vol}
② 10秒番犬パトロール & 04:45 JST 強制手仕舞いフラットナー
エントリー後は、LLMの推論サイクル(15分)を待たずに、**10秒間隔の高速ループ(Watchdog Sentinel)**が稼働します。
- ATRベースの動的逆指値(Trailing Stop): 含み益が乗るにつれてストップラインを自動引き上げ、建値(損益分岐点)を確保。
- 04:45 JST(米国引け15分前)の無条件全決済: デイトレードの基本原則として、ポジションを翌日に持ち越す(オーバーナイトする)ことは100%禁止。引け前スプレッド拡大と決算・夜間先物ギャップによる日次失格リスクを物理的に根絶しています。
③ 価格乖離ガード(yfinance vs MT5 Live mid_price <= 0.15%)
シグナル計算で使用する外部データソースと、実際に約定させるMT5側の気配値にタイムラグや乖離が存在する場合、エントリーした瞬間にマイナススタートとなります。
発注直前にMT5の最新気配値を取得し、**シグナル価格との乖離が 0.15%(15 bps)を超えている場合は発注を即座に破棄(アボート)**する防壁を配備しました。
5. 現場で直面した泥臭い技術的トラップと解決策
ここが本記事で最も共有したかった**「実際に動かしてみて初めて踏み抜くリアルな地雷」**です。
罠1: 時間外取引(Pre-Market)で成行注文を投げて即死
市場オープン前(22:30 JST以前)の気配値を見て成行注文(Market Order)をブローカーに送信したところ、取引所から即座にリジェクトされました。
米国取引所では、プレマーケット等の時間外セッションでは**「指値注文(LIMIT)かつ Outside RTH(通常取引時間外フラグ=True)」**でなければ一切受け付けられません。
さらに、再試行ループが暴走して二重発注を起こさないよう、クライアント注文ID(UUIDv5)によるサーバーサイド冪等性ガードを組み込みました。
罠2: 寄付き直後(09:30 ET / 22:30 JST)のスプレッド急拡大
米国市場が開いた直後の数分間は、マーケットメイカーの気配値が定まらず、Bid/Askスプレッドが通常時の数倍〜十数倍(30〜50 bps以上)に拡大します。
ここで飛び込むとスリッページだけで大損するため、**「開場後5分間(09:30〜09:35 ET)はエントリーを完全停止するゴールデンウィンドウ制限」と「リアルタイムスプレッド > 0.35% での発注遮断ガード」**を実装しました。
罠3: RPyC の Proxyオブジェクト型判定エラー
Linux側のPythonからRPyC経由で mt5.order_send(request) を呼び出した際、以下のような謎のエラーで弾かれました。
(-2, 'Unnamed arguments not allowed')
調査したところ、RPyC経由でPythonの辞書 {"action": ...} を渡すと、Wine側のC拡張(MetaTrader5.pyd)内部の PyDict_CheckExact が「純粋なCPythonネイティブ辞書ではなくRPyCのProxy netrefオブジェクトである」と判定して拒否していたことが判明しました。
解決策として、Wine Python側で json.loads() を直接 eval 実行させ、Wineプロセス内で100%純正のCPython辞書を再構築して渡すことで完全解決しました。
# RPyCのnetref辞書拒否を回避するネイティブCPython辞書再構築
clean_json_str = json.dumps(request)
ret = rpyc_conn.eval(f"_mt5.order_send(_json.loads({repr(clean_json_str)}))")
6. 現在の運用状況とまとめ
現在、Lumina-PropはVPS上で systemctl デーモンとして稼働し、FTMOの無料トライアル($100,000 デモ環境)にて日夜フォワードテストを実施しています。
- スイング運用(本家Lumina / IBKR現物): 厳選銘柄を中長期でじっくり伸ばす「増やすための城」
- デイトレ運用(Lumina-Prop / FTMO): 日次損失を厳格に封殺しつつ自己資金ノーリスクで利益を吸い上げる「攻めの槍」
この2つの独立したAIシステムが完成したことで、ポートフォリオのリスク分散と収益機会が劇的に進化しました。
今回実装した自律型AIヘッジファンドのコア設計およびコード群は、GitHubにてオープンソース(CC BY-NC 4.0: 非営利限定ライセンス)で公開しています。
「AI×金融工学」「個人開発でプロップファームに挑むアルゴリズム設計」に興味のあるエンジニアの方にとって、本記事が少しでも参考になれば幸いです。もし面白かったら、GitHubのStarやQiitaのいいね・ストックをいただけると大変励みになります!