| name | visualize-portfolio |
| description | Automatically find the latest portfolio CSVs, process them, and display visualizations in web browser. Use when you want a complete portfolio analysis with one command. |
| allowed-tools | Bash(python:*), Read |
Visualize Portfolio
This skill provides a one-command solution to visualize your complete portfolio. It automatically finds the latest CSV files from Fidelity and Tastytrade, processes the data, detects synthetic positions, generates visualizations, and opens them in your web browser.
Instructions
When you want to visualize your portfolio:
-
Run the visualization script
- Execute
python tools/visualize.py from the skill directory
- Or use:
python .claude/skills/visualize-portfolio/tools/visualize.py from project root
- Script automatically finds latest CSVs, processes data, and opens plots
-
Review the visualizations
- Plots open automatically in your default web browser
- HTML file contains all charts embedded as images
- Expiring options report saved as CSV
-
Check output files
plots.html - Interactive HTML with all visualizations
expiring_options.csv - Options expiring in next 90 days
What This Skill Does
Automatic Workflow:
- 🔍 Finds latest Fidelity and Tastytrade CSV files in ~/Downloads
- 📊 Parses and harmonizes data from both brokers
- 🎯 Detects synthetic long positions (LC + SP pairs)
- 📈 Generates comprehensive visualizations:
- Current value by stock position (linear & log scale)
- Portfolio allocation pie charts
- Options exposure per ticker
- Strike ladders
- Options expiry timelines with current price lines
- 📋 Creates expiring options report
- 🌐 Opens all plots in web browser
What Gets Visualized:
- Stock positions by current value
- Portfolio allocation (major positions and small positions)
- Options exposure grouped by ticker
- Options exposure by type (Long Call, Short Call, Long Put, Short Put, Synthetic Long)
- Strike ladders showing position values at each strike
- Expiration timelines (short-term < 60 DTE, long-term ≥ 60 DTE)
- Current stock price lines on expiry plots (via yfinance)
Usage
Basic Usage (Most Common)
cd .claude/skills/visualize-portfolio
python tools/visualize.py
python .claude/skills/visualize-portfolio/tools/visualize.py
This uses smart defaults:
- Searches ~/Downloads for latest CSVs
- Outputs to ~/Desktop
- Opens browser automatically
Custom Directories
python tools/visualize.py --directory ~/custom/downloads
python tools/visualize.py --output ~/Documents/portfolio-reports
python tools/visualize.py \
--directory ~/data/broker-exports \
--output ~/portfolio-analysis
Quiet Mode
python tools/visualize.py --quiet
python tools/visualize.py --quiet --no-browser
Skip Browser
python tools/visualize.py --no-browser
Command-Line Options
| Option | Default | Description |
|---|
--directory | ~/Downloads | Directory to search for CSV files |
--output | ~/Desktop | Directory to save plots and reports |
--no-browser | False | Don't open browser automatically |
--quiet | False | Minimal console output |
Output Files
All files are saved to the output directory (default: ~/Desktop):
plots.html
- Contains all visualizations as embedded images
- Self-contained HTML file
- Opens automatically in browser
- Can be emailed or archived
expiring_options.csv
- Options expiring in next 90 days
- Columns: ticker, strike, options_type, expiration, days_to_expiry, bucket
- Buckets: Today, Less Than a Week, Less Than a Month, Less Than a Quarter
Console Output Example
Finding latest portfolio files...
✓ Fidelity: Portfolio_Positions_Jan-04-2026.csv (modified 2026-01-04 14:30)
✓ Tastytrade: tastytrade_positions_x5WY76408_260104.csv (modified 2026-01-04 14:32)
Processing portfolio data...
✓ Parsed 42 stock positions
✓ Parsed 64 options positions
✓ Detected 7 synthetic long positions
✓ Harmonized data across brokers
Generating visualizations...
✓ Current value plots
✓ Portfolio allocation charts
✓ Options exposure by ticker (12 tickers)
✓ Expiration report
Output saved to: /Users/username/Desktop/
- plots.html
- expiring_options.csv
Opening plots in web browser...
✓ Complete!
Error Handling
No CSV files found:
ERROR: No portfolio CSV files found in ~/Downloads
Please download your portfolio files:
- Fidelity: Account Positions → Download CSV
- Tastytrade: Positions → Export CSV
Then try again.
Only one CSV found:
WARNING: Only Fidelity CSV found. Tastytrade CSV missing.
Proceeding with Fidelity data only...
CSV parsing error:
ERROR: Failed to parse Fidelity CSV
Details: [error message]
Please ensure the CSV is a valid Fidelity portfolio export.
Integration with Other Skills
With find-latest-portfolio
This skill uses find-latest-portfolio internally. You can also use them together:
cd .claude/skills/find-latest-portfolio
python tools/file_finder.py
cd ../visualize-portfolio
python tools/visualize.py
With portfolio-analyzer
For deeper analysis beyond visualization:
python .claude/skills/visualize-portfolio/tools/visualize.py
With pine-script-generator
After visualizing, generate Pine scripts:
python .claude/skills/visualize-portfolio/tools/visualize.py
bash bin/generate_pine_list.sh
Common Scenarios
Daily Portfolio Check
python .claude/skills/visualize-portfolio/tools/visualize.py --quiet
Before Market Open
python .claude/skills/visualize-portfolio/tools/visualize.py
Archive Portfolio Snapshot
OUTPUT_DIR=~/portfolio-snapshots/$(date +%Y-%m-%d)
mkdir -p "$OUTPUT_DIR"
python .claude/skills/visualize-portfolio/tools/visualize.py --output "$OUTPUT_DIR"
Weekly Portfolio Review
python .claude/skills/visualize-portfolio/tools/visualize.py
Troubleshooting
Browser doesn't open:
- Check that you have a default browser configured
- Use
--no-browser flag and open plots.html manually
- Check console for error messages
Old CSV files being used:
- Download fresh CSVs from your brokers
- CSVs in ~/Downloads are sorted by modification time
- The most recently modified file is used
Plots look wrong:
- Verify CSV files are from correct date
- Check that CSVs are complete (not truncated downloads)
- Ensure CSVs are in expected format (Fidelity/Tastytrade standard exports)
Missing positions:
- Check both broker CSVs were found
- Review console output for parsing warnings
- Verify positions exist in the source CSV files
Synthetic positions not detected:
- Requires matching Long Call + Short Put
- Same ticker, strike, and expiration
- If quantities don't match, only partial synthetic is created
Technical Details
Dependencies:
- Uses
find_latest_files() from find-latest-portfolio skill
- Uses
harmonize_and_store() from UpdatePositionCSVs
- Uses
process_synthetics() for SYN_LONG detection
- Uses
PlotPositions class for all visualizations
- Uses
yfinance for current stock prices on expiry plots
Processing Steps:
- File discovery via find_latest_files()
- CSV parsing via FidelityParser and TastytradeParser
- Data harmonization and value calculations
- Synthetic position detection
- Visualization generation (matplotlib → base64 → HTML)
- Browser launch via webbrowser module
Configuration:
- Colors and styling from
config/visualization.json
- Current price line can be disabled in visualization.json
- Column mapping from
config/harmonization.json
Tips and Best Practices
- Download CSVs regularly - More frequent data = better analysis
- Check expiring_options.csv - Plan ahead for upcoming expirations
- Review synthetic positions - Verify LC+SP pairs are correctly identified
- Use quiet mode for automation - Add to scripts or cron jobs
- Archive important snapshots - Save plots for historical reference
- Keep CSVs fresh - Latest data provides most accurate analysis
See Also