Saltar a contenido

Portfolio reconciliation — wiki vs RACIONAL

Sin API, el wiki no sabe si RACIONAL ejecutó lo que el Execution Agent "ejecutó". Necesitamos una verificación periódica. Resuelve PP-02.

El problema

El sistema mantiene memory/positions.md como su versión del portfolio. RACIONAL mantiene su propia versión. Divergencias posibles:

  1. User no ejecutó una orden que aprobó (HITL fase).
  2. Broker rechazó orden por margin/liquidez silently.
  3. Slippage movió el fill price (esperado, small).
  4. Dividend o split cambió cantidad de shares sin que el sistema lo vea.
  5. Chrome automation falló mid-flow (fase 2/3).

Sin reconciliación, el sistema opera con un modelo incorrecto → decisiones malas.

Schema de memory/positions.md

---
type: positions
updated: 2026-04-19T15:30:00Z
total_value_usd: 12,450.00
---

| Ticker | Qty | Avg cost | Current price | Value USD | % portfolio |
|---|---|---|---|---|---|
| AAPL | 10 | 192.47 | 198.30 | 1,983.00 | 15.9% |
| MSFT | 5 | 425.10 | 438.20 | 2,191.00 | 17.6% |
| ... |

## Reconciliación más reciente
- Fecha: 2026-04-18
- Fuente: RACIONAL statement CSV descargado manualmente.
- Divergencias: 0.

Flujo de reconciliación

Daily (automatic-ish)

  1. Al cierre de mercado (Daily monitor routine @ 15:05 CT):
  2. Fetch price actual de cada holding via yfinance.
  3. Recalcular Current price y Value USD en positions.md.
  4. Calcular drawdown total del experimento.
  5. Si drawdown > threshold → notify (ver concepts/trading-guardrails).

No reconcilia cantidades contra RACIONAL — solo actualiza valores.

Weekly (semi-manual)

Viernes 17:00 CT, el Weekly Review routine:

  1. Recordatorio al user: "Descarga el statement semanal de RACIONAL UI".
  2. User pega o sube el CSV/PDF a raw/reconciliation/<YYYY-MM-DD>.csv.
  3. Parser script compara:
  4. Cantidades shares por ticker.
  5. Cash balance.
  6. Dividendos recibidos.
  7. Trades ejecutados vs trade-log.md.
  8. Si divergencias → alertar + NO operar hasta resolver.

Monthly (full audit)

Primer día del mes:

  1. Full download de statement mensual RACIONAL.
  2. Reconciliación completa con transaction-level detail.
  3. Export a formato contador (CSV con columnas: fecha, ticker, action, qty, price, fees, realized_gain).
  4. Export de memory/tax-log.md para SII Chile F22 anual.

Script de reconciliación

def reconcile(wiki_positions, racional_statement):
    divergences = []
    wiki_dict = {p.ticker: p.qty for p in wiki_positions}
    racional_dict = parse_racional_csv(racional_statement)

    all_tickers = set(wiki_dict) | set(racional_dict)
    for t in all_tickers:
        wiki_qty = wiki_dict.get(t, 0)
        rac_qty = racional_dict.get(t, 0)
        if abs(wiki_qty - rac_qty) > 0:  # different by >0 shares
            divergences.append({
                "ticker": t,
                "wiki": wiki_qty,
                "racional": rac_qty,
                "diff": rac_qty - wiki_qty
            })
    return divergences

Resolución de divergencias

Caso Acción
Wiki tiene, RACIONAL no Orden no ejecutada o rechazada. Remover de wiki, investigar logs.
RACIONAL tiene, Wiki no User compró manual o dividendos en acciones. Agregar a wiki.
Cantidades distintas Split, partial fill, o bug. Investigar trade log + compare fechas.
Cash divergente Fee, dividend cash, o FX. Normalmente minor — aceptar si <$1.

Qué NO hacer

  • Nunca overwrite wiki positions desde RACIONAL sin investigar la causa. Quita audit trail.
  • Nunca operar con divergencias unresolved. Perder 1 día de signal es mejor que operar con modelo erróneo.

Gaps

  • Automatizar parse del CSV de RACIONAL — depende del formato exacto que exponga. Pendiente user share de muestra.
  • Chrome automation para descargar statement automáticamente (post-MVP).
  • Handling de currency conversions (cada deposit CLP→USD triggea reconciliación adicional).

Relaciones