I want to be transparent about how Beleth's strategy came together, because I think the "why" matters as much as the "what."
The starting point. The hackathon rules required options trading, with thematic tracks on volatility, hedging and portfolio overlays. That immediately ruled out pure directional strategies: the right question wasn't "does the asset go up or down," but "how expensive is implied volatility relative to what actually realizes."
The choice: volatility risk premium. Historically, implied volatility tends to run systematically higher than realized volatility — sellers of options get paid, on average, to absorb a risk that in most cases doesn't materialize as much as the market prices it. From there, the decision: sell premium, don't buy it.
Why defined risk, always. Selling naked premium exposes you to theoretically unlimited losses — unacceptable for an autonomous agent operating without continuous supervision. I chose short vertical credit spreads: you sell one option and simultaneously buy a further-out protective leg, in a single multi-leg order. Maximum loss is known before entering the trade. Never naked legs, no exceptions — it's one of the hardest rules in the system.
Character before strategy. Before writing any code, I decided what character the agent needed to have: profitable, cautious, winning — not aggressive. That decision drove every threshold that came after: better zero trades in a day than one that violates the defined-risk logic.
Where the model decides, where the code decides. The LLM (via LiteLLM, to stay provider-agnostic) evaluates the evidence package — available spreads, the historical VIX percentile, term structure, macro events — and proposes or discards a trade idea. But the final go-ahead is never up to the model alone: it passes through a set of deterministic, non-negotiable risk rules (minimum VRP threshold, inverted term structure gate, macro event gate, 1-2% sizing per trade, 3% daily drawdown stop, VIX-percentile size taper, anti-stacking block, aggregate risk cap). The model proposes, the code disposes.
The lesson from day 1. The first real day produced a single trade out of five attempts and 147 rejections — initially mislabeled, all lumped under the same rule. Instead of accepting that data as-is, I ran a full architectural review: fixed slippage replaced with slippage computed from the real spread, VIX percentile finally used for sizing (not just computed and ignored), the two rejection causes separated with distinct rule IDs, and an aggregate risk cap added that didn't exist before. All of it calibrated on real historical data, not on default values left in place "until I decide otherwise."
The result of that process is what you see in the dashboard today: not just the trades Beleth makes, but especially the ones it rejects, and why. That's the part of the strategy I consider most important: a bot that knows how to say no, with a clear reason, is worth more than one that racks up trades.
Let's discuss it here: if a threshold looks too conservative or too loose to you, I'm curious to hear it.