{#if error}
⚠ {error}
{/if}
{#if loading || loadingCats}
{/if}
{#if ctx}
10Y
{ctx.riskFreeRate?.toFixed(2)}%
VIX
{ctx.vixLevel?.toFixed(1)}
S&P
{ctx.sp500Price?.toLocaleString()}
S&P P/E
{fmtPE(ctx.benchmarks?.marketPE?.toFixed(1))}
Tech P/E
{fmtPE(ctx.benchmarks?.techPE?.toFixed(1))}
REIT Yld
{ctx.benchmarks?.reitYield?.toFixed(2)}%
IG Sprd
{ctx.benchmarks?.igSpread?.toFixed(2)}%
Rates
{ctx.rateRegime}
Vol
{ctx.volatilityRegime}
| Ticker |
Type |
Signal |
Mkt-Adjusted |
Fundamental |
{#each allAssets as r}
| {r.asset.ticker} |
{r.asset.type} |
|
{verdictShort(r.inflated.label)}
|
{verdictShort(r.fundamental.label)}
|
{/each}
{#each ['STOCK', 'ETF', 'BOND'] as type}
{#if results[type]?.length}
{@const count = results[type].length}
| Ticker |
Price |
Verdict |
Score |
{#if type === 'STOCK'}
Sector |
P/E | PEG | ROE% |
OpMgn% | FCF% | D/E |
Flags |
{:else if type === 'ETF'}
Expense | Yield | AUM | 5Y Ret |
{:else}
YTM | Duration | Rating |
{/if}
{#each sorted(results[type]) as r}
{@const mode = getTab(type)}
{@const m = r.asset.displayMetrics ?? {}}
{@const v = r[mode]}
| {r.asset.ticker} |
{m.Price ?? '—'} |
{verdictShort(v.label)}
|
{v.scoreSummary} |
{#if type === 'STOCK'}
{m.Sector ?? '—'} |
{m['P/E'] ?? '—'} |
{m['PEG'] ?? '—'} |
{m['ROE%'] ?? '—'} |
{m['OpMgn%'] ?? '—'} |
{m['FCF Yld%'] ?? '—'} |
{m['D/E'] ?? '—'} |
{#each v.audit?.riskFlags ?? [] as flag}
⚠ {flag}
{/each}
|
{:else if type === 'ETF'}
{m['Exp Ratio%'] ?? '—'} |
{m['Yield%'] ?? '—'} |
{m['AUM'] ?? '—'} |
{m['5Y Return%'] ?? '—'} |
{:else}
{m['YTM%'] ?? '—'} |
{m['Duration'] ?? '—'} |
{m['Rating'] ?? '—'} |
{/if}
{/each}
{/if}
{/each}
{#if results.ERROR?.length}
Failed {results.ERROR.length}
{#each results.ERROR as e}
{e.ticker} {e.message}
{/each}
{/if}
{/if}
{#if sidebar.open}
{/if}