Spaces:
Running
Running
Download index.html from srinath-exe/stratify: direct link, hf CLI and curl.
- Browser
- Download file 17.5 kB
-
https://huggingface.co/spaces/srinath-exe/stratify/resolve/main/index.html
- Command line
-
hf download hf://spaces/srinath-exe/stratify/index.html
-
curl -L -o index.html https://huggingface.co/spaces/srinath-exe/stratify/resolve/main/index.html
17.5 kB
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| <title>Stratify — options backtests over MCP</title> | |
| <meta name="description" content="Backtest NIFTY and SENSEX options strategies from ChatGPT, Claude or any MCP client. The backtest runs on Stratify's server against 372 million real one-minute option bars."> | |
| <link rel="icon" href="assets/icon-64.png"> | |
| <style> | |
| @font-face{font-family:"Geist";font-weight:300 800;font-display:swap;src:url(assets/geist.woff2) format("woff2")} | |
| @font-face{font-family:"Geist Mono";font-weight:400 600;font-display:swap;src:url(assets/geist-mono.woff2) format("woff2")} | |
| @font-face{font-family:"Instrument Serif";font-weight:400;font-display:swap;src:url(assets/instrument-serif.woff2) format("woff2")} | |
| :root{--bg:#131313;--surface:#1A1A1A;--surface-2:#232323;--stroke:#2F2F2F;--fg:#FFFFFF;--fg-muted:#BABABA;--fg-subtle:#8E8E8E;--green:#8DDD8D;--good:#0AE448;--bad:#FF5470; | |
| --sans:"Geist",-apple-system,"Segoe UI",Roboto,sans-serif;--mono:"Geist Mono",ui-monospace,SFMono-Regular,Menlo,monospace;--serif:"Instrument Serif",Georgia,serif;--ease:cubic-bezier(.23,1,.32,1)} | |
| *{box-sizing:border-box} | |
| html{color-scheme:dark} | |
| body{margin:0;background:var(--bg);color:var(--fg);font:16px/1.6 var(--sans);-webkit-font-smoothing:antialiased} | |
| a{color:var(--green);text-underline-offset:3px} | |
| :focus-visible{outline:2px solid var(--green);outline-offset:3px;border-radius:6px} | |
| .wrap{max-width:1080px;margin:0 auto;padding:0 16px} | |
| header.top{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px 0} | |
| .brand{display:flex;align-items:center;gap:10px;color:var(--fg);text-decoration:none} | |
| .brand img{width:34px;height:34px;border-radius:8px} | |
| .brand span{font:400 1.7rem/1 var(--serif);letter-spacing:.005em} | |
| .tag{font:500 .72rem/1 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--green);border:1px solid var(--green);border-radius:999px;padding:6px 10px;white-space:nowrap} | |
| .hero{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:40px;align-items:center;padding:40px 0 64px} | |
| h1{font-size:clamp(2.1rem,4.6vw,3.4rem);line-height:1.05;letter-spacing:-.035em;font-weight:650;margin:0 0 18px;text-wrap:balance} | |
| h1 em{font-style:normal;color:var(--green)} | |
| .lede{color:var(--fg-muted);font-size:1.12rem;margin:0 0 26px;max-width:56ch} | |
| .lede strong{color:var(--fg);font-weight:560} | |
| .actions{display:flex;flex-wrap:wrap;gap:12px;align-items:center} | |
| .btn{display:inline-flex;align-items:center;gap:8px;border-radius:999px;padding:12px 20px;font-weight:600;font-size:.98rem;text-decoration:none;transition:transform .25s var(--ease),background .25s var(--ease)} | |
| .btn.primary{background:var(--green);color:#0E1A0E} | |
| .btn.ghost{border:1px solid var(--stroke);color:var(--fg)} | |
| .btn.ghost:hover{background:var(--surface)} | |
| .btn:active{transform:scale(.97)} | |
| .film{border:1px solid var(--stroke);border-radius:18px;overflow:hidden;background:#000} | |
| .film video{display:block;width:100%;height:auto} | |
| .film figcaption{font:.78rem/1.4 var(--mono);color:var(--fg-subtle);padding:10px 14px;background:var(--surface);border-top:1px solid var(--stroke)} | |
| section{padding:56px 0;border-top:1px solid var(--stroke)} | |
| .eyebrow{font:500 .74rem/1 var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--fg-subtle);margin:0 0 12px} | |
| h2{font-size:clamp(1.5rem,3vw,2.05rem);letter-spacing:-.025em;line-height:1.15;font-weight:620;margin:0 0 14px;text-wrap:balance} | |
| .sub{color:var(--fg-muted);max-width:64ch;margin:0 0 28px} | |
| .flow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px} | |
| .card{background:var(--surface);border:1px solid var(--stroke);border-radius:16px;padding:20px} | |
| .card h3{font-size:1.05rem;margin:0 0 6px;font-weight:600} | |
| .card p{margin:0;color:var(--fg-muted);font-size:.95rem} | |
| .step{font:500 .72rem/1 var(--mono);color:var(--green);letter-spacing:.1em;margin-bottom:12px;display:block} | |
| .copy{display:flex;align-items:stretch;background:var(--surface);border:1px solid var(--stroke);border-radius:10px;overflow:hidden} | |
| .copy pre{margin:0;flex:1;min-width:0;overflow-x:auto;padding:13px 14px;font:13.5px/1.55 var(--mono);color:var(--fg);white-space:pre} | |
| .copy button{flex:none;margin:7px;align-self:flex-start;border:1px solid var(--stroke);background:var(--surface-2);color:var(--fg);font:600 .82rem/1 var(--sans);border-radius:999px;padding:9px 14px;cursor:pointer;transition:background .2s var(--ease)} | |
| .copy button:hover{background:#2c2c2c} | |
| .copy button.done{color:var(--green);border-color:var(--green)} | |
| .tabs{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 14px} | |
| .tabs button{font:500 .88rem/1 var(--sans);color:var(--fg-muted);background:transparent;border:1px solid var(--stroke);border-radius:999px;padding:9px 14px;cursor:pointer;transition:color .2s var(--ease),border-color .2s var(--ease),background .2s var(--ease)} | |
| .tabs button[aria-selected="true"]{color:var(--bg);background:var(--fg);border-color:var(--fg)} | |
| .where{color:var(--fg-muted);font-size:.93rem;margin:0 0 10px} | |
| .panel[hidden]{display:none} | |
| .split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px} | |
| .stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:18px 0 0} | |
| .stat{background:var(--surface-2);border-radius:12px;padding:14px} | |
| .stat b{display:block;font:600 1.25rem/1.2 var(--mono);font-variant-numeric:tabular-nums} | |
| .stat span{font-size:.8rem;color:var(--fg-subtle)} | |
| .pos{color:var(--good)}.neg{color:var(--bad)} | |
| .verdict{margin-top:14px;font:500 .8rem/1.4 var(--mono);color:var(--bad);border:1px solid var(--bad);border-radius:999px;display:inline-block;padding:6px 12px} | |
| table{width:100%;border-collapse:collapse;font-size:.95rem} | |
| th,td{text-align:left;padding:12px 14px;border-bottom:1px solid var(--stroke)} | |
| th{font:500 .74rem/1 var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--fg-subtle)} | |
| td.num{font-family:var(--mono);font-variant-numeric:tabular-nums;white-space:nowrap} | |
| .tablewrap{overflow-x:auto;border:1px solid var(--stroke);border-radius:14px;background:var(--surface);padding:6px 10px} | |
| ul.plain{margin:0;padding:0;list-style:none;display:grid;gap:10px} | |
| ul.plain li{color:var(--fg-muted);padding-left:22px;position:relative} | |
| ul.plain li::before{content:"";position:absolute;left:4px;top:.62em;width:8px;height:1px;background:var(--fg-subtle)} | |
| footer{border-top:1px solid var(--stroke);padding:28px 0 48px;color:var(--fg-subtle);font-size:.85rem} | |
| footer p{margin:0 0 6px;max-width:80ch} | |
| @media (max-width:860px){.hero{grid-template-columns:1fr;padding-top:16px}.flow,.split{grid-template-columns:1fr}} | |
| @media (max-width:520px){.stats{grid-template-columns:1fr 1fr}.tag{display:none}} | |
| @media (prefers-reduced-motion:reduce){*{transition:none}} | |
| </style> | |
| </head> | |
| <body> | |
| <div class="wrap"> | |
| <header class="top"> | |
| <a class="brand" href="https://stratify.aeon-labs.site"><img src="assets/icon-256-dark.png" alt="" width="34" height="34"><span>Stratify</span></a> | |
| <span class="tag">Remote MCP server</span> | |
| </header> | |
| <main> | |
| <div class="hero"> | |
| <div> | |
| <h1>Backtest NIFTY & SENSEX options by <em>asking your AI</em>.</h1> | |
| <p class="lede">Describe a strategy in plain English to ChatGPT, Claude or any MCP client. The backtest | |
| runs <strong>on Stratify's server, against 372 million real one-minute option bars</strong>, with every | |
| charge a broker would take. Your AI gets the results; option prices never leave the server.</p> | |
| <div class="actions"> | |
| <a class="btn primary" href="https://stratify.aeon-labs.site">Get started free</a> | |
| <a class="btn ghost" href="https://github.com/Srinath-exe/stratify-mcp">Source on GitHub</a> | |
| </div> | |
| </div> | |
| <figure class="film" style="margin:0"> | |
| <video src="assets/tour.mp4" poster="assets/poster.jpg" controls muted playsinline preload="none"></video> | |
| <figcaption>66 s · ChatGPT and Claude Code, real runs, captions on</figcaption> | |
| </figure> | |
| </div> | |
| <section aria-labelledby="url"> | |
| <p class="eyebrow">The server</p> | |
| <h2 id="url">One URL. Add it to the AI you already use.</h2> | |
| <p class="sub">ChatGPT and Claude sign you in with Google when you add it, so they need no key. | |
| Terminal clients use a free key from the site.</p> | |
| <div class="copy"><pre>https://stratify-mcp.aeon-labs.site/mcp</pre><button type="button" data-copy>Copy</button></div> | |
| </section> | |
| <section aria-labelledby="connect"> | |
| <p class="eyebrow">Connect</p> | |
| <h2 id="connect">Pick your client</h2> | |
| <p class="sub">For the key-based clients, sign in at <a href="https://stratify.aeon-labs.site">stratify.aeon-labs.site</a>, | |
| make a key, and put it where <code>sk_live_...</code> is.</p> | |
| <div class="tabs" role="tablist" aria-label="Clients"> | |
| <button role="tab" aria-selected="true" aria-controls="p-chatgpt" id="t-chatgpt">ChatGPT</button> | |
| <button role="tab" aria-selected="false" aria-controls="p-claude" id="t-claude">Claude</button> | |
| <button role="tab" aria-selected="false" aria-controls="p-code" id="t-code">Claude Code</button> | |
| <button role="tab" aria-selected="false" aria-controls="p-cursor" id="t-cursor">Cursor</button> | |
| <button role="tab" aria-selected="false" aria-controls="p-vscode" id="t-vscode">VS Code</button> | |
| <button role="tab" aria-selected="false" aria-controls="p-codex" id="t-codex">Codex</button> | |
| <button role="tab" aria-selected="false" aria-controls="p-gemini" id="t-gemini">Gemini CLI</button> | |
| <button role="tab" aria-selected="false" aria-controls="p-stdio" id="t-stdio">stdio / Python</button> | |
| </div> | |
| <div class="panel" role="tabpanel" id="p-chatgpt" aria-labelledby="t-chatgpt"> | |
| <p class="where">Stratify is a published app in ChatGPT: search for it. Or Settings → Plugins → <em>Create</em> (Developer mode on) and paste the URL.</p> | |
| <div class="copy"><pre>https://stratify-mcp.aeon-labs.site/mcp</pre><button type="button" data-copy>Copy</button></div> | |
| </div> | |
| <div class="panel" role="tabpanel" id="p-claude" aria-labelledby="t-claude" hidden> | |
| <p class="where">claude.ai or Claude Desktop: Settings → Connectors → <em>Add custom connector</em>, paste the URL.</p> | |
| <div class="copy"><pre>https://stratify-mcp.aeon-labs.site/mcp</pre><button type="button" data-copy>Copy</button></div> | |
| </div> | |
| <div class="panel" role="tabpanel" id="p-code" aria-labelledby="t-code" hidden> | |
| <p class="where">Run once in a terminal.</p> | |
| <div class="copy"><pre>claude mcp add --transport http stratify https://stratify-mcp.aeon-labs.site/mcp \ | |
| --header "Authorization: Bearer sk_live_..."</pre><button type="button" data-copy>Copy</button></div> | |
| </div> | |
| <div class="panel" role="tabpanel" id="p-cursor" aria-labelledby="t-cursor" hidden> | |
| <p class="where">Add to <code>~/.cursor/mcp.json</code>. If it already has an <code>mcpServers</code> block, add the entry inside it.</p> | |
| <div class="copy"><pre>{ | |
| "mcpServers": { | |
| "stratify": { | |
| "url": "https://stratify-mcp.aeon-labs.site/mcp", | |
| "headers": { "Authorization": "Bearer sk_live_..." } | |
| } | |
| } | |
| }</pre><button type="button" data-copy>Copy</button></div> | |
| </div> | |
| <div class="panel" role="tabpanel" id="p-vscode" aria-labelledby="t-vscode" hidden> | |
| <p class="where">Run once in a terminal.</p> | |
| <div class="copy"><pre>code --add-mcp '{"name":"stratify","type":"http","url":"https://stratify-mcp.aeon-labs.site/mcp","headers":{"Authorization":"Bearer sk_live_..."}}'</pre><button type="button" data-copy>Copy</button></div> | |
| </div> | |
| <div class="panel" role="tabpanel" id="p-codex" aria-labelledby="t-codex" hidden> | |
| <p class="where">Add to <code>~/.codex/config.toml</code>.</p> | |
| <div class="copy"><pre>[mcp_servers.stratify] | |
| url = "https://stratify-mcp.aeon-labs.site/mcp" | |
| http_headers = { Authorization = "Bearer sk_live_..." }</pre><button type="button" data-copy>Copy</button></div> | |
| </div> | |
| <div class="panel" role="tabpanel" id="p-gemini" aria-labelledby="t-gemini" hidden> | |
| <p class="where">Run once in a terminal.</p> | |
| <div class="copy"><pre>gemini mcp add -s user -t http stratify https://stratify-mcp.aeon-labs.site/mcp \ | |
| -H "Authorization: Bearer sk_live_..."</pre><button type="button" data-copy>Copy</button></div> | |
| </div> | |
| <div class="panel" role="tabpanel" id="p-stdio" aria-labelledby="t-stdio" hidden> | |
| <p class="where">For a client that only speaks stdio, or from a notebook.</p> | |
| <div class="copy"><pre>STRATIFY_API_KEY=sk_live_... npx stratify-mcp | |
| pip install stratify-mcp # Python client, results as pandas DataFrames</pre><button type="button" data-copy>Copy</button></div> | |
| </div> | |
| </section> | |
| <section aria-labelledby="how"> | |
| <p class="eyebrow">Where the backtest runs</p> | |
| <h2 id="how">Not inside the AI. On our server, on real data.</h2> | |
| <p class="sub">A chatbot asked how a strategy did will give you a confident, invented answer. With Stratify | |
| connected, the AI only writes the strategy down; the numbers come from replaying it against what the market did.</p> | |
| <div class="flow"> | |
| <div class="card"><span class="step">1 · YOUR AI</span><h3>Turns your words into a spec</h3> | |
| <p>Strikes, entry and exit times, stops, rolls. You can see exactly what it sent.</p></div> | |
| <div class="card"><span class="step">2 · OUR SERVER</span><h3>Replays it minute by minute</h3> | |
| <p>289 M NIFTY and 83 M SENSEX one-minute option bars. Brokerage, STT, exchange fees, SEBI, GST, stamp duty, measured slippage, SPAN-style margin.</p></div> | |
| <div class="card"><span class="step">3 · RESULTS ONLY</span><h3>Comes back with a verdict</h3> | |
| <p>Trades, P&L after charges, drawdown, walk-forward folds, an out-of-sample test and a report link.</p></div> | |
| </div> | |
| </section> | |
| <section aria-labelledby="example"> | |
| <p class="eyebrow">A real run</p> | |
| <div class="split"> | |
| <div> | |
| <h2 id="example">It tells you when a result doesn't hold up.</h2> | |
| <p class="sub" style="margin-bottom:0">“Sell a NIFTY strangle every day for a year, 0.5% from spot, in at 09:20, out at 15:15.” | |
| Charges were 40% of the gross profit, and the strategy failed its out-of-sample test. A backtester that only | |
| brings good news is a slot machine.</p> | |
| </div> | |
| <div class="card"> | |
| <p class="eyebrow" style="margin:0;text-transform:none;letter-spacing:.02em">NIFTY · 1 Jul 2025 – 30 Jun 2026 · one lot</p> | |
| <div class="stats"> | |
| <div class="stat"><b class="pos">+₹40,940</b><span>net, after charges</span></div> | |
| <div class="stat"><b>₹27,328</b><span>charges</span></div> | |
| <div class="stat"><b>149 / 234</b><span>days won</span></div> | |
| <div class="stat"><b class="neg">−₹14,941</b><span>worst day</span></div> | |
| </div> | |
| <span class="verdict">Out-of-sample: failed</span> | |
| </div> | |
| </div> | |
| </section> | |
| <section aria-labelledby="cov"> | |
| <p class="eyebrow">Coverage</p> | |
| <h2 id="cov">What you can test</h2> | |
| <div class="tablewrap"><table> | |
| <thead><tr><th scope="col">Index</th><th scope="col">Free</th><th scope="col">Paid (waitlist)</th></tr></thead> | |
| <tbody> | |
| <tr><td>NIFTY</td><td class="num">1 Jul 2025 – 30 Jun 2026</td><td class="num">1 Jan 2019 – 30 Jun 2026</td></tr> | |
| <tr><td>SENSEX</td><td class="num">1 Jul 2025 – 30 Jun 2026</td><td class="num">7 Aug 2023 – 30 Jun 2026</td></tr> | |
| </tbody> | |
| </table></div> | |
| <p class="sub" style="margin:14px 0 0">Free: 100 backtests an hour. SENSEX options start in August 2023, so no tier claims earlier history. | |
| Strangles, iron condors, iron flies, credit spreads, long options, or your own legs and rules (NIFTY).</p> | |
| </section> | |
| <section aria-labelledby="wont"> | |
| <p class="eyebrow">Honest limits</p> | |
| <h2 id="wont">What it won't do</h2> | |
| <ul class="plain"> | |
| <li>Tell you what to trade, size a position, or pick a day to act. It answers what happened, not what to do.</li> | |
| <li>Place orders. It only simulates history: one lot, after charges.</li> | |
| <li>Hand over option prices. They stay on the server; your AI gets results.</li> | |
| </ul> | |
| </section> | |
| </main> | |
| <footer> | |
| <p>A historical simulation for research and education. Not investment advice.</p> | |
| <p>ChatGPT, Claude, Codex, Cursor, VS Code and Gemini are trademarks of their owners; Stratify is independent. | |
| · <a href="https://stratify.aeon-labs.site">stratify.aeon-labs.site</a> · <a href="https://github.com/Srinath-exe/stratify-mcp">MIT source</a></p> | |
| </footer> | |
| </div> | |
| <script> | |
| document.querySelectorAll("[data-copy]").forEach(function(b){ | |
| b.addEventListener("click",function(){ | |
| var t=b.parentNode.querySelector("pre").innerText; | |
| var done=function(){b.textContent="Copied";b.classList.add("done");setTimeout(function(){b.textContent="Copy";b.classList.remove("done")},1600)}; | |
| if(navigator.clipboard){navigator.clipboard.writeText(t).then(done,function(){b.textContent="Select it"})}else{b.textContent="Select it"} | |
| }); | |
| }); | |
| var tabs=[].slice.call(document.querySelectorAll('[role="tab"]')); | |
| function pick(t){tabs.forEach(function(x){var on=x===t;x.setAttribute("aria-selected",on);x.tabIndex=on?0:-1;document.getElementById(x.getAttribute("aria-controls")).hidden=!on});} | |
| tabs.forEach(function(t,i){ | |
| t.tabIndex=i?-1:0; | |
| t.addEventListener("click",function(){pick(t)}); | |
| t.addEventListener("keydown",function(e){var d=e.key==="ArrowRight"?1:e.key==="ArrowLeft"?-1:0;if(d){var n=tabs[(i+d+tabs.length)%tabs.length];pick(n);n.focus();e.preventDefault()}}); | |
| }); | |
| </script> | |
| </body> | |
| </html> | |