前のページへ

クオンツ・コマンドセンター

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

六つの独立パネルをまとめて起動するクオンツ・コマンドセンター
起動パネル:システム全体のメインスイッチ。ランプが緑になって、ようやくパネルは生きている。

なぜこのローカルツールを作ったのか

金融市場に入ってすぐ、自分の情報がばらばらに散らばっていることに気づいた。相場は証券会社のアプリ、指標は相場サイト、保有記録は自分の表計算。ひとつ確認するだけで四つも五つも画面を渡り歩き、戻ってきた頃には何を確かめたかったのか忘れている。

さらに面白いのは、これらのアプリがどれも目が回るほど多くのデータを意気揚々と並べているのに、その裏にあるトレンドは自分から説明してくれないことだ。今の相場は一方向に動いているのか、それとも往来相場なのか。個別株の急騰は買いを誘う罠なのか、本格的な上昇波なのか。30%下げたらもう十分安いのか。今ここで入るなら、利確と損切りの境目はどこなのか。

最初の野心はかなり大きかった。過去データと優れた戦略を使えば、絶対に勝てる法則を見つけられると思っていた。そこで、戦略を立て、過去データで検証し、却下する。調整して、またバックテストする、という循環を延々と始めた。

何周したのかわからないほど調整と検証を繰り返した末、金融市場に絶対に勝てる法則など存在しない、と絶望とともに気づいた(考えてみれば当たり前だ)。そこで、この道具の役割を「何を買えば確実に大儲けできるかを直接教えるもの」から、「コックピットであって、アルファを生むエンジンではないもの」へ変えた。寝ている間に代わりに稼いでくれるわけではない。自分が何をしているのかを見えるようにし、怒っているときは冷静に、恐れているときは貪欲に、貪欲になったときは目を覚まさせる。そして、その状況で何をすべきかを考えさせ、感情に手綱を渡して間違いを重ねるのを防ぐためのものだ。実際には、後者のほうがずっと難しく、ずっと役に立った。

開発中に曲がった道

  1. 最初の戦略は、自分で決めた規則に処刑された。

    バックテストがきれいになるまでパラメータをいじる自己欺瞞を避けるため、戦略検証には事前登録制を設けた。最大ドローダウン、年率リターン、ランダム・エントリーの対照群を上回ること。この合格基準を走らせる前に固定し、途中では変えない。

    最初の移動平均タイミング戦略は勇ましく入場し、三項目すべて不合格で帰ってきた。2020年の大幅下落がちょうど退出バッファに入り、下落中も満額保有を貫いていた。

    事前に決めた規則どおり、私はそれを仕留めた。

  2. 次に来たのは、macOSの三連打。

    システムは頑として x86 モードで Python を起動し、数学ライブラリは arm しか認めない。プロジェクトをデスクトップに置けば権限で締め出される。ある更新の後には、データベース依存の JavaScript エンジンが新技を覚えた。エラーも残さずプロセスごと連れ去り、パネルは宇宙人に回収されたように消えた。

  3. タイムゾーンは、プログラマーの永遠の敵。

    日本株パネルが一時、ニューヨーク時間で東京の取引日を判定していた。東京の深夜になると、プログラムは「今日はまだ引けていない」と信じ込み、前日の終値をどうしても取りに行かなかった。

    ひとつのパネルで三市場、三つの時間帯を扱って初めて、「今日」は定義が必要な言葉だと実感した。

  4. プログラムは休みを知らない。

    初期のパネルは祝日を知らず、月曜から金曜までは働くものだと思っていた。

    そのため、中国の端午節とアメリカの独立記念日の休場後、正常なデータを見ながら、堂々と赤い「データが古い」ラベルを付けた。今日は休みだと知らずに出社し、誰も来ていないのを見て腹を立て、上司に告げ口する滑稽な社員のようだった。

    その後、実際の取引カレンダーを接続した。

  5. そして、1747回押された更新ボタン。

    ある時期、中国A株パネルの「今すぐ更新」は、押すと一瞬「取得中」と光り、何事もなかったように元へ戻った。

    ログに残っていた事実は残酷だった。累計1747回押され、1747回とも空振りだった。

    全市場スナップショットのAPIを、一回の取得中に十数回重複して呼んでいたのが原因だった。完全更新には八分かかり、ロックはずっと占有されたまま。フロントエンドは「処理中」という返事を受け取ると、ユーザーには何も言わず飲み込んでいた。

    修正後、一回の取得は477秒から42秒へ短縮。更新ボタンも、ようやく進捗を報告することを覚えた。

原因はばらばらでも、教訓はひとつだった。

道具が失敗することより、失敗したまま平然としていることのほうが怖い。

以後のシステム改修は、ほぼこの一点を中心に進めている。

全体の構成

システムは一つのランチャーと六つの独立パネルで構成される。各パネルは互いに依存せず、ランチャーからまとめて起動・停止する。

パネル構成

