Reference

Portfolio Builder

.md

A hidden robo-advisor mode that produces a full allocation plan from seven inputs. Click the Finny logo in the TUI to unlock it.

How to find it
Click the Finny logo to unlock the Portfolio Builder. It's intentionally off-the-main-flow — strategy generation is Finny's primary use case; this is the portfolio counterpart.

The seven inputs

ParameterOptions
Funds$1K – $250K
CurrencyCAD, USD, EUR
AccountTFSA, RRSP, Non-registered, Other
Horizon1y – 10y+
RiskConservative, Balanced, Growth, Aggressive
UniverseStocks, ETFs, Crypto, Bonds
GeographyGlobal, North America, Canada-heavy

What it outputs

A markdown allocation plan with two layers: a top-level sleeve breakdown (equities / fixed income / crypto / cash), then concrete tickers with weight, dollar amount, sector, region, and a short per-pick rationale.

TFSA-aware rules

US-listed equities
Flagged for the 15% withholding tax on dividends inside a TFSA — the Canada–US tax treaty doesn't apply.
US-listed REITs
Avoided in TFSAs — the full distribution is taxed as ordinary income at source.
No day-trading suggestions
Frequent intraday turnover inside a TFSA risks CRA reclassification as business income, defeating the tax shelter.
Contribution room mention
Recommendations call out the contribution-room concept so allocations stay within the user's available headroom.

Portfolio backtest

After the plan is delivered, the agent offers to backtest it. The finny_portfolio_backtest tool:

  • Accepts ticker + weight pairs (max 50 tickers, weights must sum to ~1.0).
  • Fetches historical prices via yfinance.
  • Auto-detects the listing currency per ticker (e.g. VFV.TO in CAD, VOO in USD).
  • Auto-FX-converts mixed-currency portfolios into the target currency before computing returns.
  • Simulates buy-and-hold or periodic rebalancing — none, monthly, quarterly, or yearly.
  • Returns CAGR, Sharpe, max drawdown, annualized vol, and per-ticker contribution + PnL.
  • Derives the annualization factor from the actual sampling frequency — 252 for equities, ~365 for crypto, blended for mixed.

Example payload

json
{
  "holdings": [
    {"ticker": "VFV.TO", "weight": 0.40},
    {"ticker": "XIC.TO", "weight": 0.20},
    {"ticker": "VEE.TO", "weight": 0.15},
    {"ticker": "BTC-USD", "weight": 0.10},
    {"ticker": "ZAG.TO", "weight": 0.15}
  ],
  "target_currency": "CAD",
  "start": "2020-01-01",
  "end": "2025-01-01",
  "rebalance": "quarterly"
}