Skip to main content

; toggle persists via localStorage. */ body.lp-theme { background: #E6E6E6; color: #0E0E0E; font-family: Inter, 'Helvetica Neue', Arial, sans-serif; padding: 28px 22px 48px; } body.lp-theme .container { max-width: none; margin: 0 auto; } body.lp-theme .page-header { border-bottom: none; padding-bottom: 4px; margin-bottom: 28px; align-items: baseline; } body.lp-theme .page-header h1 { color: #082647; font-family: Georgia, 'Times New Roman', serif; font-weight: 500; font-size: 32px; line-height: 1.15; letter-spacing: -0.01em; } body.lp-theme .page-header .subtitle { color: #777; font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; } body.lp-theme .tabs { border-bottom-color: #BBBBBB; margin-bottom: 28px; } body.lp-theme .tab-btn { color: #777; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; padding: 12px 16px; } body.lp-theme .tab-btn:hover { color: #082647; } body.lp-theme .tab-btn.active { color: #082647; border-bottom-color: #082647; border-bottom-width: 2px; } body.lp-theme .section-title { color: #082647; border-bottom-color: #DDDDDD; font-family: Georgia, 'Times New Roman', serif; font-size: 20px; font-weight: 500; letter-spacing: -0.005em; margin: 32px 0 14px; padding-bottom: 8px; text-transform: none; } body.lp-theme .stats-table { background: #F5F5F5; border: 1px solid #DDDDDD; border-radius: 6px; overflow: hidden; font-size: 13px; } body.lp-theme .stats-table th, body.lp-theme .stats-table td { border-bottom-color: #DDDDDD; padding: 11px 16px; } body.lp-theme .stats-table thead th { color: #082647; background: #FAFAFA; border-bottom: 1px solid #BBBBBB; font-size: 11px; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; } body.lp-theme .stats-table tbody td { color: #0E0E0E; font-variant-numeric: tabular-nums; } body.lp-theme .stats-table tbody td:first-child + td, body.lp-theme .stats-table tbody td:only-child { color: #0E0E0E; } body.lp-theme .stats-table tbody td.num { color: #082647; font-weight: 600; } body.lp-theme .stats-table tbody tr:hover td { background: #FAFAFA; } body.lp-theme .stats-table tr.section-row td { background: #EDEDED; color: #777; font-size: 10px; letter-spacing: 0.12em; } body.lp-theme .chart-card { background: #F5F5F5; border: 1px solid #DDDDDD; border-radius: 6px; padding: 18px 18px 14px; } body.lp-theme .chart-card .card-title { color: #777; font-size: 11px; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase; margin-bottom: 12px; } body.lp-theme .placeholder { color: #777; } body.lp-theme .placeholder em { color: #555; } body.lp-theme .help-tip { background: #DDDDDD; color: #555; } body.lp-theme .help-tip:hover { background: #C8C8C8; color: #082647; } body.lp-theme .help-tip .tip-content { background: #FFFFFF; border-color: #BBBBBB; color: #0E0E0E; box-shadow: 0 4px 16px rgba(8, 38, 71, 0.18); } body.lp-theme .help-tip .tip-content b { color: #082647; } body.lp-theme .help-tip .tip-content .pos { color: #0b6b47; } body.lp-theme .help-tip .tip-content .neg { color: #a01919; } body.lp-theme .kpi-card { background: #F5F5F5; border: 1px solid #DDDDDD; border-left: 3px solid #1C80ED; border-radius: 6px; padding: 16px 18px 18px; } body.lp-theme .kpi-card .kpi-label { color: #777; font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; } body.lp-theme .kpi-card .kpi-value { color: #082647; font-family: Georgia, 'Times New Roman', serif; font-weight: 500; font-size: 28px; letter-spacing: -0.01em; margin-top: 4px; } body.lp-theme .kpi-card .kpi-sub { color: #777; font-size: 12px; margin-top: 4px; } body.lp-theme .kpi-card.green { border-left-color: #1ED492; } body.lp-theme .kpi-card.red { border-left-color: #FF4545; } body.lp-theme .kpi-card.amber { border-left-color: #E9A032; } body.lp-theme .wave-card { background: #F5F5F5; color: #082647; border: 1px solid #DDDDDD; border-left: 3px solid #082647; } body.lp-theme .wave-card-head { border-bottom-color: #DDDDDD; } body.lp-theme .wave-card-date { color: #777; font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; } body.lp-theme .wave-card-name { color: #082647; font-family: Georgia, 'Times New Roman', serif; font-weight: 500; } body.lp-theme .wave-card-label { color: #777; } body.lp-theme .wave-card-stats { color: #555; } body.lp-theme .wave-card-stats b { color: #082647; } body.lp-theme .wave-card-text { color: #555; } body.lp-theme .wave-arrow { color: #BBBBBB; } body.lp-theme .standout-card { background: #F5F5F5; border: 1px solid #DDDDDD; border-radius: 6px; } body.lp-theme .standout-card-head { border-bottom-color: #DDDDDD; } body.lp-theme .standout-card-ticker { color: #082647; font-family: Georgia, 'Times New Roman', serif; } body.lp-theme .standout-card-meta { color: #777; } body.lp-theme .standout-card-text { color: #555; } body.lp-theme .theme-toggle { background: #FFFFFF; border-color: #DDDDDD; } body.lp-theme .theme-toggle button { color: #777; } body.lp-theme .theme-toggle button.active { background: #082647; color: #FFFFFF; } /* Native form controls in LP theme — Attribution dimension picker etc. */ body.lp-theme select, body.lp-theme input[type="text"], body.lp-theme input[type="search"] { background: #FFFFFF; color: #082647; border: 1px solid #BBBBBB; border-radius: 4px; padding: 6px 10px; font-family: inherit; font-size: 13px; } body.lp-theme select:hover { border-color: #082647; } /* Trade log sortable header arrows (data-sort) — readable on light bg. */ body.lp-theme .stats-table th[data-sort] { color: #082647; } /* Print-friendly export: hide the theme toggle & tab nav when the user * hits ⌘P from the LP view, and force the light palette regardless of * whether the LP toggle is on. */ @media print { .theme-toggle, .tabs { display: none !important; } body { background: #FFFFFF !important; color: #0E0E0E !important; padding: 0 !important; } .chart-card, .stats-table, .kpi-card, .wave-card, .standout-card { background: #FFFFFF !important; border-color: #DDDDDD !important; page-break-inside: avoid; } .page-header h1 { color: #082647 !important; } }
Cumulative Performance
P&L Δ — Daily Portfolio P&L & Top / Bottom Contributors
Total
—
High (single day)
—
Low (single day)
—
Avg
—
Win days
—
Range
—
Top Contributors
Bottom Contributors
Alpha & Beta return — XBI
Total
—
High (cum)
—
Low (cum)
—
Period XBI
—
Top α (beat XBI)
Bottom α (lagged XBI)
Total
—
High (cum)
—
Low (cum)
—
Avg β (weighted)
—
Top β contributors
Bottom β contributors
Performance Summary
Monthly Returns — Portfolio vs XBI
Rolling risk metrics — window:
Rolling Sharpe (rf=0)
Rolling Sortino (rf=0)
Rolling Daily Return Skew
Rolling Excess Kurtosis
Intra-Portfolio Correlation (26-week rolling)
Gross & Net Exposure Over Time
β-Adj Exposure (XBI) ?β-Adjusted Exposure = Σ (position weight × per-stock XBI beta).

Each name's contribution to total market exposure scales by its sensitivity to XBI — a 10% position in a β=1.5 name contributes 15% of β-adj exposure, while a 10% position in a β=0.5 name contributes 5%.

For a long-only biotech book with median β≈1.15, expect β-adj gross around 100–130%.
—
β-Adj High ?Peak β-adjusted gross over the selected date range. Indicates the maximum market exposure the book ran during the window.
—
Position Count ?Count of held instruments on the most recent day. Excludes flat-weight (0%) names.

For a concentrated biotech book, typical range is 20–30. Below 15 = highly concentrated; above 40 = diversified / index-like.
—
Period Turnover ?Period Turnover = Σ over each day in range of Σ |weightt − weightt−1| across all tickers.

Captures cumulative rebalance activity. Each unit of "1%" means 1 percentage point of NAV churned between names that day; sum across all days gives total period activity.

Note: a single rebalance that swaps a 5% position for another counts as 10% turnover (5% out + 5% in). For a low-frequency catalyst-driven book, expect 10–50% over a 6-month window. High three-digit values mean frequent rotation.
—
Per-name β contribution to gross exposure (latest day) ?For the most recent day in the data, each held ticker's weight × β contribution to β-adj gross. Sorted descending.

Tells you where your market exposure is concentrated — a 10% RVMD position at β=1.15 contributes 11.5% of β-adj gross, while a 10% UTHR position at β=0.40 only contributes 4%.
Top per-name turnover contributors (range total) ?Sum of |Δw| per ticker over the selected date range. Tells you which names were traded most actively.

High values typically mean either (a) a position was added then trimmed/sold within the window, or (b) the name was rebalanced up/down multiple times. Sustained tight-band drift won't make this list.
Expected Volatility ?Expected Vol = Σ wi × σi, where σi is each ticker's 60-day rolling annualized stddev of daily returns.

This is a naive aggregation — it sums per-stock vols weighted by position size, ignoring correlations. For a highly-correlated biotech book, this systematically understates true portfolio vol (correlations push it higher).

Compare to Realized Vol to see how good the forecast is.
End
—
High
—
Low
—
Avg
—
Per-name expected vol contribution (latest day) ?Each held ticker's w × σ contribution to portfolio Expected Vol. Sorted descending. Highlights which positions are driving market-risk exposure.
Expected Beta — SPY ?Expected β SPY = Σ wi × βSPY,i, using precomputed 400-day regression betas from stock_macro_betas.

Different from the XBI β on the Exposure tab — SPY β measures sensitivity to the broad market (S&P 500), not biotech sector. For an LP risk discussion, this is the headline market-exposure number.

Biotech often has SPY β below 1 because its idiosyncratic clinical/regulatory drivers dilute broad-market sensitivity.
End
—
High
—
Low
—
Avg
—
Per-name SPY β contribution (latest day) ?Each held ticker's w × βSPY. Tells you which positions are driving broad-market exposure.
Realized Volatility ?Realized Vol = 60-day rolling stddev of daily portfolio returns × √252, annualized %.

This is the vol the book actually delivered, not predicted. Reflects the true second moment of P&L distribution.

Compare to Expected Vol — gap = correlation effect. Larger gap = more correlated book than the naive sum suggests.
End
—
High
—
Low
—
Avg
—
Realized vol is a book-level metric — no per-name decomposition without a full covariance matrix.
Value at Risk — 95% / 1 day ?Parametric VaR95,1d = 1.645 × σdaily, where σdaily is the 60-day rolling stddev of daily portfolio returns (in %).

Interpretation: "On 95% of days we expect to lose less than X%." A VaR of 2.67% means: on a typical day, we'd expect losses worse than 2.67% only ~5% of the time (about once a month).

Limitations: assumes normal distribution. Real fat-tail biotech losses (clinical fails, FDA setbacks) can blow through parametric VaR. Use Expected Shortfall (CVaR) or scenario stress for tail context.
End
—
High
—
Low
—
Avg
—
Per-name VaR contribution (latest day, naive) ?Each held ticker's w × σ × 1.645 / √252 — the naive marginal VaR if positions were uncorrelated. Sums to portfolio VaR only under zero-correlation assumption; real number is lower due to diversification.
Attribution computed on the 52 trade cycles from the trade log (entry → exit, weighted by entry sizing).
Number of Positions
Total P&L Attribution (sizing-weighted return)
Average Sizing (% of NAV)
Average Return per Position
Historical Exposure — stacked over time (drifted weights × selected dimension)
Daily Rollup — Batting Average & Slugging Ratio (instrument-level, unweighted)
End
—
Avg
—
High
—
Low
—
End
—
Median
—
High
—
Low
—
Return Distribution (all trades)
Sizing vs Return
Position Returns Waterfall (all trades, sorted)
Profit Factor Formula (closed trades only)
Winners vs Losers
Top 5 / Bottom 5 (sizing-weighted return)
P&L Distribution Waterfall (grouped)
Holding Period — Exited Positions
Holding Period — Open Positions
Return Capture Analysis — % of available return captured per position
Sizing vs Selection P&L Decomposition ?Selection P&L = what you would have earned if every position were equal-weighted (just picking the right names). Sizing P&L = what you earned on top of that from sizing decisions (over/under-weighting). Total = Selection + Sizing. If Sizing > 0, your sizing helped. If Sizing < 0, equal-weighting would have been better.
Top 5 Sizing Decisions That Helped
Top 5 Sizing Decisions That Hurt
Δ Sizing vs Return (each position) ?Each dot is one position. X-axis = how much we over- or under-weighted vs equal weight. Y-axis = realized return. Top-right quadrant = overweighted a winner (good sizing). Top-left = underweighted a winner (missed alpha). Bottom-right = overweighted a loser (bad sizing). Bottom-left = underweighted a loser (saved P&L).
Scenario Stress P&L — current portfolio applied to historical drawdowns ?Apply the historical index return from each named drawdown period (XBI return over that window) to today's portfolio, using realized beta from the inception-to-date period. This is a quick "what would today's book have done" stress test — not a full re-pricing.
Worst 5 Drawdown Contributors (realized)
Best 5 Drawdown Cushions (realized)
Upcoming Catalyst Calendar (open positions only)
Trading Activity by Rebalance — buys/sells + dollar turnover
Standout Calls on the Upside
Missed Opportunities
Trade Log (click column to sort)
Position View — select a ticker
Avg Buy Price
—
Avg Sell Price
—
Avg Instrument Price
—
Current Price
—
Min Price
—
Max Price
—
Avg Exposure
—
P&L Contribution
—