
Margin Management
- 29 installs
- 316 repo stars
- Updated August 1, 2026
- aojdevstudio/finance-guru
margin-management is a skill that updates a Margin Dashboard with live balance data and calculates margin-living strategy metrics like coverage ratios and safety thresholds.
About
A skill that manages a margin-living strategy by tracking margin balances, interest costs, dividend coverage ratios, and portfolio-to-margin safety thresholds. It pulls live balances from SnapTrade, derives interest and coverage metrics at runtime, alerts on large draws, and updates a Margin Dashboard with time-based scaling notes. A developer uses it to monitor margin safety and get scaling recommendations.
- Tracks margin balances, interest costs, and dividend coverage ratios
- Pulls live balances from SnapTrade and derives metrics at runtime
- Triggers safety alerts on large margin draws and scaling thresholds
Margin Management by the numbers
- 29 all-time installs (skills.sh)
- Ranked #667 of 1,106 Finance & Trading skills by installs in the Skillselion catalog
- Data as of Aug 2, 2026 (Skillselion catalog sync)
margin-management capabilities & compatibility
Requires SnapTrade API keys and strategy .env values; SnapTrade account access needed for live balances.
- Capabilities
- data analysis
- Use cases
- trading · data analysis
- Runs
- Runs locally
- Pricing
- Bring your own API key
What margin-management says it does
Monitor and manage margin-living strategy by tracking margin balances, interest costs, dividend coverage ratios, and portfolio-to-margin safety thresholds.
If new margin balance > previous balance + ${FG_MARGIN_JUMP_ALERT_THRESHOLD}, **STOP**
npx skills add https://github.com/aojdevstudio/finance-guru --skill margin-managementAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 29 |
|---|---|
| repo stars | ★ 316 |
| Last updated | August 1, 2026 |
| Repository | aojdevstudio/finance-guru ↗ |
What it does
Track margin balances, interest, and coverage ratios from live SnapTrade data with safety alerts and scaling notes.
Who is it for?
Monitoring margin balance, interest cost, and dividend coverage ratio with safety alerts.
Skip if: Executing trades or moving money; it monitors and recommends only.
When should I use this skill?
When updating margin balances, calculating coverage ratio, or assessing margin scaling decisions.
What you get
An updated Margin Dashboard with coverage ratio, interest cost, safety alerts, and scaling recommendations.
- Updated Margin Dashboard entry
- coverage ratio
- safety alert
By the numbers
- margin call threshold at 3:1 ratio
- coverage ratio = dividends divided by interest
Files
Margin Management
Purpose
Monitor and manage margin-living strategy by tracking margin balances, interest costs, dividend coverage ratios, and portfolio-to-margin safety thresholds. Provides data-driven scaling recommendations based on strategy milestones.
When to Use
Use this skill when:
- Syncing live margin balances from SnapTrade
- Updating margin balance or interest rate
- Calculating coverage ratio (dividends ÷ interest)
- User mentions: "margin dashboard", "margin balance", "coverage ratio", "margin strategy"
- Assessing margin scaling decisions
- Checking safety thresholds
Personal Strategy Inputs
Static private assumptions come from .env (see .env.example). Current portfolio facts come from SnapTrade (live) by default, then src/analysis/margin_metrics.py derives ratios/costs at runtime. Do not hardcode personal numbers in this skill. The legacy Fidelity balances CSV is a fallback only (--source csv).
Required .env values
FG_STRATEGY_START_DATEFG_MARGIN_INTEREST_RATE,FG_MARGIN_INTEREST_RATE_DECIMALFG_MARGIN_JUMP_ALERT_THRESHOLDFG_CURRENT_MONTHLY_DRAW,FG_MONTH6_DRAW_TARGET,FG_MONTH12_DRAW_TARGET,FG_MONTH18_DRAW_TARGETFG_BUSINESS_INCOME_MONTHLY,FG_BUSINESS_INJECTION_RED,FG_BUSINESS_INJECTION_CRITICAL- Live facts are not
.envvalues: portfolio value, margin balance, interest cost, dividend income, coverage ratio, and portfolio-to-margin ratio must be read/calculated at runtime.
Core Workflow
1. Read Live Margin Balances (SnapTrade)
Use uv run python -m src.analysis.margin_metrics --pretty to load .env, pull live balances from the enabled+routed SnapTrade account, and emit current JSON metrics. (Add --source csv to fall back to the latest Balances_for_Account_*.csv if SnapTrade is unavailable.)
Source: SnapTrade account in config/snaptrade-accounts.yaml (enabled: true, role set). Requires SNAPTRADE_* keys in .env.
Key JSON fields the tool emits:
portfolio_value→ net account equity (SnapTradeaccount_equity) → Portfolio Valuemargin_balance→ derived margin debt (gross market value − net equity) → Margin Balancemonthly_interest_cost→ Balance × Rate ÷ 12 (the primary interest figure)margin_interest_accrued_this_month→ null under SnapTrade (not exposed; only present via--source csv)
Calculations:
- Margin Balance: Derived margin debt = {live.margin_balance} (tracks Fidelity "Net debit" within ~0.1%)
- Interest Rate: Default ${FG_MARGIN_INTEREST_RATE} (Fidelity $1k-$24.9k tier) unless specified
- Monthly Interest Cost: Balance × Rate ÷ 12 = {live.margin_balance} × ${FG_MARGIN_INTEREST_RATE_DECIMAL} ÷ 12 = {derived.monthly_interest_cost}
2. Safety Check: Margin Jump Alert
Rule: If new margin balance > previous balance + ${FG_MARGIN_JUMP_ALERT_THRESHOLD}, STOP
Reason: Large draws should be intentional per margin-living strategy
Example:
Previous: {live.margin_balance}
Current: {example.margin_current} (+{derived.margin_increase}) → 🚨 ALERT - Confirm intentional drawAction:
- Alert user immediately
- Show diff: "Margin increased by {derived.margin_increase} - Confirm this was intentional"
- Wait for user confirmation before proceeding
3. Add Entry to Margin Dashboard
Insert new row with:
- Date: Current date (use
date +"%Y-%m-%d") - Margin Balance: From Balances CSV (Net debit absolute value)
- Interest Rate: ${FG_MARGIN_INTEREST_RATE} (or updated rate from CSV if available)
- Monthly Interest Cost: Calculate (Balance × Rate ÷ 12)
- Notes: Auto-generate based on elapsed time since ${FG_STRATEGY_START_DATE}
Example Entry:
Date: {today}
Margin Balance: {live.margin_balance}
Interest Rate: ${FG_MARGIN_INTEREST_RATE}
Monthly Interest Cost: {derived.monthly_interest_cost}
Notes: Month 1 - Building foundation, on track per strategyNotes Generation Logic:
import os
from datetime import datetime
months_elapsed = (current_date - datetime.fromisoformat(os.getenv("FG_STRATEGY_START_DATE"))).days // 30
if months_elapsed < 6:
note = f"Month {months_elapsed} - Building foundation, on track per strategy"
elif months_elapsed < 12:
note = f"Month {months_elapsed} - Approaching Month 6 milestone"
elif months_elapsed < 18:
note = f"Month {months_elapsed} - Approaching break-even milestone"
else:
note = f"Month {months_elapsed} - Mature strategy, monitor scaling"4. Update Summary Section
Recalculate Dashboard Metrics:
Current Margin Balance
= Latest entry from Margin Dashboard
Example: {live.margin_balance}Monthly Interest Cost
= Latest calculated cost
Example: {derived.monthly_interest_cost}/monthAnnual Interest Cost
= Monthly Interest Cost × 12
Example: {derived.monthly_interest_cost} × 12 = {derived.annual_interest_cost}/yearDividend Income (from Dividend Tracker)
= Pull from Dividend Tracker "TOTAL EXPECTED DIVIDENDS"
Example: {live.monthly_dividend_income}/monthCoverage Ratio
= Dividend Income ÷ Monthly Interest Cost
Formula: =IFERROR(Dividends / Interest, 0)
Example: {live.monthly_dividend_income} ÷ {derived.monthly_interest_cost} = {derived.coverage_ratio} 🟢Fix #DIV/0! if margin balance = $0:
Before: =B10 / B11 (causes #DIV/0! when margin = 0)
After: =IFERROR(B10 / B11, 0) (returns 0 when no margin)5. Calculate Strategy Metrics
Portfolio-to-Margin Ratio
= Total account value ÷ Margin Balance
Example: {live.portfolio_value} ÷ {live.margin_balance} = {derived.portfolio_margin_ratio} 🟢🟢🟢Safety Thresholds:
- 🟢 Green: Ratio > 4.0:1 (target - healthy margin usage)
- 🟡 Yellow: Ratio 3.5-4.0:1 (warning - pause scaling)
- 🔴 Red: Ratio < 3.0:1 (alert - stop draws, inject business income)
- ⚫ Critical: Ratio < 2.5:1 (emergency - inject ${FG_BUSINESS_INJECTION_CRITICAL}, consider selling)
Current Draw vs Fixed Expenses
Current monthly draw: ${FG_CURRENT_MONTHLY_DRAW} (fixed expenses only)
Target: Start with ${FG_CURRENT_MONTHLY_DRAW}, scale to ${FG_MONTH6_DRAW_TARGET}, ${FG_MONTH12_DRAW_TARGET}, ${FG_MONTH18_DRAW_TARGET} based on data6. Scaling Alerts (Time-Based)
Strategy Start Date: ${FG_STRATEGY_START_DATE}
Calculate months elapsed:
import os
from datetime import datetime
start = datetime.fromisoformat(os.getenv("FG_STRATEGY_START_DATE"))
current = datetime.now()
months_elapsed = (current - start).days // 30Month 6 Alert
📊 MONTH 6 MILESTONE CHECK:
✅ Dividends: {live.monthly_dividend_income}/month (need ${FG_MONTH6_DIVIDEND_MINIMUM})
✅ Portfolio-to-Margin Ratio: {derived.portfolio_margin_ratio} (need 4:1+)
✅ Dividend Growth: On track
🎯 RECOMMENDATION: Scale margin draw to ${FG_MONTH6_DRAW_TARGET}/month (add mortgage)
- Current: ${FG_CURRENT_MONTHLY_DRAW} (fixed expenses only)
- New: ${FG_MONTH6_DRAW_TARGET} (fixed + mortgage)
- Safety margin: ExcellentMonth 12 Alert
📊 MONTH 12 BREAK-EVEN CHECK:
Expected Dividends: ${FG_MONTH12_DIVIDEND_TARGET}/month (goal: break-even with margin interest)
✅ IF achieved: Consider scaling to ${FG_MONTH12_DRAW_TARGET}/month (add some variable expenses)
⚠️ IF not: Hold at ${FG_MONTH6_DRAW_TARGET}, assess strategyMonth 18 Alert
📊 MONTH 18 MATURE STRATEGY CHECK:
Expected Dividends: ${FG_MONTH18_DIVIDEND_TARGET}/month
Expected Margin: Declining (dividends paying down debt)
✅ IF achieved: Consider scaling to ${FG_MONTH18_DRAW_TARGET}/month (most variable expenses)
⚠️ IF not: Hold current level, reassess timeline7. Alert Thresholds
Generate alerts based on conditions:
Green (Healthy)
✅ Ratio > 4:1 AND dividends covering interest
Status: On track, continue per strategyYellow (Caution)
⚠️ Ratio 3.5-4:1 OR dividend coverage declining
Action: Pause scaling, monitor weeklyRed (Alert)
🚨 Ratio < 3:1 OR dividend cuts detected
Action: STOP draws, inject ${FG_BUSINESS_INJECTION_RED} business incomeCritical (Emergency)
⛔ Ratio < 2.5:1 OR margin call risk
Action: STOP draws, inject ${FG_BUSINESS_INJECTION_CRITICAL} business income, consider selling hedge (SQQQ)Critical Rules
WRITABLE Columns (Margin Dashboard)
- ✅ Date (Column A)
- ✅ Margin Balance (Column B)
- ✅ Interest Rate (Column C)
- ✅ Monthly Interest Cost (Column D - calculated but writeable)
- ✅ Notes (Column E)
SACRED Formulas (NEVER TOUCH)
- ❌ Coverage Ratio (unless adding IFERROR wrapper)
- ❌ Summary section totals (unless fixing #DIV/0!)
Margin Strategy Philosophy
Core Principle: Confidence-based scaling, not time-based mandates
Decision Framework: 1. Data-driven: Decisions backed by actual dividend income, not projections 2. Safety-first: Never scale if ratio drops below 3.5:1 3. Business income as insurance: Available ${FG_BUSINESS_INCOME_MONTHLY}/month, not primary strategy 4. Monte Carlo backstop: ${FG_BUSINESS_BACKSTOP_PROBABILITY} of scenarios used business income at some point
Business Income Backstop
Available: ${FG_BUSINESS_INCOME_MONTHLY}/month from business operations
Usage Scenarios: 1. ⛔ Margin call (ratio < 3:1): MUST USE business income immediately 2. ⚠️ Market correction (20-30% drop): OPTIONAL - assess need 3. 🎯 Acceleration (reach FI faster): OPTIONAL - strategic choice
Current Philosophy: Insurance policy only, not active strategy component
Example Calculations
Scenario 1: Month 1 (Current State)
Portfolio Value: {live.portfolio_value}
Margin Balance: {live.margin_balance}
Ratio: {derived.portfolio_margin_ratio} 🟢🟢🟢
Monthly Interest: {derived.monthly_interest_cost}
Dividend Income: {live.monthly_dividend_income}
Coverage: {derived.coverage_ratio} 🟢
Status: Excellent - building foundationScenario 2: Month 6 (Projected)
Portfolio Value: {projection.month6_portfolio_value} (projected with W2 contributions)
Margin Balance: {projection.month6_margin_balance} (scaled to ${FG_MONTH6_DRAW_TARGET}/month draw)
Ratio: {projection.month6_portfolio_margin_ratio} 🟢
Monthly Interest: {projection.month6_monthly_interest_cost}
Dividend Income: ${FG_CURRENT_MONTHLY_DRAW} (projected)
Coverage: {projection.month6_coverage_ratio} 🟢
Status: Healthy - on track for break-evenScenario 3: Month 15 (Break-Even)
Portfolio Value: {projection.month15_portfolio_value}
Margin Balance: {projection.month15_margin_balance} (scaled to ${FG_MONTH12_DRAW_TARGET}/month draw)
Ratio: {projection.month15_portfolio_margin_ratio} 🟢
Monthly Interest: {projection.month15_monthly_interest_cost}
Dividend Income: {projection.month15_monthly_dividend_income}
Coverage: {projection.month15_coverage_ratio} 🟢
Status: Break-even achieved, dividends > interestGoogle Sheets Integration
Spreadsheet ID: Read from fin-guru/data/user-profile.yaml → google_sheets.portfolio_tracker.spreadsheet_id
Use the mcp__gdrive__sheets tool:
// STEP 1: Read Spreadsheet ID from user profile
// Load fin-guru/data/user-profile.yaml
// Extract: google_sheets.portfolio_tracker.spreadsheet_id
// STEP 2: Read Margin Dashboard
mcp__gdrive__sheets(
operation: "spreadsheets.values.get",
params: {
spreadsheetId: SPREADSHEET_ID, // from user-profile.yaml
range: "Margin Dashboard!A2:E50"
}
)
// STEP 3: Add new margin entry
mcp__gdrive__sheets(
operation: "spreadsheets.values.update",
params: {
spreadsheetId: SPREADSHEET_ID, // from user-profile.yaml
range: "Margin Dashboard!A2:E2",
valueInputOption: "USER_ENTERED",
requestBody: {
values: [[date, balance, rate, monthly_cost, notes]]
}
}
)Agent Permissions
Margin Specialist (Write-enabled):
- Can add new entries to Margin Dashboard
- Can update margin balance, rate, cost
- Can generate scaling alerts
- CANNOT modify summary formulas (without formula-protection skill)
Builder (Write-enabled):
- Can repair broken formulas (#DIV/0!)
- Can update summary section calculations
- Can add new metrics
All Other Agents (Read-only):
- Market Researcher, Quant Analyst, Strategy Advisor
- Can read margin data for analysis
- Cannot write to spreadsheet
- Must defer to Margin Specialist or Builder
Reference Files
For complete strategy details, see:
- Margin Strategy:
fin-guru-private/fin-guru/strategies/active/margin-living-master-strategy.md - Portfolio Strategy:
fin-guru-private/fin-guru/strategies/active/portfolio-master-strategy.md - User Profile:
fin-guru/data/user-profile.yaml - Spreadsheet Architecture:
fin-guru/data/spreadsheet-architecture.md
Pre-Flight Checklist
Before updating Margin Dashboard:
- [ ] SnapTrade account is enabled+routed in
config/snaptrade-accounts.yamlandSNAPTRADE_*keys are in.env - [ ] Margin Dashboard sheet exists in Google Sheets
- [ ] Previous margin balance known (for jump detection)
- [ ] Dividend Tracker is up-to-date (for coverage ratio)
- [ ] Current date retrieved via
datecommand
Example Scenario
Trigger: User asks to sync/refresh margin from SnapTrade
Agent workflow: 1. ✅ Pull live SnapTrade balances - Portfolio: {live.portfolio_value}, Margin: {live.margin_balance} 2. ✅ Safety check - Previous: $0, Current: {live.margin_balance} (+{live.margin_balance} < ${FG_MARGIN_JUMP_ALERT_THRESHOLD} threshold) - PASS 3. ✅ Calculate metrics:
- Monthly interest: {derived.monthly_interest_cost}
- Portfolio-to-margin ratio: {derived.portfolio_margin_ratio}
- Coverage ratio: {derived.coverage_ratio} (dividends ÷ interest)
4. ✅ Add entry to Margin Dashboard:
- Date: {today}
- Balance: {live.margin_balance}
- Rate: ${FG_MARGIN_INTEREST_RATE}
- Cost: {derived.monthly_interest_cost}
- Notes: "Month 1 - Building foundation, on track"
5. ✅ Update summary section:
- Current balance: {live.margin_balance}
- Monthly cost: {derived.monthly_interest_cost}
- Annual cost: {derived.annual_interest_cost}
- Dividend income: {live.monthly_dividend_income}
- Coverage: {derived.coverage_ratio}
6. ✅ Generate status: "🟢 Excellent health - Ratio {derived.portfolio_margin_ratio}, Coverage {derived.coverage_ratio}" 7. ✅ LOG: "Updated Margin Dashboard - Month 1, {live.margin_balance} balance, {derived.portfolio_margin_ratio} ratio"
---
Skill Type: Domain (workflow guidance) Enforcement: BLOCK (financial risk critical) Priority: Critical Line Count: < 400 (following 500-line rule) ✅
Related skills
FAQ
Where do live balances come from?
From a SnapTrade account by default via src.analysis.margin_metrics, with a legacy Fidelity balances CSV as a fallback.
How is coverage ratio calculated?
Dividend income divided by monthly interest cost, wrapped in IFERROR to return 0 when margin balance is 0.