Created
March 9, 2026 07:07
-
-
Save yongkangc/b4c95b0d8359f880c8df7f3773242420 to your computer and use it in GitHub Desktop.
LogReg Taker Sign-Flip Parameter Sweep - 3D Plotly visualization
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!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