trader-portfolio-cg について
trader-portfolio-cgは、従来のNeumann法に代わり、共役勾配法で平均分散ポートフォリオのウェイトを求めるスキルです。neural-traderから共分散と期待リターンを読み込み、利用可能ならネイティブMCPソルバーを使い、そうでなければローカルのJavaScript CGに切り替えて結果にソルバーの情報を記録します。
主な機能
- 01共役勾配法によるポートフォリオ最適化
- 02ネイティブMCPソルバーとローカル代替
- 03不適切な入力時のNeumann法への切り替え
- 04ソルバーと反復回数のメタデータ
- 05過去のウェイトとの差の確認
活用シーン
- 01共分散データからポートフォリオウェイトを算出
- 02利用可能な場合にネイティブソルバーを使用
- 03MCPソルバーが使えない場合にローカル計算へ切り替え
- 04ウェイトを過去のパターンと比較
MCP 対応
mcp__ruflo-sublinear__solveツールを呼び出してネイティブの共役勾配法で解けます。ほかのMCPツールを使ったポートフォリオデータの読み込みと保存にも対応します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ruvnet/ ruflo --skill trader-portfolio-cgインストール後、Claude Code で/trader-portfolio-cgを入力して読み込まれたか確認します。
詳細
従来の Neumann 級数の代わりに、共役勾配法で平均分散最適化 Σ · x = μ を解きます。
Neumann 法ではなく CG を使う理由(ADR-123 Wedge 8):
- Neumann 級数:n=256 で約 50 µs(従来の
npx neural-trader --portfolio optimize) - 共役勾配法:n=256 で約 816 ns(このスキル)
- 実測で 40~60 倍高速化。固定シードで誤差は 1e-4 以内です。
共分散行列 Σ は構成上、対称正定値です(実際のリターンから得られるグラム行列です)。そのため、CG は理論上最適です。前処理なしでも最大 n 回の反復で収束し、固有値がまとまっている場合は通常それよりはるかに少ない反復で収束します。
無効化フラグ:RUFLO_NEURAL_TRADER_DISABLE_CG=1 を設定すると、CG の経路を完全にスキップし、ステップ 4 の従来の Neumann 経路に進みます。A/B 検証や、上流の共分散計算の回帰によって SPD 性が損なわれた場合に便利です。
ネイティブディスパッチフラグ:RUFLO_SUBLINEAR_NATIVE=1 を設定すると、globalThis でツールが公開されていない場合でも、アダプターがネイティブの mcp__ruflo-sublinear__solve 経路を試すよう強制できます(ハーネスが別のトランスポート経由でツールをマウントする場合など)。ネイティブディスパッチに失敗した場合、アダプターはローカルの JS CG に適切にフォールバックし、アーティファクトのメタデータに method: 'cg-local' を記録します。そのため、回帰を監査できます。
手順:
-
neural-trader が利用可能であることを確認します:
npm ls neural-trader 2>/dev/null || npm install --ignore-scripts neural-trader -
neural-trader のポートフォリオ API から、現在の共分散行列 Σ と期待リターンベクトル μ を読み取ります:
# Primary path (preferred — clean JSON): npx neural-trader --portfolio current --json # Fallback paths if the --json flag is unavailable on the installed version: npx neural-trader --portfolio current # parse the text output # OR pull from AgentDB if a prior run stored the matrix there:mcp__plugin_ruflo-core_ruflo__memory_search({ query: "covariance matrix current", namespace: "trading-risk", limit: 1 })スキルは、レスポンスに
covariance: number[][](n × n)とexpectedReturns: number[](長さ n)が含まれることを想定しています。 -
RUFLO_NEURAL_TRADER_DISABLE_CGが未設定の場合、SublinearAdapter 経由で Σ · x = μ を解きます(推奨経路):import { sublinearAdapter } from '../../src/sublinear-adapter.mjs'; const result = await sublinearAdapter.solveCG(COVARIANCE, EXPECTED_RETURNS, { tolerance: 1e-6, maxIterations: 200, }); // result.solution — optimal weights (number[]) // result.iterations — CG iterations executed // result.residual — final ||A·x − b||₂ // result.latencyMs — wall-clock latency // result.method — 'cg-sublinear-native' | 'cg-local' <-- READ THIS // result.solver — '[email protected]' | 'local-js-cg' // result.degraded — true if input failed SPD checks (fall back to step 4)アダプターがディスパッチを実行します。
globalThis上のmcp__ruflo-sublinear__solveを確認し(手動でのオーバーライドとしてRUFLO_SUBLINEAR_NATIVE=1も尊重します)、利用可能な場合はネイティブカーネル経由で処理し、利用できない場合は組み込みの約 50 行の JS CG に透過的にフォールバックします。どちらの方法でも計算は同じです。CG、密形式、n × n の SPD 共分散行列を使用します。オペレーターはresult.methodを参照して、どのバックエンドがアーティファクトを生成したかを確認します。ネイティブ MCP ツールのワイヤ形式(アダプターを介さずに直接呼び出す場合):
mcp__ruflo-sublinear__solve({ matrix: COVARIANCE, rhs: EXPECTED_RETURNS, algorithm: "cg", tolerance: 1e-6, maxIterations: 200 })出力:
{ solution: number[], iterations: number, residual: number } -
フォールバック(従来の Neumann 法) — ステップ 3 で
degraded: true(非 SPD 入力、非正方行列、MCP エラー)が報告された場合、またはRUFLO_NEURAL_TRADER_DISABLE_CG=1の場合:npx neural-trader --portfolio optimize重みの出力を取得し、アーティファクトのメタデータに
method: 'neumann-fallback'とreasonフィールドを付けます。 -
完全な来歴メタデータとともに、最適な重みを
trading-risk名前空間に保存します。実行されたバックエンドをオペレーターが確認できるよう、methodとsolverはアダプターの結果からそのまま取得します:mcp__plugin_ruflo-core_ruflo__memory_store({ key: "portfolio-weights-PORTFOLIO_ID-TIMESTAMP", namespace: "trading-risk", value: JSON.stringify({ weights: result.solution, // number[] from step 3 (or weights from step 4 fallback) method: result.method, // 'cg-sublinear-native' | 'cg-local' | 'neumann-fallback' solver: result.solver, // '[email protected]' | 'local-js-cg' | 'neural-trader-cli' iterations: result.iterations, residual: result.residual, latencyMs: result.latencyMs, capturedAt: NEW_DATE_ISO, reason: FALLBACK_REASON || null }) })trading-risk名前空間は正規の保存先です(ADR-126 Phase 1、5 つの名前空間の整合)。ポートフォリオの重みは Phase 4 で Ed25519 署名される監査証跡であるため、長期保存し、TTL は設定しません。 -
過去のパターンと照合します(任意ですが推奨):
mcp__plugin_ruflo-core_ruflo__agentdb_pattern-search({ query: "portfolio weights Sharpe regime:CURRENT_REGIME", namespace: "trading-risk" })新しい重みが、いずれか 1 つの資産について過去の中央値から 30% を超えて異なる場合は、適用前に人による確認を求めます。これはガードレールであり、厳格なブロック条件ではありません。
受け入れ基準(ADR-126 Phase 3):
- n = 256 の共分散行列でレイテンシが 1 ms 未満(ローカル JS CG)。ネイティブ経路の目標は 40~60 倍の高速化([email protected] によると、ネイティブは 816 ns、Neumann 法は 50 µs)。
- 固定シードで従来の Neumann 法との誤差が
||cg − neumann||_∞ < 1e-4。 - ネイティブ MCP が利用できない場合、または共分散行列が非 SPD の場合に、フォールバック経路が適切に動作する。
- アーティファクトのメタデータで
cg-sublinear-native、cg-local、neumann-fallbackを区別できる。
参照先:
- ADR-126 Phase 3(このスキルを作成した ADR)
- ADR-123 §162 Row 8(Wedge 8 の高速化に関する主張)
- ADR-123 §262-289(SublinearAdapter の仕様)
plugins/ruflo-neural-trader/src/sublinear-adapter.ts(アダプター)plugins/ruflo-neural-trader/benchmarks/portfolio-cg.bench.ts(実測値)