Balls of Steel: VXX Trading System

A volatility system is only interesting if it reduces noise instead of adding more of it. The core idea here is simple: if VXX gets too rich relative to VIX, the fade becomes worth your attention.

Jeff used to talk about algorithms.

This was the phone room era — 300 calls a day, 3am wake-ups, commission checks that looked like ransom notes. Jeff kept saying algos were where it was going. I kept saying we sell. That's the job. No algorithm closes a reluctant client on a Friday afternoon. We sell.

Jeff had a point I wasn't ready to hear yet.

Years later my father asked me why I didn't build a trading app with AI. Not a pitch. Just a question. He thinks in mathematical systems. He does not understand why you would trade anything without a model underneath it. The question sat with me long enough that I eventually stopped ignoring it and built the thing.

This is that thing. It works. Not every trade. The stretched trade.

The Spine

The whole system sits on one number: the VXX/VIX ratio.

VXX tracks short-term VIX futures. VIX measures implied volatility in the S&P 500 options market. In a normal environment, VXX trades close to VIX. When panic accelerates, VXX can run hotter — fear puts a premium on the trade itself, separate from what the underlying volatility index is actually reading. That gap is the signal.

When VXX gets rich enough relative to VIX, mean reversion starts mattering. The emotional price has outrun the underlying measure. The fade has teeth.

The ratio does not tell you when. It tells you whether the conversation is even worth having.

def vxx_vix_ratio(vxx_price, vix_level):
    """
    Core signal. Ratio above threshold = fade candidate.
    Below threshold = don't force it.
    """
    ratio = vxx_price / vix_level
    return ratio

def is_fade_candidate(ratio, threshold=1.15):
    """
    Threshold tuned to your risk tolerance.
    Higher threshold = fewer trades, higher conviction.
    Lower threshold = more trades, more noise.
    """
    return ratio >= threshold

def check_entry_conditions(ratio, volume_confirmed, timing_window, no_breaking_news):
    """
    The ratio is the gate. Everything else is the filter.
    All four must be true or there is no trade.
    """
    return (
        is_fade_candidate(ratio) and
        volume_confirmed and
        timing_window and
        no_breaking_news
    )

That is the skeleton. Simple enough to explain in one conversation. Strict enough to kill most possible trades before they get to feel important.

The Filters

Volume matters because retail noise and institutional positioning do not leave the same footprint. Thin volume on a spike looks like opportunity. It is usually a trap.

Timing windows matter because the market behaves differently when real money is repositioning near the close than it does in dead air between sessions. The same ratio reading at 11am and 3:45pm is two different conversations.

Technical structure matters because even a good fade can be a stupid entry if there is no sign of exhaustion in the move. The ratio says the price is stretched. The chart tells you if it is still stretching or starting to buckle.

And then there is news.

News is the filter that kills the most setups, and it is the right one to lose. There is no point fading a VXX premium while fresh information is still changing the price of fear. A geopolitical event, a Fed surprise, a print that blows the consensus — these do not care about your ratio. The setup that looked clean at 2pm can be genuinely different information at 2:07pm.

The companion piece to this system is exactly that problem: Yesterday's News. Public information is always late, but breaking information is a different animal. The system needs to know which one it is dealing with before it takes the trade.

Build Your Own Version

Here is the thing the code cannot do: sit on its hands when everything in your body is telling you to trade.

The automation enforces the conditions. It does not supply the discipline to honor them when the market is moving and your ego wants in. That discipline is the actual edge. It is not a system. It is not an indicator. It is not a ratio. It is the capacity to watch a setup fail one condition and walk away without manufacturing a reason why this time is different. That is what "balls of steel" means in practice. The code is scaffolding for that capacity. It is not a substitute for it.

HACK LOVE BETRAY
COMING SOON

HACK LOVE BETRAY

Mobile-first arcade trench run through leverage, trace burn, and betrayal. The City moves first. You keep up or you get swallowed.

VIEW GAME FILE

With that said — the automation is worth building. Not because it makes the decisions, but because a terminal saying NO-GO is harder to argue with than your own hesitation.

Here is how to get there with AI doing the heavy lifting on the build.

Start with the alert:

Build a Python script that monitors the VXX/VIX ratio in real time 
using Yahoo Finance data (yfinance library). 

Alert me when:
- The VXX/VIX ratio exceeds [your threshold, start at 1.15]
- 20-day average volume on VXX is above current session volume (thin volume filter)
- Market is in the last 90 minutes of the session (timing window)

Output a simple terminal alert with: current ratio, volume status, 
time remaining, and a yes/no on whether all three conditions are met.
No dashboard. No graphics. Just the signal.

Add the news filter:

Before I take any VXX fade trade, I want to check whether breaking news
is still actively moving the market. 

Build a function that:
1. Pulls the last 30 minutes of financial headlines from a free API (NewsAPI or similar)
2. Scores them for market-moving potential: Fed language, geopolitical events, 
   major economic prints, earnings surprises
3. Returns a simple verdict: CLEAR (nothing new in 30 min) or HOLD (fresh catalyst present)

If HOLD, explain in one sentence what the catalyst is.
If CLEAR, confirm the coast is clean and timestamp it.

Combine into a pre-trade checklist:

I have a volatility fade system based on the VXX/VIX ratio. 
Before I take any trade, I want a terminal command that checks 
all four conditions and gives me a single GO or NO-GO.

Conditions:
1. VXX/VIX ratio above threshold
2. Volume above session average
3. Within timing window (last 90 minutes)
4. No breaking news in last 30 minutes (use news function above)

Output: GO / NO-GO and which condition failed if NO-GO.
Nothing else. No encouragement. No caveats. Just the verdict.

The automation does not replace judgment. It removes the temptation to override your own rules when the setup is 3 out of 4 and your appetite is pushing for 4 out of 4. The system saying NO-GO to your face is harder to argue with than your own hesitation.

One more thing about every person selling you a system that beats the market: they do not exist. The market pays for surviving uncertainty, not for eventually being right. Anytime you do not lose, you win. That is not a consolation prize. That is the real edge most people never figure out because they are too busy looking for the shortcut the guru is selling.

The system above does not beat the market. It keeps you from getting beaten by the noise inside your own head. That is enough.

A Model That Says No More Often Than Yes

The point of a trading system is not to sound sophisticated. It is to take something messy and reduce it to a decision you can actually live with.

This one creates refusal. Most possible trades die before they get to feel important. Ratio weak — no trade. Volume thin — no trade. Timing wrong — no trade. Headline just detonated the afternoon — no trade. That is the majority of days. Survival in this kind of work comes from designing a process that says "not this one" more often than your own appetite will.

That is also why I never found it interesting as a brute-force checklist. The checklist is the visible shell. The real value is psychological. It narrows the field enough that you stop improvising reasons to participate. Once the setup is there, execution gets quieter. You are not making a fresh argument every time. You are recognizing a condition you already decided mattered.

Jeff was right about the algos. Not in the way he meant it — not as a replacement for selling, for reading the room, for the human judgment that still closes the reluctant client. But as infrastructure underneath that judgment. A model that says no more often than yes is not a limitation. It is the design.

My father asked why I didn't build it sooner.

Fair question.

The full system, the philosophy behind it, and the actual trade psychology is in the book: Balls of Steel.

github.com/ghostintheprompt/balls_of_steel


GhostInThePrompt.com // The edge isn't in every move. It's in the stretched move. Refusal is the real algorithm.