{% extends "base.html" %} {% from "_macros.html" import money, help, year_picker %} {% block title %}Investments{% endblock %} {% block content %}

Investments

Shares are matched first-in, first-out within each account. Wash sales are detected across all your accounts.

{{ year_picker(years, year, 'main.investments_page') }}
{% for w in res.warnings %}
{{ w }}
{% endfor %}
{% for term, label in [('short', 'Short-term'), ('long', 'Long-term')] %} {{ gains.sums[term].gain|money }} {{ label }} realized gain/loss in {{ year }} Proceeds {{ gains.sums[term].proceeds|money }} · Basis {{ gains.sums[term].basis|money }} {% endfor %} {{ gains.wash_count }} wash sale{{ 's' if gains.wash_count != 1 }} in {{ year }} Form 8949 detail →

Current holdings (cost basis)

{% if res.holdings %} {% for h in res.holdings %} {% endfor %}
SymbolAccountSharesCost basisAvg costOldest lot
{{ h.symbol }} {{ acct_names.get(h.account_id, '') }} {{ h.quantity|qty }} {{ h.basis_cents|money }} {{ ((h.basis_cents / h.quantity)|round|int)|money if h.quantity else '' }} {{ h.lots[0].acquired.isoformat()|usdate }}{% if h.lots|length > 1 %} ({{ h.lots|length }} lots){% endif %}

Compare share counts with your brokerage statement. Missing shares usually mean a buy from before you started — add it below.

{% else %}

No open positions.

{% endif %}

Add a trade

{% if not brokerages %}

Add a brokerage account first.

{% else %}
{% endif %}

Trades{% if symbol %} — {{ symbol }} (show all){% endif %}

{% for t in trades %} {% else %} {% endfor %}
DateAccountActionSymbolSharesPriceFeesTotal
{{ t.trade_date|usdate }} {{ t.account }} {{ t.action }} {{ t.symbol }}
{{ t.description }}
{{ t.quantity|qty }} {{ '%.4f'|format(t.price)|replace('.0000', '.00') if t.price else '' }} {{ t.fees_cents|money(true) }} {{ t.amount_cents|money }} Edit
No trades yet. Import a brokerage download (QFX/OFX or CSV) or add trades above.
{% endblock %}