Portfolio-wide ROI metrics, base-currency converted, built explicitly
by get_portfolio_summary() (no from_attributes – not a direct ORM
row). Money fields are base-currency decimal strings; percentages are
plain floats rounded to 2 places. total_cost/total_value/
unrealized_gain are pure price-performance sums (cost and value both
priced at each holding’s historical FX rate); total_fx_gain is the
separate currency-timing sum; total_return is unrealized_gain plus
total_dividends. total_cost includes each holding’s fee, and the
percentages divide by it.