Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 36 additions & 27 deletions docs/sibling-project-comparison.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ StockCopilotを基準に書くが、どちらかを上位の実装とはみな

| プロジェクト | 基準 | 確認日 |
|---|---|---|
| StockCopilot | `origin/main` の `f2a48ef3f0240ae69f002bd10cedfeefcfa0a2ea` | 2026-08-26 |
| CryptoTradingCopilot | ローカルチェックアウト。Gitメタデータなし | 2026-08-26 |
| StockCopilot | `origin/main` の `bc0f2647baf525d51db2b2168ca5b7088fc6ae54` | 2026-08-27 |
| CryptoTradingCopilot | `origin/main` の `53f499716397d4f5709f3464049600a593a1ce39` | 2026-08-27 |

CryptoTradingCopilotにはコミット基準がないため、同プロジェクトの記述は確認日時点のスナップショットである。
将来Git管理を始めたら、確認日だけでなく基準コミットも記録する。
CryptoTradingCopilotが非Gitの間、両プロジェクトの乖離をCIで自動検出することはできない。
現在は関連変更時に本書の更新契機を照合し、Git管理の開始後に共通フィクスチャのCI化を検討する。
両プロジェクトがGit管理とCIを持つため、比較対象をコミットで固定できる。
ただし、共通フィクスチャを使ったプロジェクト間の差分検査はまだ無い。
現在は関連変更時に本書の更新契機を照合し、共通フィクスチャを導入した段階で両方のCIへ
同じ期待値を組み込む。

この公開文書には、実際の保有銘柄、数量、口座情報、注文内容、資格情報を記録しない。
CryptoTradingCopilot側のパスは、同プロジェクトのルートからの相対パスで表す。
Expand All @@ -46,8 +46,10 @@ CryptoTradingCopilot側のパスは、同プロジェクトのルートからの
| 対象 | 日本株、米国株、ETFの現物 | 暗号資産の無期限先物 | 意図的差分 |
| 主な役割 | 候補スクリーニング、保有分析、売買判断の提案 | 固定シグナルの注文プラン生成、承認後の発注、複数会場の裁量分析 | 意図的差分 |
| 執行 | 発注コードと証券会社APIを持たず、人間が手動で執行する | `execute_orders.py`がdry-runと明示承認を経てGrvtへ発注する | 意図的差分 |
| 執行ガード | 発注経路自体を持たない | `testnet`、`dry-run`、`prod`確認に加え、既存注文を既定で維持し、明示されたキャンセルも全件成功を確認してから新規発注する | 意図的差分 |
| 認証情報 | Slack Webhookだけを扱い、保有情報も公開リポジトリへ残さない | 取引APIの資格情報をローカル環境に持つ | 意図的差分 |
| リポジトリ | 公開Gitリポジトリ。PRとCIで変更を管理する | 現在はローカルの非Gitチェックアウト | 意図的差分 |
| 変更管理 | 公開Gitリポジトリ。PRとCIで変更を管理する | 非公開Gitリポジトリ。PRとCIで変更を管理する | 同期対象 |
| Git追跡境界 | 保有情報、売買意図、生成物を追跡しない | 将来公開できるソースだけを追跡し、注文、口座、ポジション情報、運用履歴を追跡しない | 同期対象 |

StockCopilotの発注禁止は、CryptoTradingCopilotとの差を埋める対象ではない。
この境界があるため、株式分析の変更から本番注文へ到達する経路が生まれない。
Expand All @@ -57,14 +59,15 @@ StockCopilotの発注禁止は、CryptoTradingCopilotとの差を埋める対象

| 項目 | StockCopilot | CryptoTradingCopilot | 分類 |
|---|---|---|---|
| 定期処理 | 夕方に株式候補と保有を分析し、中間表現JSON、HTML、Slack通知を生成する | 09:05 JSTに固定銘柄の日足シグナルを判定し、注文プランを生成する | 意図的差分 |
| 定期処理 | 夕方に株式候補と保有を分析し、中間表現JSON、HTML、Slack通知を生成する | 09:05 JST以降に固定銘柄の日足シグナルを判定し、注文プランを生成する。時刻前は外部接続もファイル更新もしない | 意図的差分 |
| 定期シグナル | スクリーニング結果を分析へ渡し、LLMが候補の採否を判断する | `morning_signal.py`がEMA200と20日ブレイクアウトを決定的に判定する | 意図的差分 |
| 裁量分析 | 候補分析と保有分析の二系統を持つ | `swing-check`が複数会場のポジションと前回シナリオを比較する | 同期対象 |
| 裁量分析 | 候補分析と保有分析の二系統を持つ | `trading-copilot-position-review`が複数会場のポジションと前回シナリオを比較する | 同期対象 |
| スクリーニング | ウォッチリスト、探索ユニバース、保有除外から最大件数まで絞る | Hyperliquidの流動性条件を通った銘柄から最大3件まで絞り、建てられる会場を付ける | 同期対象 |
| 候補の採否 | `screen.py`は買いを決めず、`analyze.py`の分析を通す | `swing/screen.py`は買いを決めず、スイング分析を通す | 同期対象 |
| 候補の採否 | `screen.py`は買いを決めず、`analyze.py`の分析を通す | `position_review/screen.py`は買いを決めず、ポジションレビューを通す | 同期対象 |
| 候補なし | 正常な結果として扱う | 正常な結果として扱う | 同期対象 |
| 分析時間足 | 日足と週足 | Morning Briefは日足、スイング分析は1時間足、4時間足、日足 | 意図的差分 |
| 分析時間足 | 日足と週足 | Morning Briefは日足、ポジションレビューは1時間足、4時間足、日足 | 意図的差分 |
| 市場固有情報 | 決算日、銘柄種別、日本語名、市場別の確定足更新 | funding、板、会場、証拠金、TPとSL、未決済注文 | 対象外 |
| 実行後の監視 | ジャーナルの前回シナリオと現在の保有を比較する | Morning Briefが保有開始、最大30日、reduce-onlyのTPとSL、ポジション無しで残る注文を警告する | 意図的差分 |

両者のスクリーナーは、直近の変動と20日レンジ突破をATR単位で測り、運用時に保有銘柄を除外する。
ただし、StockCopilotは確定終値と市場別の更新状態を使い、CryptoTradingCopilotは24時間変動と暗号資産会場の流動性を使う。
Expand All @@ -87,13 +90,16 @@ StockCopilotの発注禁止は、CryptoTradingCopilotとの差を埋める対象

| 項目 | StockCopilot | CryptoTradingCopilot | 分類 |
|---|---|---|---|
| 指標セット | RSI、MACD、EMA、Bollinger Bands、ATR、Stoch RSI、OBV、ADX、20本と60本の高安 | スイング分析では同じ指標セット | 共通化候補 |
| 指標の実装 | [`lib/indicators.py`](../lib/indicators.py)の純粋なDataFrame計算 | `swing/_analyze.py`でAPI接続、整形、指標計算、表示を一つのスクリプトに持つ | 共通化候補 |
| 指標セット | RSI、MACD、EMA、Bollinger Bands、ATR、Stoch RSI、OBV、ADX、20本と60本の高安 | ポジションレビューでは同じ指標セット | 共通化候補 |
| 指標の実装 | [`lib/indicators.py`](../lib/indicators.py)の純粋なDataFrame計算 | `position_review/analyze.py`の`calculate_indicators()`。同じスクリプトがAPI取得とJSON出力も担う | 共通化候補 |
| 定期シグナル | `screen.py`の結果を分析へ渡し、外部参照は[実行モード](output-contract.md#実行モードと外部参照)に従い、定期実行では引かず、対話実行だけ使える | Morning BriefはEMA200、20日ブレイクアウト、ATRによる固定ルールを使う | 意図的差分 |
| リスク計算 | 判断を提案するが、注文サイズを計算しない | 残高リスク、同時保有数、注文上限、TPとSLを注文プランへ反映する | 対象外 |

指標計算は、現在もっともコード共有に近い。
StockCopilotの`compute()`とCryptoTradingCopilotの`ind()`は同じ出力項目と期間を持つが、CryptoTradingCopilot側ではAPI接続と表示処理から分離されていない。
StockCopilotの`compute()`とCryptoTradingCopilotの`calculate_indicators()`は同じ指標と期間を持つが、
キー名、丸め精度、データ不足時の語彙はまだ共通契約になっていない。
CryptoTradingCopilot側では確定足判定と指標計算のネットワークなしテストが追加されたが、
API接続と出力から独立した共有モジュールにはなっていない。
共有モジュールを先に作ると、StockCopilotから取引環境への依存が生じる可能性がある。

最初に共有するなら、計算結果のテストベクトルが適している。
Expand All @@ -105,7 +111,7 @@ StockCopilotの`compute()`とCryptoTradingCopilotの`ind()`は同じ出力項目
| 項目 | StockCopilot | CryptoTradingCopilot | 分類 |
|---|---|---|---|
| 機械可読出力 | レポート用JSONをJSON Schemaと業務規則で検証する | 注文プランJSONを`ORDER_PLAN_SPEC.md`と`execute_orders.py`で検証する | 同期対象 |
| 人間向け出力 | 自己完結HTMLとCLI表示 | Morning BriefのHTMLとCLI表示、スイング分析の対話出力 | 共通化候補 |
| 人間向け出力 | 自己完結HTMLとCLI表示 | Morning BriefとポジションレビューのCLI表示とチャット報告 | 共通化候補 |
| Slack通知 | 毎日投稿し、資金が動く判断がある日だけメンションする | 注文、警告、実行失敗がある日だけ投稿する | 意図的差分 |
| 通知の経路 | Incoming WebhookをPythonコードから呼ぶ | Incoming WebhookをPythonコードから呼ぶ | 共通化候補 |

Expand All @@ -120,24 +126,25 @@ Webhook送信のタイムアウト、エラー処理、本文エスケープは
| Python環境 | uvとPEP 723 | uvとPEP 723 | 同期対象 |
| 実行パス | プロジェクト相対パス | プロジェクト相対パス | 同期対象 |
| 指示ファイル | `AGENTS.md`を正とし、`CLAUDE.md`を橋渡しにする | `AGENTS.md`を正とし、`CLAUDE.md`を橋渡しにする | 同期対象 |
| スキル | `.agents/skills/`へ同封し、リポジトリと一緒に版管理する | 現在はユーザースコープのスキルからローカルファイルを呼ぶ | 共通化候補 |
| 自動テスト | ネットワークを使わないテスト群とGitHub Actionsを持つ | 注文のpost-only交差判定に絞ったローカルテストを持つ | 同期対象 |
| 設計判断 | `docs/adr/`でプロジェクト境界、データ、出力、通知などを記録する | `docs/adr/`で指示ファイルと実行パスの判断を記録する | 同期対象 |
| スキル | `.agents/skills/`へ同封し、リポジトリと一緒に版管理する | 3つのプロジェクト固有スキルを`.agents/skills/`へ同封し、`.claude/skills/`から相対symlinkで参照する | 同期対象 |
| 自動テスト | ネットワークを使わないテスト群とGitHub Actionsを持つ | 確定足・指標、時刻ガード、注文キャンセル、TP配分、保護状態、公開設定などのネットワークなしテストとGitHub Actionsを持つ | 同期対象 |
| 静的検査と公開境界検査 | Ruff、スキル検証、追跡禁止ファイル検査をCIで行う | Ruff、compileall、スキル検証、追跡禁止ファイルの履歴検査、GitleaksをCIで行う | 同期対象 |
| 設計判断 | `docs/adr/`でプロジェクト境界、データ、出力、通知などを記録する | `docs/adr/`で指示、実行パス、Git公開境界、役割ベース命名、スキル同封を記録する | 同期対象 |

テスト件数を同じにする必要はない。
CryptoTradingCopilotでは、注文プラン検証、dry-run、発注ガード、TPとSLの部分失敗、二重発注防止の回帰テストが損失リスクに直結する。
CryptoTradingCopilotでは、注文プラン検証、dry-run、発注ガード、既存注文のキャンセル、
TP配分、保護注文の欠落、二重発注防止の回帰テストが損失リスクに直結する。
StockCopilotでは、市場別の確定足、公開禁止情報、中間表現の契約が優先される。

## 共通化候補の優先順位

| 候補 | 推奨する共有単位 | 優先度 | 現時点の評価 |
|---|---|---|---|
| 指標エンジン | 共通OHLCVフィクスチャと期待値。次に純粋計算関数 | 高 | 同じ指標の静かな乖離を検出でき、安全境界を結合しない |
| 指標エンジン | 共通OHLCVフィクスチャと期待値。次に純粋計算関数 | 高 | 両側にネットワークなしテストがあるため、共通期待値を追加すれば静かな乖離を検出できる |
| スクリーニング原則 | ATR正規化、20日レンジ、候補なしを含む振る舞いのテスト表 | 高 | 市場固有のデータ取得と閾値は分けたまま同期できる |
| 確定足 | 時間を注入できる共通インターフェースと境界テストの観点 | 中 | 市場カレンダーと24時間市場で実装条件が違うため、関数共有は急がない |
| 取得失敗の扱い | 空データと取得不能を区別する契約 | 中 | 語彙を統一するより、誤って正常扱いしないことを揃える |
| Slack送信 | Webhook送信だけの小さなヘルパー | 低 | 通知ポリシーは異なり、現状の重複量では依存追加の効果が小さい |
| スキル配置 | `.agents/skills/`と`CLAUDE.md`橋渡しの構成 | 中 | CryptoTradingCopilotのGit管理を始めるときに版管理単位を揃えられる |
| JSON契約 | スキーマバージョン、検証、生成と消費の分離という設計パターン | 中 | レポートと注文では語彙も失敗時の影響も違うため、スキーマ自体は共有しない |

共通化は、共有パッケージの作成だけを指さない。
Expand Down Expand Up @@ -167,7 +174,7 @@ StockCopilotでは、市場別の確定足、公開禁止情報、中間表現
| ATR正規化や20日レンジの意味を片側で変更した | スクリーニングの振る舞いの契約 |
| 空データを取得不能と誤認する不具合が発生した | 取得結果の状態と失敗時の契約 |
| Webhookの再送、タイムアウト、エスケープを両側で直す必要が生じた | Slack送信ヘルパー |
| CryptoTradingCopilotがGit管理とCIを始めた | スキル配置、共通テスト、共有パッケージの配布方法 |
| 共通フィクスチャを片側のCIへ導入した | 反対側への配布方法と更新責任 |
| 共通OHLCVで両実装の結果が一致しなくなった | コピー流用の継続可否と共有モジュール化 |

## 更新契機
Expand All @@ -176,13 +183,15 @@ StockCopilotでは、市場別の確定足、公開禁止情報、中間表現

| 領域 | StockCopilot | CryptoTradingCopilot |
|---|---|---|
| 指標 | `lib/indicators.py` | `swing/_analyze.py` |
| 確定足とデータ取得 | `lib/datasource.py` | `morning_signal.py`、`swing/_analyze.py` |
| スクリーニング | `screen.py`、`config/universe.py` | `swing/screen.py` |
| 状態の取得と継続分析 | `lib/holdings.py`、`lib/market_observation.py` | `swing/fetch_positions.py`、`swing/journal.md` |
| 指標 | `lib/indicators.py` | `position_review/analyze.py` |
| 確定足とデータ取得 | `lib/datasource.py` | `morning_signal.py`、`position_review/analyze.py` |
| スクリーニング | `screen.py`、`config/universe.py` | `position_review/screen.py` |
| 状態の取得と継続分析 | `lib/holdings.py`、`lib/market_observation.py` | `position_review/fetch_positions.py`、`position_review/journal.md` |
| 機械可読契約 | `docs/report-contract.schema.json`、`lib/contract.py` | `docs/ORDER_PLAN_SPEC.md`、`execute_orders.py` |
| 通知 | `lib/verdicts.py`、`notify.py` | `morning_signal.py` |
| 指示とスキル | `AGENTS.md`、`.agents/skills/` | `AGENTS.md`、ユーザースコープの関連スキル |
| 発注と保護 | 対象外 | `execute_orders.py`、`protect_position.py`、`morning_signal.py`、関連テスト |
| Git公開境界とCI | `.gitignore`、`.github/workflows/ci.yml` | `.gitignore`、`.github/workflows/ci.yml`、`.github/dependabot.yml` |
| 指示とスキル | `AGENTS.md`、`.agents/skills/` | `AGENTS.md`、`.agents/skills/`、`.claude/skills/` |

更新時は、変更した行だけでなく分類も見直す。
「意図的差分」が不要になった場合や、共有パッケージを採用する場合は設計判断が変わる。
Expand Down
Loading