From 518435b9cc2e728fd83c398d43feb562894a62eb Mon Sep 17 00:00:00 2001 From: Ries630 Date: Thu, 27 Aug 2026 19:35:39 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20CryptoTradingCopilot=E3=81=AE=E7=8F=BE?= =?UTF-8?q?=E7=8A=B6=E3=82=92=E5=85=84=E5=BC=9F=E6=AF=94=E8=BC=83=E3=81=B8?= =?UTF-8?q?=E5=8F=8D=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Git管理、CI、スキル同封、position_reviewへの改名、発注安全ガードを比較文書へ同期する。\n\nRefs #91 --- docs/sibling-project-comparison.md | 63 +++++++++++++++++------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/docs/sibling-project-comparison.md b/docs/sibling-project-comparison.md index 6e0771b..e3704d6 100644 --- a/docs/sibling-project-comparison.md +++ b/docs/sibling-project-comparison.md @@ -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側のパスは、同プロジェクトのルートからの相対パスで表す。 @@ -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との差を埋める対象ではない。 この境界があるため、株式分析の変更から本番注文へ到達する経路が生まれない。 @@ -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時間変動と暗号資産会場の流動性を使う。 @@ -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から取引環境への依存が生じる可能性がある。 最初に共有するなら、計算結果のテストベクトルが適している。 @@ -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コードから呼ぶ | 共通化候補 | @@ -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契約 | スキーマバージョン、検証、生成と消費の分離という設計パターン | 中 | レポートと注文では語彙も失敗時の影響も違うため、スキーマ自体は共有しない | 共通化は、共有パッケージの作成だけを指さない。 @@ -167,7 +174,7 @@ StockCopilotでは、市場別の確定足、公開禁止情報、中間表現 | ATR正規化や20日レンジの意味を片側で変更した | スクリーニングの振る舞いの契約 | | 空データを取得不能と誤認する不具合が発生した | 取得結果の状態と失敗時の契約 | | Webhookの再送、タイムアウト、エスケープを両側で直す必要が生じた | Slack送信ヘルパー | -| CryptoTradingCopilotがGit管理とCIを始めた | スキル配置、共通テスト、共有パッケージの配布方法 | +| 共通フィクスチャを片側のCIへ導入した | 反対側への配布方法と更新責任 | | 共通OHLCVで両実装の結果が一致しなくなった | コピー流用の継続可否と共有モジュール化 | ## 更新契機 @@ -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/` | 更新時は、変更した行だけでなく分類も見直す。 「意図的差分」が不要になった場合や、共有パッケージを採用する場合は設計判断が変わる。