六つのパネルが、市場と判断の異なる層をそれぞれ担当する。

  1. 日本株・米国株パネル

    長期保有向け。配分のずれと縮小の目安を追い、売買タイミングのシグナルは出さない。

  2. A株パネル 2.0

    スイング取引の試行枠から、日本株・米国株と同等に扱う主戦場へ。市場全体の水位、セクター・ローテーション、経済カレンダー、シャンデリア・ストップの規律、同業横断比較、さらに採点される AI 解説の層まで——判断するのはあくまで人であり、パネルは事実を一度に並べる。

    A株パネル 1.0(旧版)
  3. FXパネル

    ひとつの通貨ペアを取引軸に置き、その他の銘柄は監視だけに使う。

  4. CFDパネル

    株価指数、金、原油、暗号資産の判断を支援し、コストには証券会社が実際に公表するスプレッドを使う。

  5. マクロ・ヒートパネル

    マクロ指標をまとめ、市場環境の熱さと冷たさを一つの読みとして示す。

  6. 強気・弱気状態パネル

    事前に固定した比重(市場構造 / マクロ / ナラティブ)から市場状態を合成し、相場に合わせて比重を変えない。

データ取得

  • 各市場では無料または遅延データを使い、有料のリアルタイム相場には接続しない。自分で使う道具なので、遅延値で十分だ。
  • 市場ごとに複数のデータソースを連鎖させる。第一候補が失敗すれば自動で次へ切り替え、実際に使ったソースも記録する。同じソースが連続して失敗した回は短絡して飛ばし、無駄に待たない。
  • 取引日は各市場の現地時間で個別に判定し、実際の取引カレンダーを使って祝日や振替日を扱う。
  • 取得は二種類。各市場の引け後に行う定時取得と、いつでも実行できる手動の強制更新だ。取得処理はバックグラウンドで動き、画面に進捗を出す。銘柄ごとに保存し、まとまりごとに確定するので、途中で電源が落ちても完了分は失われない。
  • データはローカルの SQLite に保存する。更新頻度の低い銘柄名簿などは永続キャッシュし、APIが不安定なときは古いコピーへ戻しつつ、そのコピーの日付を明示する。

すべてのデータに鮮度の状態を付ける。

  • 場中の遅延値
  • 終値確定
  • データが古い · 取得失敗

取得失敗は必ず表に出す。

古いデータを黙って最新値のように見せる経路は、システム内に存在しない。

ローカルのクオンツロジック

このシステムは予測をしない。

すべての計算は、現状を説明することと、あらかじめ決めた規則を実行することの二つに使う。

  1. 長期保有ロジック(日本株・米国株)

    等配分で定期的に積み立て、配分のずれが閾値を超えたときだけ縮小修正(TRIM)を行う。完全なリバランスはしない。

  2. A株ロジック

    エントリーはモメンタムを見る——20日高値更新と出来高増加、または移動平均線の上向き配列を MACD で確認する。退出で従うのはシャンデリア式トレーリングストップ(一定期間の高値から 3×ATR の下落にハードフロアを加える)だけで、固定利確は設けず、ストップライン自身に追わせる——これはシステム全体で唯一の機械的規律である。それ以外の市場全体の水位、セクター・ローテーション、同業銘柄の横断比較、経済カレンダーは、すべて現状を記述するだけで判断は示さない。AI 解説は見解を持てるが、すべての見解は T+5/T+20 時点の実際の騰落で採点される。

  3. FXロジック(USD/JPY)

    香港ドルは米ドルにペッグされているため、三つの通貨ペアに実質的な独立方向は一つしかない。そこで USD/JPY だけを唯一の取引軸として残し、香港ドルは監視専用に下げた。ポジション量は、証拠金でどこまで建てられるかではなく、リスク比率とストップまでの距離からロット数を逆算する。同時に carry を日次で累積し、強制ロスカットまでの距離も明示する。

  4. CFDロジック(コスト優先)

    まずコストを計算し、それからシグナルを考える。各銘柄はブローカーが公表する実際のスプレッドでモデル化し、往復コスト、損益分岐となる値幅、損益分岐勝率を出す。到達可能な値幅でコストを賄えないときは、直接「取引不可」と表示する。相場データの役目は価格がどこにあるかを示すことだけで、コストは常にブローカーの実際の気配値で計算する。

  5. 状態判定(二つのレーダー)

    一つはマクロ指標を集約して環境の熱量を示し、もう一つは市場構造・マクロ・ナラティブという三種類の指標を固定比率で合成して強気・弱気の状態を判定する。比重は有効化前に固定し、その後は読みだけを出して事後調整しない。

  6. 戦略の採用制度

    新しい戦略はパネルへ入れる前に、事前登録したバックテストを通す。先に合格基準を固定してからデータを走らせ、通ったものだけ採用する。不合格なら過程ごとアーカイブする。

    今のところ、採用数よりアーカイブ数のほうが多い。それは制度が働いている証拠だと思っている。

可視化

  • すべてのパネルは Flask でローカルWebページとして構築し、ブラウザをユーザーインターフェースにする。ランチャーはネイティブウィンドウで、各パネルの状態ランプと一括起動・停止を備える。
  • 画面要素は状態をすばやく読むために設計した。モメンタムのバッジ、センチメント温度計、ルールの注意帯、データ鮮度ラベルを、ひと目で確認できる。
  • 画面の軽い定期更新とデータ取得は完全に分離した。前者は表示を描き直すだけ、後者だけがネットワークに触れ、互いに邪魔をしない。
  • 手動更新中はボタンに「12/27」のような進捗を表示し、完了後に画面を描き直して結果を報告する。失敗は理由まで画面に出し、黙って元へ戻ることはない。