Promote production portfolio strategy
This commit is contained in:
@@ -76,10 +76,16 @@ export default function DashboardPage() {
|
||||
[trades.data, activation.data],
|
||||
);
|
||||
|
||||
// Rank only actionable/qualified setups by residual 12-1 momentum percentile.
|
||||
// Rank only actionable/qualified setups by the production strategy score.
|
||||
// Residual momentum still gates qualification; strategy_rank is the promoted
|
||||
// 80/20 residual-momentum/high-vol ordering score when available.
|
||||
const topSetups: TradeSetup[] = useMemo(() => {
|
||||
return [...qualifiedSetups]
|
||||
.sort((a, b) => (b.momentum_percentile ?? -Infinity) - (a.momentum_percentile ?? -Infinity))
|
||||
.sort(
|
||||
(a, b) =>
|
||||
(b.strategy_rank ?? b.momentum_percentile ?? -Infinity) -
|
||||
(a.strategy_rank ?? a.momentum_percentile ?? -Infinity),
|
||||
)
|
||||
.slice(0, 5);
|
||||
}, [qualifiedSetups]);
|
||||
|
||||
@@ -194,7 +200,7 @@ export default function DashboardPage() {
|
||||
<div className="xl:col-span-3">
|
||||
<Section
|
||||
title="Top Setups"
|
||||
hint="qualified and ranked by residual momentum"
|
||||
hint="qualified by residual momentum, ranked by production score"
|
||||
>
|
||||
{trades.isLoading && <SkeletonTable rows={5} cols={5} />}
|
||||
{trades.isError && <Callout variant="error">Failed to load setups</Callout>}
|
||||
@@ -211,7 +217,8 @@ export default function DashboardPage() {
|
||||
<th className="px-4 py-3 text-right">Entry</th>
|
||||
<th className="px-4 py-3 text-right">R:R</th>
|
||||
<th className="px-4 py-3 text-right">Target Prob</th>
|
||||
<th className="px-4 py-3 text-right">Residual Mom.</th>
|
||||
<th className="px-4 py-3 text-right">Prod. Rank</th>
|
||||
<th className="px-4 py-3 text-right">Residual</th>
|
||||
<th className="hidden px-4 py-3 md:table-cell">Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -252,6 +259,9 @@ export default function DashboardPage() {
|
||||
})()}
|
||||
</td>
|
||||
<td className="num px-4 py-3 text-right font-semibold text-gray-200">
|
||||
{setup.strategy_rank != null ? `${Math.round(setup.strategy_rank)}%ile` : '—'}
|
||||
</td>
|
||||
<td className="num px-4 py-3 text-right text-gray-400">
|
||||
{setup.momentum_percentile != null ? `${Math.round(setup.momentum_percentile)}%ile` : '—'}
|
||||
</td>
|
||||
<td className="hidden px-4 py-3 text-xs text-gray-400 md:table-cell">
|
||||
@@ -264,7 +274,7 @@ export default function DashboardPage() {
|
||||
</table>
|
||||
<div className="flex items-center justify-between border-t border-white/[0.04] px-4 py-2.5">
|
||||
<span className="text-[11px] text-gray-500">
|
||||
Momentum = ticker's 12-1 month rank across the universe (higher = stronger)
|
||||
Production rank = 80% residual momentum + 20% realized volatility; residual still gates qualification.
|
||||
</span>
|
||||
<Link to="/signals" className="text-xs font-medium text-blue-300 hover:text-blue-200 transition-colors">
|
||||
All setups →
|
||||
|
||||
Reference in New Issue
Block a user