Skip to content

Instantly share code, notes, and snippets.

@yongkangc
Created March 9, 2026 07:07
Show Gist options
  • Select an option

  • Save yongkangc/b4c95b0d8359f880c8df7f3773242420 to your computer and use it in GitHub Desktop.

Select an option

Save yongkangc/b4c95b0d8359f880c8df7f3773242420 to your computer and use it in GitHub Desktop.
LogReg Taker Sign-Flip Parameter Sweep - 3D Plotly visualization
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>LogReg Taker: Sign-Flip Parameter Sweep</title>
<script src="https://cdn.plot.ly/plotly-2.27.0.min.js"></script>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: #0d1117; color: #c9d1d9; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
min-height: 100vh; display: flex; flex-direction: column; align-items: center; padding: 20px;
}
h1 { font-size: 1.5em; margin: 10px 0 5px; color: #58a6ff; }
.subtitle { color: #8b949e; font-size: 0.9em; margin-bottom: 15px; }
.chart-container { width: 100%; max-width: 1000px; height: 600px; }
.stats {
display: flex; gap: 20px; margin: 15px 0; flex-wrap: wrap; justify-content: center;
}
.stat-card {
background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 12px 20px; text-align: center;
}
.stat-card .label { color: #8b949e; font-size: 0.8em; text-transform: uppercase; }
.stat-card .value { font-size: 1.4em; font-weight: bold; margin-top: 4px; }
.stat-card .value.green { color: #3fb950; }
.stat-card .value.red { color: #f85149; }
.stat-card .value.blue { color: #58a6ff; }
.heatmap-container { width: 100%; max-width: 1000px; height: 450px; margin-top: 10px; }
.insight {
background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 15px 20px;
max-width: 1000px; width: 100%; margin-top: 15px; font-size: 0.9em; line-height: 1.6;
}
.insight h3 { color: #58a6ff; margin-bottom: 8px; }
.insight li { margin: 4px 0; }
.footer { color: #484f58; font-size: 0.75em; margin-top: 20px; }
</style>
</head>
<body>
<h1>🎯 LogReg Taker: Sign-Flip Exit Parameter Sweep</h1>
<div class="subtitle">BTC 15-min markets · Feb 26–28 2026 · 385 markets · 288 traded</div>
<div class="stats">
<div class="stat-card">
<div class="label">Best Combo</div>
<div class="value green">p1 / d0.07</div>
</div>
<div class="stat-card">
<div class="label">Best PnL</div>
<div class="value green">$718</div>
</div>
<div class="stat-card">
<div class="label">Best Avg/Mkt</div>
<div class="value green">$2.49</div>
</div>
<div class="stat-card">
<div class="label">Worst PnL</div>
<div class="value red">$-771</div>
</div>
<div class="stat-card">
<div class="label">Combos Tested</div>
<div class="value blue">80</div>
</div>
<div class="stat-card">
<div class="label">Profitable</div>
<div class="value blue">48/80</div>
</div>
</div>
<div class="chart-container" id="surface3d"></div>
<div class="heatmap-container" id="heatmap"></div>
<div class="insight">
<h3>📊 Key Insights</h3>
<ul>
<li><strong>Low persistence wins:</strong> p=1 (exit on first sign-flip) dominates — fast exits preserve alpha</li>
<li><strong>Divergence sweet spot:</strong> 0.05–0.15 consistently outperforms extremes; too tight (0.01) = noise exits, too wide (0.20) = late exits that bleed</li>
<li><strong>High persistence destroys value:</strong> p≥15 mostly negative — holding through adverse signals erases the logreg edge</li>
<li><strong>p=9999 (never flip) = ~-$475:</strong> confirms sign-flip exit is critical, not optional</li>
<li><strong>48 of 80 configs profitable</strong> — strategy is robust across most reasonable params</li>
</ul>
</div>
<div class="footer">Generated 2026-03-09 05:53 UTC · pm-alpha/pm-mm-rs logreg taker backtest</div>
<script>
const persistVals = ["1", "2", "3", "5", "7", "10", "15", "20", "50", "9999"];
const divVals = ["0.01", "0.02", "0.03", "0.05", "0.07", "0.1", "0.15", "0.2"];
const z = [[269.2, 332.0, 399.1, 686.0, 718.4, 667.5, 673.1, 378.8], [154.7, 266.0, 443.6, 490.4, 507.4, 480.9, 469.2, -44.8], [247.6, 280.4, 309.0, 401.0, 477.4, 390.9, 292.6, -15.6], [127.5, 168.0, 244.7, 333.2, 408.2, 302.4, 247.0, -243.1], [17.4, -8.9, 30.2, 225.9, 343.4, 100.9, 174.9, -219.4], [70.7, -4.4, 65.8, 244.3, 366.5, 133.8, 8.4, -540.1], [-8.1, -111.1, -10.0, 141.9, 128.1, -31.2, -207.1, -523.6], [-44.3, 7.0, -31.4, -5.5, 33.5, -63.6, -240.8, -771.2], [-135.2, -26.9, 51.2, -104.5, 98.7, 69.5, -260.4, -580.1], [-474.9, -474.9, -470.8, -476.4, -469.0, -470.2, -474.6, -478.2]];
const hoverText = [["persist=1, div=0.01<br>PnL=$269.2<br>avg=$0.93/mkt<br>traded=288/385", "persist=1, div=0.02<br>PnL=$332.0<br>avg=$1.15/mkt<br>traded=288/385", "persist=1, div=0.03<br>PnL=$399.1<br>avg=$1.39/mkt<br>traded=288/385", "persist=1, div=0.05<br>PnL=$686.0<br>avg=$2.38/mkt<br>traded=288/385", "persist=1, div=0.07<br>PnL=$718.4<br>avg=$2.49/mkt<br>traded=288/385", "persist=1, div=0.1<br>PnL=$667.5<br>avg=$2.32/mkt<br>traded=288/385", "persist=1, div=0.15<br>PnL=$673.1<br>avg=$2.34/mkt<br>traded=288/385", "persist=1, div=0.2<br>PnL=$378.8<br>avg=$1.32/mkt<br>traded=288/385"], ["persist=2, div=0.01<br>PnL=$154.7<br>avg=$0.54/mkt<br>traded=288/385", "persist=2, div=0.02<br>PnL=$266.0<br>avg=$0.92/mkt<br>traded=288/385", "persist=2, div=0.03<br>PnL=$443.6<br>avg=$1.54/mkt<br>traded=288/385", "persist=2, div=0.05<br>PnL=$490.4<br>avg=$1.70/mkt<br>traded=288/385", "persist=2, div=0.07<br>PnL=$507.4<br>avg=$1.76/mkt<br>traded=288/385", "persist=2, div=0.1<br>PnL=$480.9<br>avg=$1.67/mkt<br>traded=288/385", "persist=2, div=0.15<br>PnL=$469.2<br>avg=$1.63/mkt<br>traded=288/385", "persist=2, div=0.2<br>PnL=$-44.8<br>avg=$-0.16/mkt<br>traded=288/385"], ["persist=3, div=0.01<br>PnL=$247.6<br>avg=$0.86/mkt<br>traded=288/385", "persist=3, div=0.02<br>PnL=$280.4<br>avg=$0.97/mkt<br>traded=288/385", "persist=3, div=0.03<br>PnL=$309.0<br>avg=$1.07/mkt<br>traded=288/385", "persist=3, div=0.05<br>PnL=$401.0<br>avg=$1.39/mkt<br>traded=288/385", "persist=3, div=0.07<br>PnL=$477.4<br>avg=$1.66/mkt<br>traded=288/385", "persist=3, div=0.1<br>PnL=$390.9<br>avg=$1.36/mkt<br>traded=288/385", "persist=3, div=0.15<br>PnL=$292.6<br>avg=$1.02/mkt<br>traded=288/385", "persist=3, div=0.2<br>PnL=$-15.6<br>avg=$-0.05/mkt<br>traded=288/385"], ["persist=5, div=0.01<br>PnL=$127.5<br>avg=$0.44/mkt<br>traded=288/385", "persist=5, div=0.02<br>PnL=$168.0<br>avg=$0.58/mkt<br>traded=288/385", "persist=5, div=0.03<br>PnL=$244.7<br>avg=$0.85/mkt<br>traded=288/385", "persist=5, div=0.05<br>PnL=$333.2<br>avg=$1.16/mkt<br>traded=288/385", "persist=5, div=0.07<br>PnL=$408.2<br>avg=$1.42/mkt<br>traded=288/385", "persist=5, div=0.1<br>PnL=$302.4<br>avg=$1.05/mkt<br>traded=288/385", "persist=5, div=0.15<br>PnL=$247.0<br>avg=$0.86/mkt<br>traded=288/385", "persist=5, div=0.2<br>PnL=$-243.1<br>avg=$-0.84/mkt<br>traded=288/385"], ["persist=7, div=0.01<br>PnL=$17.4<br>avg=$0.06/mkt<br>traded=288/385", "persist=7, div=0.02<br>PnL=$-8.9<br>avg=$-0.03/mkt<br>traded=288/385", "persist=7, div=0.03<br>PnL=$30.2<br>avg=$0.10/mkt<br>traded=288/385", "persist=7, div=0.05<br>PnL=$225.9<br>avg=$0.78/mkt<br>traded=288/385", "persist=7, div=0.07<br>PnL=$343.4<br>avg=$1.19/mkt<br>traded=288/385", "persist=7, div=0.1<br>PnL=$100.9<br>avg=$0.35/mkt<br>traded=288/385", "persist=7, div=0.15<br>PnL=$174.9<br>avg=$0.61/mkt<br>traded=288/385", "persist=7, div=0.2<br>PnL=$-219.4<br>avg=$-0.76/mkt<br>traded=288/385"], ["persist=10, div=0.01<br>PnL=$70.7<br>avg=$0.25/mkt<br>traded=288/385", "persist=10, div=0.02<br>PnL=$-4.4<br>avg=$-0.02/mkt<br>traded=288/385", "persist=10, div=0.03<br>PnL=$65.8<br>avg=$0.23/mkt<br>traded=288/385", "persist=10, div=0.05<br>PnL=$244.3<br>avg=$0.85/mkt<br>traded=288/385", "persist=10, div=0.07<br>PnL=$366.5<br>avg=$1.27/mkt<br>traded=288/385", "persist=10, div=0.1<br>PnL=$133.8<br>avg=$0.46/mkt<br>traded=288/385", "persist=10, div=0.15<br>PnL=$8.4<br>avg=$0.03/mkt<br>traded=288/385", "persist=10, div=0.2<br>PnL=$-540.1<br>avg=$-1.88/mkt<br>traded=288/385"], ["persist=15, div=0.01<br>PnL=$-8.1<br>avg=$-0.03/mkt<br>traded=288/385", "persist=15, div=0.02<br>PnL=$-111.1<br>avg=$-0.39/mkt<br>traded=288/385", "persist=15, div=0.03<br>PnL=$-10.0<br>avg=$-0.03/mkt<br>traded=288/385", "persist=15, div=0.05<br>PnL=$141.9<br>avg=$0.49/mkt<br>traded=288/385", "persist=15, div=0.07<br>PnL=$128.1<br>avg=$0.44/mkt<br>traded=288/385", "persist=15, div=0.1<br>PnL=$-31.2<br>avg=$-0.11/mkt<br>traded=288/385", "persist=15, div=0.15<br>PnL=$-207.1<br>avg=$-0.72/mkt<br>traded=288/385", "persist=15, div=0.2<br>PnL=$-523.6<br>avg=$-1.82/mkt<br>traded=288/385"], ["persist=20, div=0.01<br>PnL=$-44.3<br>avg=$-0.15/mkt<br>traded=288/385", "persist=20, div=0.02<br>PnL=$7.0<br>avg=$0.02/mkt<br>traded=288/385", "persist=20, div=0.03<br>PnL=$-31.4<br>avg=$-0.11/mkt<br>traded=288/385", "persist=20, div=0.05<br>PnL=$-5.5<br>avg=$-0.02/mkt<br>traded=288/385", "persist=20, div=0.07<br>PnL=$33.5<br>avg=$0.12/mkt<br>traded=288/385", "persist=20, div=0.1<br>PnL=$-63.6<br>avg=$-0.22/mkt<br>traded=288/385", "persist=20, div=0.15<br>PnL=$-240.8<br>avg=$-0.84/mkt<br>traded=288/385", "persist=20, div=0.2<br>PnL=$-771.2<br>avg=$-2.68/mkt<br>traded=288/385"], ["persist=50, div=0.01<br>PnL=$-135.2<br>avg=$-0.47/mkt<br>traded=288/385", "persist=50, div=0.02<br>PnL=$-26.9<br>avg=$-0.09/mkt<br>traded=288/385", "persist=50, div=0.03<br>PnL=$51.2<br>avg=$0.18/mkt<br>traded=288/385", "persist=50, div=0.05<br>PnL=$-104.5<br>avg=$-0.36/mkt<br>traded=288/385", "persist=50, div=0.07<br>PnL=$98.7<br>avg=$0.34/mkt<br>traded=288/385", "persist=50, div=0.1<br>PnL=$69.5<br>avg=$0.24/mkt<br>traded=288/385", "persist=50, div=0.15<br>PnL=$-260.4<br>avg=$-0.90/mkt<br>traded=288/385", "persist=50, div=0.2<br>PnL=$-580.1<br>avg=$-2.01/mkt<br>traded=288/385"], ["persist=9999, div=0.01<br>PnL=$-474.9<br>avg=$-1.65/mkt<br>traded=288/385", "persist=9999, div=0.02<br>PnL=$-474.9<br>avg=$-1.65/mkt<br>traded=288/385", "persist=9999, div=0.03<br>PnL=$-470.8<br>avg=$-1.63/mkt<br>traded=288/385", "persist=9999, div=0.05<br>PnL=$-476.4<br>avg=$-1.65/mkt<br>traded=288/385", "persist=9999, div=0.07<br>PnL=$-469.0<br>avg=$-1.63/mkt<br>traded=288/385", "persist=9999, div=0.1<br>PnL=$-470.2<br>avg=$-1.63/mkt<br>traded=288/385", "persist=9999, div=0.15<br>PnL=$-474.6<br>avg=$-1.65/mkt<br>traded=288/385", "persist=9999, div=0.2<br>PnL=$-478.2<br>avg=$-1.66/mkt<br>traded=288/385"]];
// 3D Surface
Plotly.newPlot('surface3d', [{
type: 'surface',
x: divVals,
y: persistVals,
z: z,
text: hoverText,
hoverinfo: 'text',
colorscale: [
[0, '#f85149'],
[0.35, '#f0883e'],
[0.5, '#d2a84f'],
[0.65, '#7ee787'],
[1, '#3fb950']
],
colorbar: { title: 'PnL ($)', titleside: 'right', tickprefix: '$' },
contours: {
z: { show: true, usecolormap: true, highlightcolor: '#58a6ff', project: { z: true } }
}
}], {
scene: {
xaxis: { title: 'Min Divergence', color: '#8b949e', gridcolor: '#21262d' },
yaxis: { title: 'Persistence', color: '#8b949e', gridcolor: '#21262d', type: 'category' },
zaxis: { title: 'Total PnL ($)', color: '#8b949e', gridcolor: '#21262d', tickprefix: '$' },
bgcolor: '#0d1117',
camera: { eye: { x: 1.8, y: -1.5, z: 0.8 } }
},
paper_bgcolor: '#0d1117',
margin: { l: 0, r: 0, t: 30, b: 0 },
}, { responsive: true });
// Heatmap
Plotly.newPlot('heatmap', [{
type: 'heatmap',
x: divVals,
y: persistVals,
z: z,
text: hoverText,
hoverinfo: 'text',
colorscale: [
[0, '#f85149'],
[0.35, '#f0883e'],
[0.5, '#d2a84f'],
[0.65, '#7ee787'],
[1, '#3fb950']
],
colorbar: { title: 'PnL ($)', tickprefix: '$' },
zmin: -771,
zmax: 718,
}], {
xaxis: { title: 'Min Divergence', color: '#8b949e', gridcolor: '#21262d' },
yaxis: { title: 'Persistence', color: '#8b949e', gridcolor: '#21262d', type: 'category' },
paper_bgcolor: '#0d1117',
plot_bgcolor: '#0d1117',
font: { color: '#c9d1d9' },
margin: { l: 60, r: 20, t: 30, b: 50 },
annotations: [
{
x: '0.07',
y: '1',
text: '⭐ Best',
showarrow: true,
arrowcolor: '#3fb950',
font: { color: '#3fb950', size: 12 },
ax: 30, ay: -30
}
]
}, { responsive: true });
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment