{{ "%+.2f"|format(portfolio.mtd_pnl * 100) }}%
Abel Portfolio · month to date
{{ "%+.2f"|format(portfolio.today_pnl * 100) }}%
today
{{ "%+.2f"|format(portfolio.total_pnl * 100) }}%
YTD
{{ portfolio.n_active }}/{{ portfolio.n_strats }}
active
Signals
{% for ticker, price in portfolio.prices.items() %}
{{ ticker }} ${{ "%.2f"|format(price) }}
{% endfor %}
strategy
pos
today
mtd
ytd
{% for sig in portfolio.signals_active %}
{{ sig.name }}
{{ "%.2f"|format(sig.position) }}
{% if sig.changed %}
NEW
{% endif %}
{{ "%+.2f"|format(sig.today_pnl * 100) }}%
{{ "%+.1f"|format(sig.mtd_pnl * 100) }}%
{{ "%+.1f"|format(sig.ytd_pnl * 100) }}%
{% endfor %}
{% if portfolio.signals_flat %}
flat ({{ portfolio.n_flat }})
{% for sig in portfolio.signals_flat %}
{{ sig.name }}
—
—
{{ "%+.1f"|format(sig.mtd_pnl * 100) }}%
{{ "%+.1f"|format(sig.ytd_pnl * 100) }}%
{% endfor %}
{% endif %}
Recent
updated {{ portfolio.stale_label }}
{% for day in portfolio.recent_days %}
{{ day.date }}
{{ day.n_active }} active
{{ "%+.2f"|format(day.pnl * 100) }}%
{{ day.spark }}
{% endfor %}
{% if portfolio.live_perf %}
Live Performance (since March 2026)
| Strategy |
Days |
Active |
Sharpe |
PnL |
MaxDD |
Win |
{% for p in portfolio.live_perf %}
| ● {{ p.name }} |
{{ p.days }} |
{{ p.active_days }} |
{{ "%.2f"|format(p.sharpe) }} |
{{ "%+.2f"|format(p.pnl * 100) }}% |
{% if p.max_dd > 0 %}-{{ "%.1f"|format(p.max_dd * 100) }}%{% else %}0%{% endif %} |
{{ "%.0f"|format(p.win_rate * 100) }}% |
{% endfor %}
{% endif %}
Ledger
Strategy
Action
Size
PnL
Cum
{% for day in portfolio.ledger %}
{% for entry in day.entries %}
{{ entry.name }}
{{ entry.action }}
{{ "%.2f"|format(entry.position) if entry.position > 0.01 else "—" }}
{{ "%+.3f"|format(entry.pnl * 100) }}%
{{ "%+.2f"|format(entry.cum_pnl * 100) }}%
{% if entry.pnl > 0 %}
{% elif entry.pnl < 0 %}
{% endif %}
{% endfor %}
{% endfor %}
{% for s in strategies %}
{% endfor %}
{% for s in strategies %}
{% if s.has_data %}
{% for lbl, key, fmt in [("Sharpe", "sharpe", "%.2f"), ("PnL", "cum_pnl", None), ("MaxDD", "max_dd", None), ("Calmar", "calmar", "%.1f"), ("Win Rate", "win_rate", None), ("Days", "n_days", "%d")] %}
{{ lbl }}
{% if key == 'cum_pnl' %}{{ fmt_pnl_pct(s.metrics[key]) }}{% elif key == 'max_dd' %}-{{ "%.1f"|format(s.metrics[key] * 100) }}%{% elif key == 'win_rate' %}{{ "%.0f"|format(s.metrics[key] * 100) }}%{% elif fmt %}{{ fmt|format(s.metrics[key]) }}{% else %}{{ s.metrics[key] }}{% endif %}
{% endfor %}
{% if s.validation %}
{% for lbl, val in [("Lo-adjusted", s.validation.metrics.get("lo_adjusted", 0)), ("IC", s.validation.metrics.get("ic", 0)), ("Omega", s.validation.metrics.get("omega", 0)), ("DSR", s.validation.metrics.get("dsr", 0)), ("PBO", s.validation.metrics.get("pbo", 0)), ("OOS/IS", s.validation.metrics.get("oos_is", 0))] %}
{{ lbl }}
{% if lbl in ('DSR', 'PBO') %}{{ "%.0f"|format(val * 100) }}%{% else %}{{ "%.3f"|format(val) }}{% endif %}
{% endfor %}
{% endif %}
{% if s.live %}
Live Sharpe
{{ "%.2f"|format(s.live.sharpe) }}
Live PnL
{{ fmt_pnl_pct(s.live.cum_pnl) }}
Period
{{ s.live.start }} → {{ s.live.end }}
{% endif %}
{% if s.yearly %}
| Year | Sharpe | PnL | Days |
{% for y in s.yearly %}
| {{ y.year }} |
{{ "%.2f"|format(y.sharpe) }} |
{{ "%+.1f"|format(y.pnl_pct) }}% |
{{ y.n_days }} |
{% endfor %}
{% endif %}
{% if s.live and s.live.ledger %}
Live Ledger
| Date | Position | {% if s.live.ledger[0].price is defined and s.live.ledger[0].price %}Price | {% endif %}PnL | Cum |
{% for row in s.live.ledger[-20:] %}
| {{ row.date }} |
{% if row.position > 0.01 %}{{ "%.2f"|format(row.position) }}{% else %}—{% endif %} |
{% if row.price %}${{ "%.2f"|format(row.price) }} | {% endif %}
{{ "%+.3f"|format(row.pnl_pct) }}% |
{{ "%+.2f"|format(row.cum_pct) }}% |
{% endfor %}
{% endif %}
{% else %}
No data. Run abel-edge run --strategy {{ s.id }}
{% endif %}
{% endfor %}