portfolio-optimization について
Python C 拡張と NumPy を使った高性能なポートフォリオ最適化の実装と検証を支援するスキルです。数値計算の最適化に取り組む開発者向けに、実装、境界条件、ベンチマークの指針を提供します。
主な機能
- 01Python C 拡張の実装
- 02NumPy 配列のアクセスと検証
- 03数値の正しさの確認
- 04性能ベンチマーク
- 05境界条件とエラー処理
活用シーン
- 01ポートフォリオリスク計算の高速化
- 02共分散行列演算の最適化
- 03Python から C への変更の検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ letta-ai/ skills --skill portfolio-optimizationインストール後、Claude Code で/portfolio-optimizationを入力して読み込まれたか確認します。
詳細
ポートフォリオ最適化
概要
このスキルでは、Python C 拡張を使用して高性能なポートフォリオ最適化アルゴリズムを実装するためのガイダンスを提供します。NumPy 配列と連携する C 拡張の作成ワークフロー、適切な検証方法、数値計算の最適化で避けるべき一般的な落とし穴について説明します。
このスキルを適用する場面
次のような場合に、このスキルを適用してください。
- ポートフォリオのリスク計算(分散、ボラティリティ、シャープレシオ)を実装する場合
- 大規模な資産ポートフォリオ向けに行列とベクトルの演算を最適化する場合
- Python の数値計算コード用に C 拡張を作成する場合
- パフォーマンス要件で速度向上率(例:1.2 倍以上)が指定されている場合
- 共分散行列とポートフォリオのウェイトを扱う場合
推奨ワークフロー
フェーズ 1:コードベースの理解
コードを書く前に、次の作業を行ってください。
- 関連するソースファイルをすべて最後まで読む — ベースラインの実装、データ構造、想定されるインターフェースを理解します
- 数学的な演算を特定する — 一般的な演算には次のものがあります。
- 行列とベクトルの乗算(共分散行列とウェイトの積)
- 内積(ウェイトとリターンの積)
- 平方根の計算(分散からボラティリティを求める)
- テストスイートを理解する — 想定される正確性の許容誤差(例:1e-10)と、達成すべきパフォーマンスベンチマークを把握します
- 入出力の仕様を記録する — 配列の形状、データ型(通常は float64)、戻り値の仕様を記録します
フェーズ 2:実装の計画
実装の前に、次の要素を検討してください。
-
C によって高速化できる理由:
- Python インタープリターのオーバーヘッドを排除できます
- 境界チェックを介さずにメモリーへ直接アクセスできます
- コンパイラーによる最適化(ベクトル化、ループのアンローリング)が可能になります
- 一時配列の割り当てを減らせます
-
決定すべき設計事項:
- コピーなしで配列にアクセスするために NumPy C API を使用するかどうか
- メモリーレイアウトに関する前提(C 連続か Fortran 連続か)
- 型の不一致や次元エラーに対するエラー処理の方法
-
考えられるアルゴリズム最適化:
- キャッシュ効率の高いメモリーアクセスパターン(C 配列では行優先で反復)
- SIMD ベクトル化の機会
- Python から C へのデータ変換のオーバーヘッドの最小化
フェーズ 3:C 拡張の実装
C 拡張を実装する際は、次の点に注意してください。
-
適切なヘッダーをインクルードする:
Python.h(必ず最初に指定します)- NumPy 配列へのアクセスに使用する
numpy/arrayobject.h
-
モジュールの初期化関数で NumPy を初期化する:
- NumPy C API を初期化するために
import_array()を呼び出します
- NumPy C API を初期化するために
-
配列へのアクセスに NumPy C API を使用する:
- データポインターの取得には
PyArray_DATA()を使用します - 次元の取得には
PyArray_DIM()を使用します - メモリーストライドの取得には
PyArray_STRIDE()を使用します - メモリーレイアウトを確認するには
PyArray_IS_C_CONTIGUOUS()を使用します
- データポインターの取得には
-
堅牢なエラー処理を実装する:
- 配列の次元が想定される形状と一致することを検証します
- データ型を確認します(倍精度には
NPY_FLOAT64を想定します) - 非連続配列を処理します(拒否するか、ストライドを処理します)
- エラー時に適切な Python 例外を設定します
フェーズ 4:Python ラッパーの実装
次の機能を備えた Python モジュールを作成します。
- C 拡張モジュールをインポートする
- ベースライン API に一致する使いやすいインターフェースを提供する
- 必要な配列の準備(連続性の確保など)を行う
- インターフェースを明確に文書化する
フェーズ 5:検証戦略
重要:変更内容をすべて完全に検証してください
-
ファイルを編集した後、再度読み直す - 特に複数行にわたる変更について、編集が正しく適用されたことを確認してください
-
段階的にテストする:
- まず C 拡張をビルドし、コンパイルできることを確認してください
- 完全なベンチマークを実行する前に、個々の関数をテストしてください
- 規模を拡大する前に、小さなテストケースで正しさを確認してください
-
正しさの検証:
- 出力をベースライン実装と比較してください
- 適切な数値許容誤差を使用してください(倍精度では通常 1e-10)
- 期待される出力を手作業で計算できる既知の入力でテストしてください
-
パフォーマンスの検証:
- 代表的なデータサイズでベンチマークを実行してください
- ポートフォリオの規模が異なっても、速度向上が要件を満たすことを確認してください
- エッジケースをテストしてください:小規模なポートフォリオ(n=1、n=10)、大規模なポートフォリオ(n=5000+)
対処すべきエッジケース
実装で以下に対処できることを確認してください:
- 空のポートフォリオ(n=0)- 適切なデフォルト値を返すか、エラーを返す
- 単一資産のポートフォリオ(n=1)- 共分散の退化ケース
- 次元の不一致 - ウェイトベクトルの長さと共分散行列の次元
- 無効な入力:
- 正方行列でない共分散行列
- 入力に含まれる NaN または無限大の値
- 負の分散(数学的に無効)
- メモリに関する考慮事項:
- 非連続な NumPy 配列
- C コードでのメモリ割り当て失敗
- メモリに負荷がかかる可能性のある大規模なポートフォリオ
避けるべきよくある落とし穴
コードの完全性
- 編集操作でコードを途中で切り詰めないでください。常に完全な実装を提供してください
- 編集後にファイルの内容を確認し、変更が正しく適用されたことを確かめてください
- 設計上の選択をすべて明示的に文書化してください
テストの進め方
- 実装からいきなり完全なベンチマークテストに進まないでください
- 結合テストの前に、各関数を個別にテストしてください
- 検証で「テストに合格した」ことだけに頼らず、なぜ合格したのかを理解してください
C 拡張固有の注意事項
- データにアクセスする前に、必ず NumPy 配列の型を確認してください
- メモリリークを避けるため、参照カウントを適切に処理してください
- モジュールの初期化時に
import_array()で NumPy API を初期化してください - エラー時には
PyErr_SetString()を使用して例外を設定してください
パフォーマンスの検証
- 入力サイズが異なっても、速度向上が一貫していることを確認してください
- さらなる最適化が必要かもしれない場合は、プロファイリングしてください
- 小さな入力では、Python から C への切り替えに伴うオーバーヘッドを考慮してください
ビルドおよびテストコマンド
一般的なワークフローのコマンド:
# Build the C extension
python setup.py build_ext --inplace
# Run correctness tests
python -c "from portfolio_optimized import *; # test calls"
# Run benchmark
python benchmark.py
# Run full test suite
pytest test_portfolio.py -v
検証チェックリスト
タスクの完了と判断する前に、以下を確認してください:
- すべてのソースファイルを読み、内容を理解した
- C 拡張が警告なしでコンパイルされる
- 個々の関数の正しさをテストした
- 数値結果が許容誤差の範囲内でベースラインと一致する
- パフォーマンスが速度向上の要件を満たす
- エッジケースを明示的にテストするか、対処した
- 無効な入力に対するエラー処理を実装した
- すべての編集後にファイルの内容を確認した
- C コードにメモリリークがない(参照カウントを適切に処理している)
コメント
Markdown 対応