algo-portfolio について
複数のOpenAlgo戦略を実行するポートフォリオランナーの設定と運用を案内するスキルです。YAML設定と全体のリスク上限を使い、戦略を別々のサブプロセスで動かして損益を監視します。バックテストは統合せず、戦略ごとに実行します。
主な機能
- 01YAMLによるポートフォリオ設定
- 02戦略を独立したサブプロセスで実行
- 03合計損益と全体上限の監視
- 04上限超過時の戦略停止
- 05ライブと個別バックテストに対応
活用シーン
- 01共通のリスク上限で複数のOpenAlgo戦略を起動
- 02ポートフォリオの上限到達時に戦略プロセスを停止
- 03構成戦略を個別にバックテスト
MCP 対応
このスキルでは、OpenAlgoのクライアントとプラットフォーム操作を使ったポジション監視や注文管理を説明します。MCPサーバーやMCPクライアントとの連携については記載されていません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ marketcalls/ openalgo-execution-skills --skill algo-portfolioインストール後、Claude Code で/algo-portfolioを入力して読み込まれたか確認します。
詳細
グローバルリスク上限を設定して、複数戦略のポートフォリオを起動します。
引数
$0= YAML 設定ファイルのパス。デフォルト:現在のディレクトリにあるportfolio.yaml- 設定ファイルのパスの後に
--mode backtestまたは--mode liveを指定します
設定ファイルが存在しない場合は、ひな形の portfolio.yaml を生成します。
手順
algo-expert/rules/portfolio-risk.mdを読みます。- 設定ファイルが存在しない場合は、次のひな形を生成します。
# Portfolio Runner Configuration
# See algo-expert/rules/portfolio-risk.md for cap explanations
capital: 1000000
portfolio_caps:
portfolio_sl_pct: 0.02 # halt all at -2% capital
portfolio_tp_pct: 0.03 # halt all at +3% capital
daily_loss_pct: 0.015 # daily loss limit
daily_target_pct: 0.025 # daily target
max_concurrent_positions: 5
max_symbol_concentration: 0.30 # max 30% of capital in one symbol
strategies:
# List your generated strategies. The runner spawns each as a subprocess.
- name: ema_sbin
path: strategies/ema_crossover_SBIN/strategy.py
env:
SYMBOL: SBIN
INTERVAL: 5m
- name: rsi_reliance
path: strategies/rsi_RELIANCE/strategy.py
env:
SYMBOL: RELIANCE
INTERVAL: 15m
- 各戦略のパスが存在することを確認します。存在しない場合は、先に
/algo-strategyを実行して作成するよう提案します。 - プロジェクトのルートに、
core/portfolio_runner.pyをラップする実行スクリプトrun_portfolio.pyを生成します(存在する場合は更新します)。
"""Portfolio runner entry point."""
import argparse, logging, os, sys
from pathlib import Path
from dotenv import find_dotenv, load_dotenv
# Add core helpers to path
_HERE = Path(__file__).resolve().parent
for p in [_HERE, *_HERE.parents]:
c = p / ".claude" / "skills" / "algo-expert" / "rules" / "assets" / "core"
if c.exists():
sys.path.insert(0, str(c.parent)); break
from openalgo import api
from core.portfolio_runner import PortfolioRunner
logging.basicConfig(level=os.getenv("LOG_LEVEL", "INFO"),
format="%(asctime)s [%(levelname)s] %(name)s - %(message)s",
stream=sys.stdout)
load_dotenv(find_dotenv(usecwd=True))
def make_client():
return api(
api_key=os.getenv("OPENALGO_API_KEY", ""),
host=os.getenv("HOST_SERVER") or os.getenv("OPENALGO_HOST", "http://127.0.0.1:5000"),
)
def main():
p = argparse.ArgumentParser()
p.add_argument("--config", default="portfolio.yaml")
p.add_argument("--mode", choices=["backtest", "live"], default="live")
args = p.parse_args()
runner = PortfolioRunner(args.config, client_factory=make_client, mode=args.mode)
runner.start()
runner.join()
if __name__ == "__main__":
main()
-
実行します。
python run_portfolio.py --config portfolio.yaml --mode live -
ユーザーに次の内容を伝えます。
- 各戦略はそれぞれ独立したサブプロセスで実行されます(完全に分離されています)
- 上限に達した場合、または Ctrl-C を押した場合、SIGTERM が伝播されます
- ランナーは
client.positionbook()を使って、15 秒ごとに合計 P&L を監視します - 上限に達すると、プラットフォーム全体で
cancelallorderとclosepositionが呼び出されます - ライブとサンドボックスの切り替えは、OpenAlgo の UI アナライザーのトグルで決まります(単一の戦略と同じです)
バックテストモード
複数の戦略を対象とする合計エクイティのバックテストには、カスタムのマージロジック(ウェイトのリバランス、上限の適用タイミング)が必要です。デフォルトのランナーはバックテストモードではこれを行わず、各子プロセスがそれぞれ独立して VectorBT バックテストを実行します。真のポートフォリオバックテストを行うには、algo-expert/rules/portfolio-risk.md のエクイティ統合パターンを参照してください。
上限の優先順位
複数の上限が同時に発動した場合、最も厳しい上限が優先されます。キルスイッチはセッションごとに一度だけ発動します。ランナーを再実行すると、IST の午前0時に日次カウンターがリセットされます。
上限到達時の Telegram アラート
ポートフォリオ停止時に Telegram アラートを送信するには、.env に TELEGRAM_USERNAME を設定し、core/portfolio_runner.py の stop_all() メソッドを拡張します。logging-and-alerts.md を参照してください。
避けること
- アイコンや絵文字を使わないでください
- 上限に達したときに、上限を黙って引き上げないでください。安全策が無効になります
- 同じ OpenAlgo インスタンスに対して、2 つの
PortfolioRunnerプロセスを実行しないでください。どちらも上限到達時にポジションを解消しようとするため、競合します