<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Tastytrade on FinFr.ee: Financial Freedom for Globally Mobile Investors</title>
    <link>http://localhost:58538/tags/tastytrade/</link>
    <description>Tools, math, and lived experience for expats building wealth across borders. Passive portfolios and active income from a Dubai-based trader.</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <copyright>Copyright © 2026 | All rights reserved</copyright>
    <lastBuildDate>Mon, 23 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://localhost:58538/tags/tastytrade/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>ThetaVault 2.0: A Professional Options Trading Journal Built in Rust</title>
      <link>http://localhost:58538/passive_active_investments/options_trading/theta-vault-options-trading-journal/</link>
      <pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>http://localhost:58538/passive_active_investments/options_trading/theta-vault-options-trading-journal/</guid>
      <description>A deep dive into ThetaVault 2.0 — an open-source, terminal-based options trading journal built in Rust with tastytrade mechanics, Black-Scholes Greeks, and 50+ KPIs.</description>
      <content:encoded><![CDATA[<div class="lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl">
  The options traders who consistently make money aren't necessarily the smartest — they're the most disciplined. And discipline without data is just hope.
</div>

<p>That's the philosophy behind ThetaVault 2.0. It's a professional-grade options trading journal I built from scratch in Rust, purpose-built for traders who follow the tastytrade methodology: sell premium, manage at 21 DTE, take 50% profits, keep undefined-risk under control.</p>
<p>Most traders track their trades in a broker dashboard or a spreadsheet. That's fine when you have 5 positions. When you're running 15–25 concurrent options positions across 8 tickers, managing rolls, tracking Greeks portfolio-wide, and trying to understand whether your entry criteria are actually working — you need something better.</p>
<div class="admonition relative overflow-hidden rounded-lg border-l-4 my-3 px-4 py-3 shadow-sm" data-type="tip">
      <div class="flex items-center gap-2 font-semibold text-inherit">
        <div class="flex shrink-0 h-5 w-5 items-center justify-center text-lg"><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path fill="currentColor" d="M112.1 454.3c0 6.297 1.816 12.44 5.284 17.69l17.14 25.69c5.25 7.875 17.17 14.28 26.64 14.28h61.67c9.438 0 21.36-6.401 26.61-14.28l17.08-25.68c2.938-4.438 5.348-12.37 5.348-17.7L272 415.1h-160L112.1 454.3zM191.4 .0132C89.44 .3257 16 82.97 16 175.1c0 44.38 16.44 84.84 43.56 115.8c16.53 18.84 42.34 58.23 52.22 91.45c.0313 .25 .0938 .5166 .125 .7823h160.2c.0313-.2656 .0938-.5166 .125-.7823c9.875-33.22 35.69-72.61 52.22-91.45C351.6 260.8 368 220.4 368 175.1C368 78.61 288.9-.2837 191.4 .0132zM192 96.01c-44.13 0-80 35.89-80 79.1C112 184.8 104.8 192 96 192S80 184.8 80 176c0-61.76 50.25-111.1 112-111.1c8.844 0 16 7.159 16 16S200.8 96.01 192 96.01z"/></svg>
</span></div>
        <div class="grow">
          Tip
        </div>
      </div><div class="admonition-content mt-3 text-base leading-relaxed text-inherit"><p>ThetaVault 2.0 is open source. You can clone and run it yourself:
<strong><a href="https://github.com/leviceroy/ThetaVault"  target="_blank" rel="noreferrer">https://github.com/leviceroy/ThetaVault</a></strong></p></div></div><hr>

<h2 class="relative group">The Problem With Existing Tools
    <div id="the-problem-with-existing-tools" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-problem-with-existing-tools" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Every options trader eventually hits the same wall.</p>
<p>Your broker dashboard shows you open P&amp;L and Greeks, but nothing historical. It doesn't tell you what your average ROC on iron condors was last quarter, whether you're actually better when IV rank is above 50%, or how your win rate changes when you close at 21 DTE vs holding longer.</p>
<p>Spreadsheets help — but they require manual data entry, they break when you add multi-leg strategies, and the math is on you to get right. One wrong formula and your ROC calculations are silent garbage for months.</p>
<p>Web-based journals exist (OptionAlpha, Tradersync, etc.) but they're subscription-based, slow, and don't give you the raw data access serious analysis requires.</p>
<p>What I wanted was:</p>
<ul>
<li><strong>Instant startup</strong> — no loading screens, no browser</li>
<li><strong>Single binary</strong> — works on any machine, no installation drama</li>
<li><strong>100% correct math</strong> — typed language guarantees, not just hope</li>
<li><strong>tastytrade KPI alignment</strong> — the metrics that actually matter for premium selling</li>
</ul>
<p>So I built it in Rust.</p>
<hr>

<h2 class="relative group">Why Rust for a Trading Journal?
    <div id="why-rust-for-a-trading-journal" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#why-rust-for-a-trading-journal" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Rust is an unusual choice for a terminal app. Most people reach for Python or Go. Here's why Rust made sense:</p>
<table>
	<thead>
			<tr>
					<th>Capability</th>
					<th>Spreadsheet</th>
					<th>Web App</th>
					<th>ThetaVault (Rust)</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Startup time</td>
					<td>Instant</td>
					<td>3–10s</td>
					<td>Instant</td>
			</tr>
			<tr>
					<td>Formula safety</td>
					<td>None</td>
					<td>Varies</td>
					<td>Compile-time guaranteed</td>
			</tr>
			<tr>
					<td>Portability</td>
					<td>File share</td>
					<td>Browser</td>
					<td>Single binary</td>
			</tr>
			<tr>
					<td>Complex multi-leg math</td>
					<td>Error-prone</td>
					<td>Depends</td>
					<td>Correct by type system</td>
			</tr>
			<tr>
					<td>Offline operation</td>
					<td>✓</td>
					<td>✗</td>
					<td>✓</td>
			</tr>
			<tr>
					<td>Custom analytics</td>
					<td>Manual</td>
					<td>Limited</td>
					<td>Fully custom</td>
			</tr>
	</tbody>
</table>
<p>The key advantage is <strong>type safety</strong>. When you define that a <code>strike</code> is <code>f64</code> and a <code>quantity</code> is <code>i32</code> and the compiler enforces every calculation that uses them, formula bugs don't survive past build time. The Black-Scholes implementation, the Reg-T BPR calculations, the Kelly Criterion — they're either right at compile time, or they don't compile.</p>
<p>The single binary matters more than it sounds. Clone the repo, <code>cargo build --release</code>, and you have a 30 MB binary that runs on any macOS or Linux machine with zero dependencies. No Node.js. No Docker. No <code>npm install</code> nightmares.</p>
<hr>

<h2 class="relative group">16 Strategies, All the Math
    <div id="16-strategies-all-the-math" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#16-strategies-all-the-math" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>ThetaVault supports every major tastytrade strategy — and gets the math right for each one.</p>
<table>
	<thead>
			<tr>
					<th>Strategy</th>
					<th>Code</th>
					<th>Type</th>
					<th>Notes</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Short Put Vertical</td>
					<td>SPV</td>
					<td>Defined-risk</td>
					<td>Width − credit = BPR</td>
			</tr>
			<tr>
					<td>Short Call Vertical</td>
					<td>SCV</td>
					<td>Defined-risk</td>
					<td>Width − credit = BPR</td>
			</tr>
			<tr>
					<td>Long Put Vertical</td>
					<td>LPV</td>
					<td>Defined-risk</td>
					<td>Debit spread</td>
			</tr>
			<tr>
					<td>Long Call Vertical</td>
					<td>LCV</td>
					<td>Defined-risk</td>
					<td>Debit spread</td>
			</tr>
			<tr>
					<td>Iron Condor</td>
					<td>IC</td>
					<td>Defined-risk</td>
					<td>max(put width, call width) − credit</td>
			</tr>
			<tr>
					<td>Iron Butterfly</td>
					<td>IB</td>
					<td>Defined-risk</td>
					<td>ATM strangle + wings</td>
			</tr>
			<tr>
					<td>Put Broken Wing Butterfly</td>
					<td>PBWB</td>
					<td>Defined-risk</td>
					<td>Special case: offset strikes</td>
			</tr>
			<tr>
					<td>Cash Secured Put</td>
					<td>CSP</td>
					<td>Undefined-risk</td>
					<td>Reg-T margin formula</td>
			</tr>
			<tr>
					<td>Covered Call</td>
					<td>CC</td>
					<td>Undefined-risk</td>
					<td>50% of underlying × 100</td>
			</tr>
			<tr>
					<td>Strangle</td>
					<td>STR</td>
					<td>Undefined-risk</td>
					<td>max(put margin, call margin)</td>
			</tr>
			<tr>
					<td>Straddle</td>
					<td>STD</td>
					<td>Undefined-risk</td>
					<td>ATM strangle</td>
			</tr>
			<tr>
					<td>Calendar Spread</td>
					<td>CAL</td>
					<td>Time spread</td>
					<td>Same strike, different expirations</td>
			</tr>
			<tr>
					<td>Poor Man's Covered Call</td>
					<td>PMCC</td>
					<td>Defined-risk CC</td>
					<td>Deep ITM long + OTM short</td>
			</tr>
			<tr>
					<td>Long Diagonal</td>
					<td>LDS</td>
					<td>Debit spread</td>
					<td>Different strikes + expirations</td>
			</tr>
			<tr>
					<td>Short Diagonal</td>
					<td>SDS</td>
					<td>Credit spread</td>
					<td>Sell longer DTE, buy shorter</td>
			</tr>
			<tr>
					<td>Custom / Ratio</td>
					<td>—</td>
					<td>Any</td>
					<td>Manual leg entry</td>
			</tr>
	</tbody>
</table>
<p>Each strategy has a canonical leg template — the app knows which legs are &quot;short&quot; vs &quot;long&quot; and applies the correct BPR, max profit, max loss, and breakeven formulas automatically.</p>
<p>The PBWB (Put Broken Wing Butterfly) is the most complex. It requires three long put legs at different strikes plus the short leg, and the max profit/loss formula differs from a standard condor. Getting that wrong means your risk display is lying to you. ThetaVault's PBWB implementation uses the correct offset formula and validates strike ladders — if the strikes are wrong, it flags the position in the journal rather than showing a false max profit number.</p>
<div class="admonition relative overflow-hidden rounded-lg border-l-4 my-3 px-4 py-3 shadow-sm" data-type="important">
      <div class="flex items-center gap-2 font-semibold text-inherit">
        <div class="flex shrink-0 h-5 w-5 items-center justify-center text-lg"><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="currentColor" d="M287.9 0C297.1 0 305.5 5.25 309.5 13.52L378.1 154.8L531.4 177.5C540.4 178.8 547.8 185.1 550.7 193.7C553.5 202.4 551.2 211.9 544.8 218.2L433.6 328.4L459.9 483.9C461.4 492.9 457.7 502.1 450.2 507.4C442.8 512.7 432.1 513.4 424.9 509.1L287.9 435.9L150.1 509.1C142.9 513.4 133.1 512.7 125.6 507.4C118.2 502.1 114.5 492.9 115.1 483.9L142.2 328.4L31.11 218.2C24.65 211.9 22.36 202.4 25.2 193.7C28.03 185.1 35.5 178.8 44.49 177.5L197.7 154.8L266.3 13.52C270.4 5.249 278.7 0 287.9 0L287.9 0zM287.9 78.95L235.4 187.2C231.9 194.3 225.1 199.3 217.3 200.5L98.98 217.9L184.9 303C190.4 308.5 192.9 316.4 191.6 324.1L171.4 443.7L276.6 387.5C283.7 383.7 292.2 383.7 299.2 387.5L404.4 443.7L384.2 324.1C382.9 316.4 385.5 308.5 391 303L476.9 217.9L358.6 200.5C350.7 199.3 343.9 194.3 340.5 187.2L287.9 78.95z"/></svg></span></div>
        <div class="grow">
          Important
        </div>
      </div><div class="admonition-content mt-3 text-base leading-relaxed text-inherit"><p>All tastytrade mechanics are baked in by default:</p>
<ul>
<li><strong>21 DTE</strong> management target per position</li>
<li><strong>50% profit</strong> GTC target (customizable per trade)</li>
<li><strong>Undefined-risk allocation</strong> target (admin setting, default 75%)</li>
<li><strong>VIX-adaptive heat thresholds</strong> for position sizing</li>
</ul></div></div><hr>

<h2 class="relative group">The Journal View
    <div id="the-journal-view" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-journal-view" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>The heart of ThetaVault is the trade journal — a 22-column table that gives you complete situational awareness on every open and closed position.</p>
<p>Every column is toggleable via a column picker (press <code>v</code>). You only show what you need.</p>
<table>
	<thead>
			<tr>
					<th>Column</th>
					<th>What It Shows</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Date</td>
					<td>Trade entry date</td>
			</tr>
			<tr>
					<td>Ticker</td>
					<td>Symbol + <code>[!]</code> if playbook violation</td>
			</tr>
			<tr>
					<td>Spot</td>
					<td>Live price, colored green/red vs entry</td>
			</tr>
			<tr>
					<td>ER</td>
					<td>Earnings date countdown (RED if ≤4d)</td>
			</tr>
			<tr>
					<td>Str</td>
					<td>Strategy badge</td>
			</tr>
			<tr>
					<td>Qty</td>
					<td>Contract quantity</td>
			</tr>
			<tr>
					<td>Credit</td>
					<td>Net credit received</td>
			</tr>
			<tr>
					<td>GTC</td>
					<td>Good-till-cancel close target (e.g., <code>$1.15DB</code>)</td>
			</tr>
			<tr>
					<td>BE</td>
					<td>Breakeven(s) — both sides for IC/strangle</td>
			</tr>
			<tr>
					<td>BPR</td>
					<td>Buying power reduction</td>
			</tr>
			<tr>
					<td>BPR%</td>
					<td>BPR as % of account (traffic-light)</td>
			</tr>
			<tr>
					<td>MaxPft</td>
					<td>Max profit at entry</td>
			</tr>
			<tr>
					<td>P&amp;L</td>
					<td>Realized P&amp;L (open = &quot;open&quot;)</td>
			</tr>
			<tr>
					<td>ROC%</td>
					<td>Return on capital, ★ if 50% hit</td>
			</tr>
			<tr>
					<td>$V/d</td>
					<td>P&amp;L per day held</td>
			</tr>
			<tr>
					<td>DTE</td>
					<td>Days to expiration (RED ≤14, YELLOW ≤21)</td>
			</tr>
			<tr>
					<td>Exit</td>
					<td>Exit date</td>
			</tr>
			<tr>
					<td>Held</td>
					<td>Days held</td>
			</tr>
			<tr>
					<td>Status</td>
					<td>OPEN / CLOSED / ROLLED / EXPIRD</td>
			</tr>
			<tr>
					<td>OTM%</td>
					<td>How far short strike is from current price</td>
			</tr>
			<tr>
					<td>EM</td>
					<td>Expected move: <code>spot × IV × √(DTE/365)</code></td>
			</tr>
			<tr>
					<td>Mgmt</td>
					<td>Management trigger date (21 DTE target)</td>
			</tr>
	</tbody>
</table>
<p>The <strong>Mgmt column</strong> is something I haven't seen in other journals. It computes the date by which you should be looking to manage or close the trade to stay on the 21 DTE schedule. It turns RED when that date has passed, YELLOW when you're within 5 days.</p>

<h3 class="relative group">Chain View
    <div id="chain-view" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#chain-view" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>Press <code>G</code> to toggle Chain View — a hierarchical grouping of all trades by ticker, showing roll chains together:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">▼ SPY    3 open · 5 closed    net P&amp;L: +$2,847
</span></span><span class="line"><span class="cl">  ├─ [IC]  Feb 15  Rolls: 2  Credit: $4.85  Net P&amp;L: +1,203  CLSD ✓
</span></span><span class="line"><span class="cl">  ├─ [IC]  Mar 01  Rolls: 1  Credit: $3.20  Net P&amp;L: +847    CLSD ✓
</span></span><span class="line"><span class="cl">  └─ [STR] Mar 08  Rolls: 0  Credit: $6.40  Net P&amp;L: —       OPEN ●</span></span></code></pre></div></div>
<p>This is invaluable for understanding your total exposure in a campaign. If you've rolled a strangle three times, you want to see the cumulative P&amp;L and commissions across the entire chain, not just the current leg.</p>
<hr>

<h2 class="relative group">Dashboard: Portfolio-Wide Intelligence
    <div id="dashboard-portfolio-wide-intelligence" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#dashboard-portfolio-wide-intelligence" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>The dashboard gives you a real-time overview of everything open.</p>
<p><strong>Heat Card</strong> — the most important number in your account. It shows total BPR as a percentage of account size, with adaptive thresholds: when VIX is elevated, the &quot;safe zone&quot; threshold tightens automatically. Includes a Kelly fraction footer showing your optimal position size.</p>
<p><strong>Greeks Card</strong> — portfolio-wide net theta, beta-weighted delta, and net vega. These numbers aggregate across all open positions and tell you: how much time decay are you collecting per day? How directionally biased is the book? How exposed are you to volatility changes?</p>
<p><strong>POP Health</strong> — average probability of profit across all open positions. If any position is trading within 3% of its breakeven, it's flagged in red. This is your &quot;stress radar.&quot;</p>
<p><strong>Monthly Pace</strong> — if you've set a monthly P&amp;L target in admin settings, this card shows your current month's P&amp;L and whether you're on track.</p>
<p><strong>Strategy Distribution</strong> — a visual bar showing the BPR breakdown by strategy type. At a glance: are you over-allocated to strangles? Underweighted in iron condors?</p>
<hr>

<h2 class="relative group">The Calculations Are Actually Correct
    <div id="the-calculations-are-actually-correct" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-calculations-are-actually-correct" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>I ran the entire calculation stack through a rigorous audit against tastytrade mechanics and academic finance formulas. The verdict: <strong>A+ accuracy</strong>.</p>

<h3 class="relative group">Black-Scholes Greeks
    <div id="black-scholes-greeks" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#black-scholes-greeks" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>The Greek estimation uses the standard Black-Scholes model with the Abramowitz &amp; Stegun approximation for the normal CDF:</p>


$$d_1 = \frac{\ln(S/K) + (r + \sigma^2/2)t}{\sigma\sqrt{t}}$$$$d_2 = d_1 - \sigma\sqrt{t}$$$$\Delta_{call} = N(d_1), \quad \Delta_{put} = N(d_1) - 1$$$$\Theta = \frac{-S \cdot n(d_1) \cdot \sigma}{2\sqrt{t}} \pm rKe^{-rt}N(\pm d_2)$$<p>The <strong>sign convention on theta is tastytrade-aligned</strong>: positive theta means you're the premium seller collecting time decay. This is the opposite of academic convention, but it's how tastytrade displays Greeks — and it's the convention that makes intuitive sense for a credit-seller's journal.</p>

<h3 class="relative group">Buying Power Reduction
    <div id="buying-power-reduction" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#buying-power-reduction" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>BPR is computed using Reg-T margin rules per strategy type:</p>
<table>
	<thead>
			<tr>
					<th>Strategy</th>
					<th>BPR Formula</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Vertical / IC / IB</td>
					<td><code>(max_width − credit) × 100 × qty</code></td>
			</tr>
			<tr>
					<td>Cash Secured Put</td>
					<td><code>max(20% × S − OTM + prem, 10% × S + prem) × 100 × qty</code></td>
			</tr>
			<tr>
					<td>Strangle</td>
					<td><code>max(put_leg_margin, call_leg_margin) × 100 × qty</code></td>
			</tr>
			<tr>
					<td>Covered Call</td>
					<td><code>50% × underlying × 100 × qty</code></td>
			</tr>
	</tbody>
</table>

<h3 class="relative group">Probability of Profit
    <div id="probability-of-profit" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#probability-of-profit" aria-label="Anchor">#</a>
    </span>
    
</h3>


$$POP_{put} = N(d_2) \times 100$$$$POP_{IC} = N(d_{2,put}) + N(-d_{2,call}) - 1$$
<h3 class="relative group">Kelly Criterion
    <div id="kelly-criterion" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#kelly-criterion" aria-label="Anchor">#</a>
    </span>
    
</h3>
$$K = win\_rate - \frac{1 - win\_rate}{avg\_RR}$$<p>Capped at 25% to prevent ruin. Negative Kelly (negative edge) is shown in red — &quot;reduce size.&quot;</p>
<div class="admonition relative overflow-hidden rounded-lg border-l-4 my-3 px-4 py-3 shadow-sm" data-type="info">
      <div class="flex items-center gap-2 font-semibold text-inherit">
        <div class="flex shrink-0 h-5 w-5 items-center justify-center text-lg"><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 128c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S224 177.7 224 160C224 142.3 238.3 128 256 128zM296 384h-80C202.8 384 192 373.3 192 360s10.75-24 24-24h16v-64H224c-13.25 0-24-10.75-24-24S210.8 224 224 224h32c13.25 0 24 10.75 24 24v88h16c13.25 0 24 10.75 24 24S309.3 384 296 384z"/></svg>
</span></div>
        <div class="grow">
          Info
        </div>
      </div><div class="admonition-content mt-3 text-base leading-relaxed text-inherit"><p>All formulas are implemented in a single <code>src/calculations.rs</code> file. Every calculation is pure Rust — no floating-point surprises, no silent NaN propagation.</p></div></div><hr>

<h2 class="relative group">Performance Analytics: 14 Sections
    <div id="performance-analytics-14-sections" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#performance-analytics-14-sections" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>The Performance tab gives you a full post-trade analysis engine. 14 collapsible sections, toggled individually with keys <code>1</code>–<code>0</code>.</p>
<table>
	<thead>
			<tr>
					<th>Section</th>
					<th>What You Learn</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>Health</strong></td>
					<td>Win rate, scratch rate, avg win/loss, profit factor</td>
			</tr>
			<tr>
					<td><strong>Returns</strong></td>
					<td>Avg ROC, Sharpe ≥1.0, Sortino ≥1.5, Calmar ≥1.0, avg credit/DTE</td>
			</tr>
			<tr>
					<td><strong>Advanced</strong></td>
					<td>Expected value, Kelly fraction, premium recapture %</td>
			</tr>
			<tr>
					<td><strong>Growth</strong></td>
					<td>Account balance history, drawdown curve</td>
			</tr>
			<tr>
					<td><strong>Strategy</strong></td>
					<td>Win rate, avg P&amp;L, avg ROC broken down by strategy</td>
			</tr>
			<tr>
					<td><strong>Ticker</strong></td>
					<td>Win rate, avg ROC, avg IVR, avg entry DTE per ticker</td>
			</tr>
			<tr>
					<td><strong>Monthly</strong></td>
					<td>P&amp;L calendar, monthly win rate sparklines</td>
			</tr>
			<tr>
					<td><strong>IVR</strong></td>
					<td>Win rate bucketed by IV Rank at entry (&lt;25%, 25-50%, 50-75%, 75%+)</td>
			</tr>
			<tr>
					<td><strong>VIX</strong></td>
					<td>Performance by VIX regime: Calm / Normal / Elevated / High / Stress</td>
			</tr>
			<tr>
					<td><strong>DTE</strong></td>
					<td>Win rate and avg ROC by DTE bucket at entry and close</td>
			</tr>
			<tr>
					<td><strong>IVR Entry Histogram</strong></td>
					<td>Distribution of your IVR entries — are you entering at the right time?</td>
			</tr>
			<tr>
					<td><strong>P&amp;L Distribution</strong></td>
					<td>How wins and losses are distributed (bell curve shape)</td>
			</tr>
			<tr>
					<td><strong>Held Duration</strong></td>
					<td>Distribution of how long positions were held</td>
			</tr>
			<tr>
					<td><strong>Commissions</strong></td>
					<td>Total commissions, avg per trade, % impact on gross P&amp;L</td>
			</tr>
	</tbody>
</table>
<p>The IVR and VIX sections are what tell you whether your entry timing is actually working. If your win rate in the 25-50% IVR bucket is 71% but drops to 52% in the &lt;25% bucket — that's the data you need to tighten your entry rules.</p>
<hr>

<h2 class="relative group">Playbook Compliance System
    <div id="playbook-compliance-system" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#playbook-compliance-system" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>This is the feature that separates ThetaVault from every spreadsheet approach.</p>
<p>You define a trading playbook — a set of entry criteria for a specific strategy:</p>
<ul>
<li>Min/Max IV Rank range (e.g., &quot;only enter when IVR &gt; 40&quot;)</li>
<li>Min Probability of Profit (e.g., &quot;POP must be ≥ 68%&quot;)</li>
<li>Max Delta at entry (e.g., &quot;delta ≤ 0.16&quot;)</li>
<li>DTE range (e.g., &quot;30–45 DTE only&quot;)</li>
<li>Max BPR % of account</li>
<li>Target profit %, stop loss %, management DTE</li>
</ul>
<p>When you log a trade, ThetaVault automatically matches it to the best-fitting playbook. If exactly one playbook matches, it auto-assigns. If the trade violates any criterion, a <code>[!]</code> flag appears in the journal next to the ticker.</p>
<div class="admonition relative overflow-hidden rounded-lg border-l-4 my-3 px-4 py-3 shadow-sm" data-type="warning">
      <div class="flex items-center gap-2 font-semibold text-inherit">
        <div class="flex shrink-0 h-5 w-5 items-center justify-center text-lg"><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"/></svg>
</span></div>
        <div class="grow">
          Warning
        </div>
      </div><div class="admonition-content mt-3 text-base leading-relaxed text-inherit"><p>The <code>[!]</code> flag isn't a hard block — you can still log the trade. It's a reminder that you're operating outside your own rules. The performance section then lets you compare: <strong>matched vs unmatched win rates</strong>. If your win rate is 72% when you follow the playbook and 51% when you don't, that's data you can't ignore.</p></div></div><hr>

<h2 class="relative group">Getting Started
    <div id="getting-started" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#getting-started" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>ThetaVault requires Rust (the toolchain, not just the language). Install it once, then you're set for all future builds.</p>
<p><strong>1. Install Rust:</strong></p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl --proto <span class="s1">&#39;=https&#39;</span> --tlsv1.2 -sSf https://sh.rustup.rs <span class="p">|</span> sh</span></span></code></pre></div></div>
<p><strong>2. Clone and build:</strong></p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone https://github.com/leviceroy/ThetaVault.git
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> ThetaVault
</span></span><span class="line"><span class="cl">cargo build --release</span></span></code></pre></div></div>
<p><strong>3. Run:</strong></p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./target/release/theta-vault-rust</span></span></code></pre></div></div>
<p>That's it. The SQLite database (<code>trades.db</code>) is created automatically on first run. No setup wizard, no config files, no cloud account.</p>
<p><strong>First steps inside the app:</strong></p>
<ol>
<li>Press <code>Tab</code> to navigate to <strong>Admin (Tab 5)</strong> and set your account size</li>
<li>Press <code>Tab</code> to <strong>Playbook (Tab 3)</strong> and create your first strategy playbook</li>
<li>Press <code>Tab</code> to <strong>Journal (Tab 2)</strong> and press <code>n</code> to log your first trade</li>
<li>Press <code>Tab</code> to <strong>Dashboard (Tab 1)</strong> to see your portfolio Greeks and heat</li>
</ol>
<hr>

<h2 class="relative group">Conclusion
    <div id="conclusion" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#conclusion" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>ThetaVault 2.0 is what a serious options journal should be. Not a subscription SaaS, not a fragile spreadsheet — a fast, reliable, open-source tool that knows the tastytrade playbook as well as you do.</p>
<p>The math is right. The strategy coverage is complete. The analytics go deep enough to actually improve your trading.</p>
<p>If you're a tastytrade-style premium seller who wants real data on whether your process is working, give it a shot. Star the repo if it's useful — it's how I know this work matters.</p>
<p><strong><a href="https://github.com/leviceroy/ThetaVault"  target="_blank" rel="noreferrer">https://github.com/leviceroy/ThetaVault</a></strong></p>
<hr>
<p><em>Built with Rust, ratatui, and SQLite. Copyright © 2025 Chris Wenk.</em></p>
]]></content:encoded>
      
      <media:content url="http://localhost:58538/img/featured/theta-vault-options-trading-journal.webp" medium="image" />
    </item>
    
  </channel>
</rss>
