為替・金・WTI・米金利を集めて相関分析するための最小データ収集基盤を作る
これまでに、CFTCのCOTレポートからIMMポジションを取得し、SQLiteへ保存する流れを作りました。
次は、為替レートだけでなく、金、WTI原油、米金利、株価指数、ドル指数なども含めて、相関や市場環境の変化を見られるようにしたいと考えました。
最終的には、SQLiteに時系列データを保存し、Neo4jで資産間の関係やイベントとのつながりを扱えるようにする構成を目指します。
今回はその第一歩として、データ収集用プロジェクトの最小構成を作成します。
今回の目的
今回の目的は、為替、金、WTI、株価指数、米金利、IMMポジションなどを集めるための土台を作ることです。
いきなり高度な分析や発注処理まで作るのではなく、まずは以下を優先します。
- 必要なデータの種類を整理する
- SQLiteへ保存する前提を決める
- Neo4jで関係化したい対象を整理する
- データ収集スクリプト用のディレクトリ構成を作る
- 最初はyfinanceやFREDなど、扱いやすい取得元を使う
想定する全体構成
全体としては、以下のような流れを想定しています。
Scheduler ↓ run_pipeline.py ↓ データ取得 ↓ SQLiteへ保存 ↓ 特徴量作成 ↓ Neo4jへ相関・関係を反映 ↓ リスク検知・通知
まずは売買実行ではなく、相関やリスクの変化を検知するための分析基盤として作ります。
Neo4jを使う理由
SQLiteは時系列データの保存や集計に向いています。
一方で、Neo4jは「どの資産がどの資産と連動しているか」「どのイベントがどの市場に影響したか」といった関係を扱うのに向いています。
例えば、以下のような関係を持たせられます。
(:Asset)-[:CORR]->(:Asset) (:MacroEvent)-[:IMPACTS]->(:Asset) (:Template)-[:TRIGGERS]->(:Signal)
このようにしておくと、単なる数値の時系列だけでなく、市場間の関係やイベントとのつながりをたどりやすくなります。
Neo4jで扱うノード案
最初に想定するノードは以下です。
| ノード | 用途 |
|---|---|
:Asset |
USDJPY、XAUUSD、WTI、S&P500、米10年金利などの資産や指標 |
:MacroEvent |
CPI、PCE、雇用統計、FOMCなどの経済イベント |
:Regime |
Risk-On、Risk-Off、インフレ警戒などの市場環境 |
:Template |
危機検知や市場環境判定の条件テンプレート |
:Signal |
検知されたリスクや通知対象のイベント |
Neo4jで扱うエッジ案
関係は以下のように考えます。
| エッジ | 用途 |
|---|---|
:CORR |
資産間の相関 |
:IMPACTS |
マクロイベントが資産へ与える影響 |
:REQUIRES |
テンプレートが必要とする条件 |
:TRIGGERS |
条件成立時に発火する検知シグナル |
まずは、資産間の相関エッジから作るのが現実的です。
最初に集めるデータ
最小構成では、以下のデータを集める方針にします。
| カテゴリ | データ | 用途 |
|---|---|---|
| 為替 | USDJPY、EURUSD、GBPUSD | 主要通貨の動きと相関確認 |
| 金 | XAUUSD | リスク回避資産の確認 |
| 原油 | WTI | インフレ・景気シグナル |
| 株価指数 | S&P500 | リスク資産の代表 |
| ドル指数 | DXY | グローバルなドル環境 |
| 米金利 | 米10年金利、米2年金利 | 金融条件の確認 |
これだけでも、ある程度の相関ネットワークを作れます。
次に追加したいデータ
最小構成の次に、以下を追加すると市場環境の分析に使いやすくなります。
- 米CPI
- 米PCE
- 米雇用統計
- ISM製造業景況指数
- IMMポジション
- 経済カレンダー
- 各資産の実現ボラティリティ
特にIMMポジションは、投機筋の偏りを見るために重要です。
価格だけでは分からない需給の偏りを補助的に見ることができます。
取得元の初期案
最初は、以下の取得元を使います。
| データ | 取得元 |
|---|---|
| 為替・金・原油・株価指数 | yfinance |
| 米金利・一部マクロ指標 | FRED API |
| IMMポジション | CFTC公開データ |
| 経済カレンダー | 後で追加 |
yfinanceは手軽に使えますが、FXや一部商品のデータ品質には注意が必要です。
まずは動く構成を作り、必要に応じてデータソースを差し替えられるようにします。
プロジェクト構成
今回は、以下の構成で作ります。
trading_bot/
pyproject.toml
config.yaml
.env
scripts/
fetch_all.py
trading_bot/
infra/
db_sqlite.py
sources/
prices_yf.py
fred.py
cftc_imm.py
.env にはAPIキー類を入れる想定です。
公開リポジトリに上げる場合は、必ず .gitignore に追加します。
構成を作成するワンライナー
今回は実験なので、まずはワンライナーでディレクトリとファイルを作成します。
mkdir -p trading_bot/{scripts,trading_bot/infra/sources} && \
touch trading_bot/{pyproject.toml,config.yaml,.env} && \
touch trading_bot/scripts/fetch_all.py && \
touch trading_bot/trading_bot/infra/db_sqlite.py && \
touch trading_bot/trading_bot/infra/sources/{prices_yf.py,fred.py,cftc_imm.py}
これで、最小構成のファイルが作成されます。
シェルスクリプトで作る場合
毎回使う可能性がある場合は、シェルスクリプトにしてもよさそうです。
vim create_trading_bot.sh
内容は以下です。
#!/bin/bash
mkdir -p trading_bot/{scripts,trading_bot/infra/sources}
touch trading_bot/pyproject.toml
touch trading_bot/config.yaml
touch trading_bot/.env
touch trading_bot/scripts/fetch_all.py
touch trading_bot/trading_bot/infra/db_sqlite.py
touch trading_bot/trading_bot/infra/sources/prices_yf.py
touch trading_bot/trading_bot/infra/sources/fred.py
touch trading_bot/trading_bot/infra/sources/cftc_imm.py
echo "trading_bot 構成を作成しました"
ただし、今回はワンライナーで済ませました。
必要なPythonパッケージ
まずは、データ取得に必要なパッケージを入れます。
pip install pandas yfinance python-dotenv pyyaml requests pip install fredapi
今後は uv を使ってプロジェクトごとに環境を分ける予定ですが、まずは動作確認を優先します。
config.yamlを作成する
次に、設定ファイルを作成します。
vim trading_bot/config.yaml
内容は以下です。
db_path: "./market.db"
prices:
interval: "1h"
lookback_days: 60
tickers:
- "JPY=X"
- "EURUSD=X"
- "GBPUSD=X"
- "XAUUSD=X"
- "CL=F"
- "^GSPC"
- "DX-Y.NYB"
fred:
enabled: true
series:
- "DGS10"
- "DGS2"
- "DTWEXBGS"
imm:
enabled: true
config.yamlの意味
設定内容は以下です。
| 項目 | 意味 |
|---|---|
db_path |
SQLiteデータベースの保存先 |
prices.interval |
価格データの取得足。今回は1時間足 |
prices.lookback_days |
初回取得する過去日数 |
prices.tickers |
yfinanceで取得するティッカー |
fred.series |
FREDから取得する系列 |
imm.enabled |
IMMポジション取得の有効化 |
yfinanceティッカーの注意点
yfinanceのFXティッカーは少し特殊です。
例えば、USDJPYは以下のように指定します。
JPY=X
これはyfinance上ではUSD/JPYを意味します。
一方、EURUSDやGBPUSDは以下のように指定します。
EURUSD=X GBPUSD=X
金やDXYは、環境によって取得できない場合があります。
XAUUSD=X:取れない場合ありDX-Y.NYB:欠損や取得失敗の可能性あり
その場合は、代替シンボルや別データソースを検討します。
FREDで取得する系列
FREDからは、最初に以下を取得する予定です。
| 系列 | 内容 |
|---|---|
DGS10 |
米10年国債利回り |
DGS2 |
米2年国債利回り |
DTWEXBGS |
広義ドル指数 |
FRED APIを使う場合はAPIキーが必要です。
公開記事やGitHubには実際のAPIキーを書かず、.env に保存します。
FRED_API_KEY=YOUR_FRED_API_KEY_HERE
.envの扱い
.env にはAPIキー類を置きます。
例えば、以下のような形です。
FRED_API_KEY=YOUR_FRED_API_KEY_HERE
実際のAPIキーは公開しません。
Gitで管理する場合は、必ず .gitignore に .env を追加します。
.env
まずは取得可否の確認から行う
ここまででプロジェクト構成と設定ファイルは作成できました。
次はいきなりDB格納処理を作るのではなく、まず各シンボルが実際に取得できるかを確認します。
特に、以下は取得失敗や欠損の可能性があります。
XAUUSD=XDX-Y.NYBJPY=Xの扱い- 1時間足の取得範囲
価格取得が安定することを確認してから、SQLite保存処理へ進みます。
今回の到達点
今回の作業で、以下まで進みました。
- 相関・関係分析用のデータ収集方針を整理した
- Neo4jで扱うノードとエッジの案を整理した
- 最初に取得する資産・指標を決めた
- 価格、FRED、IMMポジションの取得元を仮決めした
trading_botの最小ディレクトリ構成を作成した- 必要なPythonパッケージをインストールした
config.yamlを作成した
公開時にぼかした点
元のメモでは、自動売買やシグナル生成に関する表現も含めていました。
公開記事では、具体的な売買判断や戦略の詳細には踏み込まず、市場監視・リスク検知・相関分析のためのデータ基盤として整理しています。
この方が、技術ログとして読みやすく、余計な戦略情報も出しすぎずに済みます。
次にやること
次は、各データソースから実際にデータが取れるか確認します。
- yfinanceで各ティッカーの取得可否を確認する
- FRED APIキーを
.envから読み込めるようにする - FRED系列を取得できるか確認する
- 取得結果をSQLiteへ保存するテーブル設計を作る
- IMMポジション取得スクリプトと統合する
まずは、価格データが安定して取得できるかを確認してから、DB保存処理に進みます。
まとめ
今回は、為替、金、WTI、S&P500、DXY、米金利、IMMポジションを扱うためのデータ収集基盤の最小構成を作りました。
SQLiteには時系列データを保存し、Neo4jでは資産間の相関やマクロイベントとの関係を扱う方針です。
まずはyfinance、FRED、CFTCデータを使って、相関分析や市場環境の変化を確認できる基盤を作ります。
次は、各ティッカーやFRED系列が実際に取得できるかを確認し、その後SQLiteへの保存処理を実装していきます。

コメント