CLI tool for plotting financial data and analyzing options
Project description
fplot - Financial Plotting & Options Analysis CLI
A command-line tool for plotting comparative stock price history and analyzing options contracts.
Installation
From PyPI
pip install grynn-fplot
Or with uv:
uv tool install grynn-fplot
From Source
For development, install the package in editable mode:
make dev
Or install locally:
make install # Uses uv tool install .
Usage
Stock Plotting
fplot <ticker> [--since <date>] [--interval <interval>]
Examples:
fplot AAPLfplot AAPL --since 2020fplot AAPL,TSLA --since "mar 2023"
Options Listing
fplot <ticker> --call # List call options (default: 6 months max)
fplot <ticker> --put # List put options (default: 6 months max)
fplot <ticker> --call --max 3m # List calls with 3 month max expiry
fplot <ticker> --put --all # List all available put options
fplot <ticker> --call --min-dte 1y # List long-dated calls (min 1 year)
fplot <ticker> --call --filter "dte>1y" # Filter using time expressions
Examples:
fplot AAPL --callfplot TSLA --put --max 3mfplot AAPL --call --allfplot AAPL --call --min-dte 1y# Long-dated calls (1+ year)fplot AAPL --call --min-dte 6m# Calls with 6+ months to expiryfplot AAPL --call --filter "dte>10, dte<50"# 10-50 days to expiryfplot AAPL --call --filter "dte>1y"# Options with 1+ year to expiry
The output format differs for calls and puts:
Calls include leverage and efficiency (useful for LEAPs):
AAPL 225C 35DTE ($5.25, 18.5%, 19.0x, eff:45)
AAPL 230C 35DTE ($3.10, 25.2%, 32.3x, eff:78)
Format: TICKER STRIKE_C DTE (price, CAGR, leverage, eff:percentile)
Puts display a table with spot price header, expiry, strike, breakeven, and AR computed from bid/ask/last:
spot = $235.50
Expiry Strike Breakeven LT AR (bid / ask / last)
---------------------------------------------------------------------------
27/Mar/25 (35d) 220 $217.85 (-1.0%) 1d bid:20% ask:28% last:25%
27/Mar/25 (35d) 215 $213.60 (-0.7%) 3d bid:12% ask:18% last:15%
Return metrics:
- Calls: CAGR to breakeven
- Puts: AR = premium / capital-at-risk, annualized (capital-at-risk = strike - premium)
Leverage & Efficiency (calls only):
- Leverage: Implied leverage (Ω = Δ × S/O) where Δ is Black-Scholes delta, S is spot price, O is option price
- Delta calculated using actual implied volatility from Yahoo Finance
- Shows "N/A" if implied volatility is not available
- Shows the percentage change in option value for a 1% change in stock price
- Example: 10x leverage means a 1% stock move results in ~10% option move
- Efficiency: Percentile rank (0-100) of leverage/CAGR ratio
- Higher = better (high leverage with low required stock movement)
- 80+ = top 20% most efficient options
- Shows "N/A" if leverage or return unavailable
Expiry Filtering Options:
--max <time>: Filter to show only options expiring within the specified time- Examples:
3m(3 months),6m(6 months),1y(1 year),2w(2 weeks),30d(30 days) - Default:
6m(6 months)
- Examples:
--min-dte <time>: Minimum days to expiry (useful for long-dated options)- Accepts plain days or time expressions:
300,1y,1.5y,6m,2w - Examples:
--min-dte 1y(1+ year),--min-dte 6m(6+ months) - Note: Using
--min-dteautomatically enables--allbehavior
- Accepts plain days or time expressions:
--all: Show all available expiries (overrides--max)
Advanced Filtering with --filter:
The --filter option supports complex filter expressions with logical operators:
-
Syntax:
- Comma (
,) represents AND operation - Plus (
+) represents OR operation - Comparison operators:
>,<,>=,<=,=,!= - Parentheses for grouping:
(expr1 + expr2), expr3
- Comma (
-
Filter Fields:
dte: Days to expiryvolume: Option volumeprice: Last pricereturn,ret,ar: Return metric (CAGR for calls, AR for puts) - all aliases workstrike_pct,sp: Strike percentage above/below spot (positive = above spot, negative = below spot)lt_days: Days since last trade (useful for filtering stale options)leverage,lev: Implied leverage, calls only (Ω = Δ × S/O, using Black-Scholes delta)efficiency,eff: Efficiency percentile, calls only (leverage/CAGR ratio, 0-100 scale)
-
Examples:
--filter "dte>300"- Options with more than 300 days to expiry--filter "dte>10, dte<50"- Options between 10-50 days (AND operation)--filter "dte<30 + dte>300"- Short-term OR long-dated (OR operation)--filter "sp>5, sp<15"- Strikes 5-15% above current spot price--filter "(dte>300 + dte<30), sp>5"- Complex nested filters--filter "volume>=100"- High volume options--filter "lt_days<=7"- Options traded within last 7 days--filter "ar>50"- Annualized return > 50%--filter "leverage>10"- High leverage options (10x or more)--filter "lev>5, lev<20"- Moderate leverage options (5x-20x)--filter "efficiency>80"- Top 20% most efficient options--filter "eff>60, dte<60"- Above-average efficiency with <60 days to expiry
-
Time Values:
- DTE-style expressions:
1y(365 days),6m(180 days),2w(14 days) - Duration expressions:
2d15h,30m,1d(converted to hours for duration fields) - Examples:
--filter "dte>1y"- Options with more than 1 year to expiry--filter "dte>6m"- Options with more than 6 months to expiry--filter "lt_days<=7"- Options traded in the last week
- DTE-style expressions:
Options data is cached for 1 hour to improve performance and reduce API calls.
TODO
- fplot --call | fzf lets you select a call; once a call is selected it should be possible to plot a chart for it (yfinance provides price history for option identifiers)
- need more examples of usage with fzf to pick a call
- use grynn_pylib to download options (does it have identifiers that can be used to fetch price history?)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file grynn_fplot-0.3.8.tar.gz.
File metadata
- Download URL: grynn_fplot-0.3.8.tar.gz
- Upload date:
- Size: 138.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ae630922b3114c5569e38776a321b8c1bf950902fe329ca279af070e334d9e8
|
|
| MD5 |
17168836f4db03bad308bff9356e7555
|
|
| BLAKE2b-256 |
1a2357f319981c74413663f6a6c2a33fda2194f9b574751abe2390da892aaa52
|
Provenance
The following attestation bundles were made for grynn_fplot-0.3.8.tar.gz:
Publisher:
publish.yml on Grynn/grynn_cli_fplot
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
grynn_fplot-0.3.8.tar.gz -
Subject digest:
5ae630922b3114c5569e38776a321b8c1bf950902fe329ca279af070e334d9e8 - Sigstore transparency entry: 871176721
- Sigstore integration time:
-
Permalink:
Grynn/grynn_cli_fplot@25ba12668c4df7c05728cb71be4283ce64f2579e -
Branch / Tag:
refs/tags/v0.3.8 - Owner: https://github.com/Grynn
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@25ba12668c4df7c05728cb71be4283ce64f2579e -
Trigger Event:
push
-
Statement type:
File details
Details for the file grynn_fplot-0.3.8-py3-none-any.whl.
File metadata
- Download URL: grynn_fplot-0.3.8-py3-none-any.whl
- Upload date:
- Size: 40.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5dd402554794b6adfb455db58ee47273ba3c216a7c5618aceda0624551db8d5e
|
|
| MD5 |
cafd41f74df86ee44f8879ad0282d0f8
|
|
| BLAKE2b-256 |
0ae64a6483cad6660dcf8b1b194156c4e84b378728d36685ccea7e4e7b264193
|
Provenance
The following attestation bundles were made for grynn_fplot-0.3.8-py3-none-any.whl:
Publisher:
publish.yml on Grynn/grynn_cli_fplot
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
grynn_fplot-0.3.8-py3-none-any.whl -
Subject digest:
5dd402554794b6adfb455db58ee47273ba3c216a7c5618aceda0624551db8d5e - Sigstore transparency entry: 871176726
- Sigstore integration time:
-
Permalink:
Grynn/grynn_cli_fplot@25ba12668c4df7c05728cb71be4283ce64f2579e -
Branch / Tag:
refs/tags/v0.3.8 - Owner: https://github.com/Grynn
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@25ba12668c4df7c05728cb71be4283ce64f2579e -
Trigger Event:
push
-
Statement type: