Touched up notebooks + webapp

This commit is contained in:
2026-07-31 17:05:14 -04:00
commit 8e6c98945b
31 changed files with 10824 additions and 0 deletions
+206
View File
@@ -0,0 +1,206 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Adaptive Barrier Monitor</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap">
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg">
<script src="https://cdn.plot.ly/plotly-3.0.1.min.js"></script>
<link rel="stylesheet" href="/static/app.css?v=1" />
</head>
<body>
<header class="site-header">
<div>
<p class="eyebrow">Adaptive Barrier Monitor</p>
<h1>State-dependent sampling near price barriers</h1>
<p>Monte Carlo demo comparing adaptive sampling with equal-budget and fixed-cadence baselines.</p>
</div>
<div id="health" class="health">Loading…</div>
</header>
<main class="layout">
<!-- Left column, row 1: interactive controls. -->
<section class="controls" id="col-top">
<div class="card collapsible" id="card-simulation">
<h2>Simulation parameters</h2>
<label>Comparison mode
<select id="mc-comparison-mode">
<option value="equal_budget">Equal budget</option>
<option value="fixed_cadence">Fixed cadence</option>
</select>
<span class="field-help">Equal budget isolates sample placement. Fixed cadence compares detection and observation cost against an independently chosen interval.</span>
</label>
<label id="mc-fixed-cadence-row" hidden>Fixed cadence (minutes)
<input id="mc-fixed-cadence" type="number" min="0.1" max="39000" step="0.1" value="60" />
<span class="field-help">The fixed monitor samples at this interval, plus the start and end of the window. Smaller values use more observations.</span>
</label>
<label>Annual volatility (σ)
<div class="range-row">
<input id="mc-sigma" type="range" min="0.05" max="1.0" step="0.01" value="0.30" />
<input id="mc-sigma-val" type="number" min="0.05" max="1.0" step="0.01" value="0.30" />
</div>
<span class="field-help">Annualised volatility. Higher values produce wider price swings and more barrier events.</span>
</label>
<label>Annual drift (μ)
<input id="mc-mu" type="number" min="-0.5" max="0.5" step="0.01" value="0.07" />
<span class="field-help">Average annual return. Positive values tilt paths upward; negative values push them toward the lower barrier.</span>
</label>
<label>Window (minutes)
<input id="mc-window" type="number" min="5" max="39000" step="5" value="1950" />
<span class="field-help">1950 minutes is about five trading days. Longer windows tend to produce more events.</span>
</label>
<label>Number of paths
<input id="mc-paths" type="number" min="1" max="100" step="1" value="20" />
<span class="field-help">More paths give steadier aggregate results but take longer to render.</span>
</label>
<label>Steps per path
<input id="mc-steps" type="number" min="50" max="2000" step="10" value="500" />
<span class="field-help">The fine simulation grid used as the reference history. More steps resolve shorter-lived crossings.</span>
</label>
<label>Drop threshold (%)
<input id="mc-threshold" type="number" min="0.1" max="50" step="0.1" value="5" />
<span class="field-help">Percentage decline from the initial price that defines a lower-barrier event.</span>
</label>
<label>Rise threshold (%)
<input id="mc-rise-threshold" type="number" min="0.1" max="50" step="0.1" value="10" />
<span class="field-help">Percentage increase from the initial price that defines an upper-barrier event.</span>
</label>
<label>Miss budget (ε)
<div class="range-row">
<input id="mc-eps" type="range" min="1e-6" max="0.1" step="1e-6" value="0.001" />
<input id="mc-eps-val" type="number" min="1e-6" max="0.1" step="0.0001" value="0.001" />
</div>
<span class="field-help">Local diffusion-model design parameter. Lower ε produces denser adaptive sampling; it is not a global guarantee and does not cover jumps.</span>
</label>
<label>Max interval cap (minutes)
<input id="mc-dtcap" type="number" min="1" max="1440" step="1" placeholder="auto" />
<span class="field-help">Leave empty for an automatic cap of window/15. Lower values force denser sampling everywhere.</span>
</label>
<label>Detection deadline (grid steps)
<input id="mc-max-lag" type="number" min="0" max="100" step="1" value="3" />
<span class="field-help">An event counts as detected only if a sample still lies beyond the barrier within this many reference-grid steps.</span>
</label>
<label>RNG seed
<input id="mc-seed" type="number" min="0" max="100000" step="1" placeholder="random" />
<span class="field-help">Leave empty for a new run, or enter a seed to reproduce and share the same paths.</span>
</label>
<label>
<span class="checkbox-label">
<input id="mc-jumps" type="checkbox" /> Include jumps (Merton jump-diffusion)
</span>
<span class="field-help">Adds sudden moves that the diffusion-derived schedule cannot anticipate. Treat this as a model-risk stress test.</span>
</label>
<button id="mc-run-btn">Run simulation</button>
</div>
</section>
<!-- Right column: results and simulated paths. -->
<section class="viewer" id="col-viewer">
<div class="result-card">
<div class="result-header">
<h2 id="result-title">Monte Carlo Sandbox</h2>
<p id="result-subtitle">Running…</p>
</div>
<div class="headline">
<div class="tile">
<span class="tile-num" id="hl-adaptive"></span>
<span class="tile-lab">events detected — adaptive</span>
<span class="tile-sub" id="hl-adaptive-sub">↓ lower · ↑ upper</span>
</div>
<div class="tile">
<span class="tile-num" id="hl-fixed"></span>
<span class="tile-lab">events detected — fixed</span>
<span class="tile-sub" id="hl-fixed-sub">↓ lower · ↑ upper</span>
</div>
<div class="tile">
<span class="tile-num" id="hl-samples"></span>
<span class="tile-lab">total samples</span>
<span class="tile-sub" id="hl-samples-sub">matched path by path</span>
</div>
<div class="tile">
<span class="tile-num" id="hl-lag"></span>
<span class="tile-lab">mean detection lag</span>
<span class="tile-sub">adaptive vs fixed · detected events only</span>
</div>
</div>
<p class="result-note" id="comparison-note">
The adaptive and fixed monitors receive the <strong>same number of samples on every path</strong>.
The experiment therefore compares sample placement—not computational cost.
</p>
<div id="warning-box" class="warning-box" hidden></div>
<div id="chart-stage" class="chart-stage">
<div style="padding:3rem; text-align:center; color:var(--muted)">Running simulation…</div>
</div>
<details class="advanced-opts method-note" open>
<summary>How the Monte Carlo comparison works</summary>
<ol>
<li><strong>Simulate:</strong> generate independent GBM or Merton jump-diffusion price paths on a fine grid.</li>
<li><strong>Mark events:</strong> record each path's first lower- and upper-barrier crossing.</li>
<li id="allocation-method"><strong>Allocate samples:</strong> adaptive intervals shrink near the closest barrier; the fixed monitor receives the same sample count, spaced uniformly.</li>
<li><strong>Score:</strong> an event is detected when a sampled price remains beyond the barrier within the selected deadline.</li>
</ol>
<p>
<span id="method-conclusion">The headline compares detections and mean lag under an equal sample budget.</span>
The miss budget <strong>ε</strong> is a local diffusion-model design parameter, not a global guarantee.
</p>
</details>
<details class="json-block">
<summary>Raw result JSON</summary>
<pre id="stats-json">{}</pre>
</details>
</div>
</section>
<!-- Left column, row 2: supporting information, mirroring ClimbingBoardGPT. -->
<section class="controls" id="col-info">
<div class="card explain">
<h2>How to read it</h2>
<dl>
<dt>Open cyan circles</dt>
<dd>Adaptive observations. The interval shrinks quadratically as the log-price approaches the nearer barrier.</dd>
<dt>Grey dots</dt>
<dd id="fixed-explanation">An equal-budget fixed sampler with the same number of observations on each path, spaced uniformly.</dd>
<dt>Red × and green ▲</dt>
<dd>The first lower- and upper-barrier events on the fine reference grid.</dd>
<dt>Headline</dt>
<dd id="headline-explanation">Same paths and the same sample budget. Compare how many events each schedule confirms before the deadline.</dd>
</dl>
</div>
<div class="card note">
<h2>Research demo caveat</h2>
<p>The adaptive law is derived from a continuous diffusion model. Discrete grids, estimated volatility, latency, and jumps weaken any literal miss-probability guarantee.</p>
</div>
<div class="card explain">
<h2>How this works</h2>
<p>The app simulates price paths, marks first barrier crossings, and compares two observation schedules on exactly the same paths.</p>
<p>Adaptive intervals use a Brownian-bridge proxy and shrink with squared distance to the nearest barrier. Fixed observations are either equal-budget or independently spaced at a chosen cadence.</p>
</div>
<div class="card note">
<h2>Links</h2>
<ul class="link-list">
<li><a href="https://pawelsarkowicz.xyz" target="_blank" rel="noreferrer">pawelsarkowicz.xyz</a></li>
<li><a href="https://github.com/psark007/adaptive-barrier-monitor" target="_blank" rel="noreferrer">Adaptive Barrier Monitor repo</a></li>
<li><a href="https://github.com/psark007/adaptive-barrier-monitor/blob/main/LICENSE" target="_blank" rel="noreferrer">License</a></li>
</ul>
</div>
</section>
</main>
<footer class="site-footer">
<span>© Pawel Sarkowicz</span>
</footer>
<script src="/static/app.js?v=1"></script>
</body>
</html>