クオンツ・コマンドセンター
自分のコンピューター上で動くマルチマーケット・パネル。相場データの取得、指標計算、市場状態の判定、ルールの確認まで、オンラインサービスに頼らず手元で完結する。

なぜこのローカルツールを作ったのか
金融市場に入ってすぐ、自分の情報がばらばらに散らばっていることに気づいた。相場は証券会社のアプリ、指標は相場サイト、保有記録は自分の表計算。ひとつ確認するだけで四つも五つも画面を渡り歩き、戻ってきた頃には何を確かめたかったのか忘れている。
さらに面白いのは、これらのアプリがどれも目が回るほど多くのデータを意気揚々と並べているのに、その裏にあるトレンドは自分から説明してくれないことだ。今の相場は一方向に動いているのか、それとも往来相場なのか。個別株の急騰は買いを誘う罠なのか、本格的な上昇波なのか。30%下げたらもう十分安いのか。今ここで入るなら、利確と損切りの境目はどこなのか。
最初の野心はかなり大きかった。過去データと優れた戦略を使えば、絶対に勝てる法則を見つけられると思っていた。そこで、戦略を立て、過去データで検証し、却下する。調整して、またバックテストする、という循環を延々と始めた。
何周したのかわからないほど調整と検証を繰り返した末、金融市場に絶対に勝てる法則など存在しない、と絶望とともに気づいた(考えてみれば当たり前だ)。そこで、この道具の役割を「何を買えば確実に大儲けできるかを直接教えるもの」から、「コックピットであって、アルファを生むエンジンではないもの」へ変えた。寝ている間に代わりに稼いでくれるわけではない。自分が何をしているのかを見えるようにし、怒っているときは冷静に、恐れているときは貪欲に、貪欲になったときは目を覚まさせる。そして、その状況で何をすべきかを考えさせ、感情に手綱を渡して間違いを重ねるのを防ぐためのものだ。実際には、後者のほうがずっと難しく、ずっと役に立った。
開発中に曲がった道
最初の戦略は、自分で決めた規則に処刑された。
バックテストがきれいになるまでパラメータをいじる自己欺瞞を避けるため、戦略検証には事前登録制を設けた。最大ドローダウン、年率リターン、ランダム・エントリーの対照群を上回ること。この合格基準を走らせる前に固定し、途中では変えない。
最初の移動平均タイミング戦略は勇ましく入場し、三項目すべて不合格で帰ってきた。2020年の大幅下落がちょうど退出バッファに入り、下落中も満額保有を貫いていた。
事前に決めた規則どおり、私はそれを仕留めた。
次に来たのは、macOSの三連打。
システムは頑として x86 モードで Python を起動し、数学ライブラリは arm しか認めない。プロジェクトをデスクトップに置けば権限で締め出される。ある更新の後には、データベース依存の JavaScript エンジンが新技を覚えた。エラーも残さずプロセスごと連れ去り、パネルは宇宙人に回収されたように消えた。
タイムゾーンは、プログラマーの永遠の敵。
日本株パネルが一時、ニューヨーク時間で東京の取引日を判定していた。東京の深夜になると、プログラムは「今日はまだ引けていない」と信じ込み、前日の終値をどうしても取りに行かなかった。
ひとつのパネルで三市場、三つの時間帯を扱って初めて、「今日」は定義が必要な言葉だと実感した。
プログラムは休みを知らない。
初期のパネルは祝日を知らず、月曜から金曜までは働くものだと思っていた。
そのため、中国の端午節とアメリカの独立記念日の休場後、正常なデータを見ながら、堂々と赤い「データが古い」ラベルを付けた。今日は休みだと知らずに出社し、誰も来ていないのを見て腹を立て、上司に告げ口する滑稽な社員のようだった。
その後、実際の取引カレンダーを接続した。
そして、1747回押された更新ボタン。
ある時期、中国A株パネルの「今すぐ更新」は、押すと一瞬「取得中」と光り、何事もなかったように元へ戻った。
ログに残っていた事実は残酷だった。累計1747回押され、1747回とも空振りだった。
全市場スナップショットのAPIを、一回の取得中に十数回重複して呼んでいたのが原因だった。完全更新には八分かかり、ロックはずっと占有されたまま。フロントエンドは「処理中」という返事を受け取ると、ユーザーには何も言わず飲み込んでいた。
修正後、一回の取得は477秒から42秒へ短縮。更新ボタンも、ようやく進捗を報告することを覚えた。
原因はばらばらでも、教訓はひとつだった。
道具が失敗することより、失敗したまま平然としていることのほうが怖い。
以後のシステム改修は、ほぼこの一点を中心に進めている。
全体の構成
システムは一つのランチャーと六つの独立パネルで構成される。各パネルは互いに依存せず、ランチャーからまとめて起動・停止する。
パネル構成
六つのパネルが、市場と判断の異なる層をそれぞれ担当する。
日本株・米国株パネル
長期保有向け。配分のずれと縮小の目安を追い、売買タイミングのシグナルは出さない。
FXパネル
ひとつの通貨ペアを取引軸に置き、その他の銘柄は監視だけに使う。
CFDパネル
株価指数、金、原油、暗号資産の判断を支援し、コストには証券会社が実際に公表するスプレッドを使う。
マクロ・ヒートパネル
マクロ指標をまとめ、市場環境の熱さと冷たさを一つの読みとして示す。
強気・弱気状態パネル
事前に固定した比重(市場構造 / マクロ / ナラティブ)から市場状態を合成し、相場に合わせて比重を変えない。
データ取得
- 各市場では無料または遅延データを使い、有料のリアルタイム相場には接続しない。自分で使う道具なので、遅延値で十分だ。
- 市場ごとに複数のデータソースを連鎖させる。第一候補が失敗すれば自動で次へ切り替え、実際に使ったソースも記録する。同じソースが連続して失敗した回は短絡して飛ばし、無駄に待たない。
- 取引日は各市場の現地時間で個別に判定し、実際の取引カレンダーを使って祝日や振替日を扱う。
- 取得は二種類。各市場の引け後に行う定時取得と、いつでも実行できる手動の強制更新だ。取得処理はバックグラウンドで動き、画面に進捗を出す。銘柄ごとに保存し、まとまりごとに確定するので、途中で電源が落ちても完了分は失われない。
- データはローカルの SQLite に保存する。更新頻度の低い銘柄名簿などは永続キャッシュし、APIが不安定なときは古いコピーへ戻しつつ、そのコピーの日付を明示する。
すべてのデータに鮮度の状態を付ける。
- 場中の遅延値
- 終値確定
- データが古い · 取得失敗
取得失敗は必ず表に出す。
古いデータを黙って最新値のように見せる経路は、システム内に存在しない。
ローカルのクオンツロジック
このシステムは予測をしない。
すべての計算は、現状を説明することと、あらかじめ決めた規則を実行することの二つに使う。
長期保有ロジック(日本株・米国株)
等配分で定期的に積み立て、配分のずれが閾値を超えたときだけ縮小修正(TRIM)を行う。完全なリバランスはしない。
A株ロジック
エントリーはモメンタムを見る——20日高値更新と出来高増加、または移動平均線の上向き配列を MACD で確認する。退出で従うのはシャンデリア式トレーリングストップ(一定期間の高値から 3×ATR の下落にハードフロアを加える)だけで、固定利確は設けず、ストップライン自身に追わせる——これはシステム全体で唯一の機械的規律である。それ以外の市場全体の水位、セクター・ローテーション、同業銘柄の横断比較、経済カレンダーは、すべて現状を記述するだけで判断は示さない。AI 解説は見解を持てるが、すべての見解は T+5/T+20 時点の実際の騰落で採点される。
FXロジック(USD/JPY)
香港ドルは米ドルにペッグされているため、三つの通貨ペアに実質的な独立方向は一つしかない。そこで USD/JPY だけを唯一の取引軸として残し、香港ドルは監視専用に下げた。ポジション量は、証拠金でどこまで建てられるかではなく、リスク比率とストップまでの距離からロット数を逆算する。同時に carry を日次で累積し、強制ロスカットまでの距離も明示する。
CFDロジック(コスト優先)
まずコストを計算し、それからシグナルを考える。各銘柄はブローカーが公表する実際のスプレッドでモデル化し、往復コスト、損益分岐となる値幅、損益分岐勝率を出す。到達可能な値幅でコストを賄えないときは、直接「取引不可」と表示する。相場データの役目は価格がどこにあるかを示すことだけで、コストは常にブローカーの実際の気配値で計算する。
状態判定(二つのレーダー)
一つはマクロ指標を集約して環境の熱量を示し、もう一つは市場構造・マクロ・ナラティブという三種類の指標を固定比率で合成して強気・弱気の状態を判定する。比重は有効化前に固定し、その後は読みだけを出して事後調整しない。
戦略の採用制度
新しい戦略はパネルへ入れる前に、事前登録したバックテストを通す。先に合格基準を固定してからデータを走らせ、通ったものだけ採用する。不合格なら過程ごとアーカイブする。
今のところ、採用数よりアーカイブ数のほうが多い。それは制度が働いている証拠だと思っている。
可視化
- すべてのパネルは Flask でローカルWebページとして構築し、ブラウザをユーザーインターフェースにする。ランチャーはネイティブウィンドウで、各パネルの状態ランプと一括起動・停止を備える。
- 画面要素は状態をすばやく読むために設計した。モメンタムのバッジ、センチメント温度計、ルールの注意帯、データ鮮度ラベルを、ひと目で確認できる。
- 画面の軽い定期更新とデータ取得は完全に分離した。前者は表示を描き直すだけ、後者だけがネットワークに触れ、互いに邪魔をしない。
- 手動更新中はボタンに「12/27」のような進捗を表示し、完了後に画面を描き直して結果を報告する。失敗は理由まで画面に出し、黙って元へ戻ることはない。