PAUL OJURI
AVAILABLE

TRADEEASY — PERSONAL OPTIONS TOOL

OPTIONS SIGNALS.
YOUR CALL.

A semi-automated research tool that generates directional options ideas, runs them through a deterministic risk gate, and queues them for my review. Claude provides the thesis. Python owns every number. I pull the trigger.

View on GitHub →Read the brief →

PIPELINE — TWO MODES, ONE ENGINE

1

SCAN WATCHLIST / ANALYZE TICKER

CLI: optsig scan · optsig analyze TICKER

2

4 DETERMINISTIC SCREENS

yfinance · price trend · IV/HV · volume · momentum

3

CLAUDE THESIS

claude-opus-4-8 · structured output · prompt-cached system prompt

4

RISK GATE + GREEKS

Black-Scholes · position sizing · stop-loss · all recomputed

5

HUMAN APPROVAL QUEUE

Streamlit UI · full ticket review · my decision

6

IBKR BRACKET ORDER — transmit=False

ib_async · paper trading · manual transmit

TWO ENTRY POINTS.
ONE RISK MODEL.

optsig scan sweeps the full watchlist through all four screens and queues every name that clears. optsig analyze TICKER runs the same engine on a single name, on demand.

Either path terminates at the same approval queue. The engine is the same. The risk gate is the same. The human step is the same.

DESIGN PRINCIPLES

RULES THE SYSTEM
CANNOT BREAK.

01

Claude reasons. Python calculates.

The model proposes a thesis and a structure. It never computes Greeks, position sizes, or stop-losses. Every number it suggests is discarded and recomputed deterministically.

02

Human approval is mandatory.

The system's output is a queue of proposals. Nothing becomes actionable until I approve it. On approval, a bracket order stages to IBKR paper trading with transmit=False. Final transmit is always mine.

03

Defined risk only.

Allowed structures: long_call, long_put, call_debit_spread, put_debit_spread. Naked positions and undefined-risk structures are rejected in the system prompt and re-validated in code.

04

Audit everything.

Every proposal — input bundle, raw model output, recomputed risk, my decision, fills — is persisted to SQLite. This is how I learn whether the signals are any good.

TECH STACK

Python 3.11core runtime, pure deterministic modules
yfinancedelayed screening data, on-disk cache, rate-limited
Anthropic SDKclaude-opus-4-8 for thesis, prompt caching on system prompt
ib_asyncIBKR bracket orders, paper trading, transmit=False
Streamlitlocal approval queue UI
SQLiteproposals, decisions, runs, fills — zero infrastructure
ClickCLI: optsig scan / optsig analyze TICKER
Black-Scholes (hand-rolled)Greeks, expected move, prob ITM — pure Python, unit tested

INTENTIONALLY
HYBRID.

The data layer is intentionally hybrid. yfinance handles cheap broad screening — the kind of data pull you do across 20+ names. Only names that clear a deterministic screen get routed to IBKR for real-time quotes and broker Greeks. This keeps the tool under Yahoo's rate limit and off IBKR's market-data line limits.

IV rank is a known proxy: yfinance doesn't provide historical implied vol, so the screen uses IV/HV ratio as a stand-in. It's labeled as such everywhere. A real IV rank source can drop in without touching the engine.

PROPOSAL SCHEMA — §5B

EVERY IDEA IS A COMPLETE
DECISION-READY TICKET.

{  "ticker": "NVDA",  "structure": "call_debit_spread",  "risk_type": "medium",  "entry": {    "net_debit_per_contract": 620,    "contracts": 2  },  "risk": {    "max_loss": 1240,    "max_gain": 1760,    "risk_reward": 1.42  },  "stop_loss": {    "premium_stop_per_contract": 310,    "underlying_stop": 122.4  },  "greeks": {    "delta": 0.31,    "theta": -3.1,    "vega": 11.2,    "source": "black_scholes"  },  "horizon": {    "dte": 57,    "manage_by": "2026-08-01"  },  "thesis": "...3-4 sentences from Claude grounded in the data bundle...",  "confidence": 0.68,  "status": "pending"}

PERSONAL USE ONLY — NOT TRADING ADVICE

This is a personal research tool for my own capital. It does not give financial advice. All trade decisions are mine. Data is delayed. IV/HV ratio is a proxy. The system can and will be wrong.

View source →