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:
- User no ejecutó una orden que aprobó (HITL fase).
- Broker rechazó orden por margin/liquidez silently.
- Slippage movió el fill price (esperado, small).
- Dividend o split cambió cantidad de shares sin que el sistema lo vea.
- 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)¶
- Al cierre de mercado (Daily monitor routine @ 15:05 CT):
- Fetch price actual de cada holding via yfinance.
- Recalcular
Current priceyValue USDenpositions.md. - Calcular drawdown total del experimento.
- 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:
- Recordatorio al user: "Descarga el statement semanal de RACIONAL UI".
- User pega o sube el CSV/PDF a
raw/reconciliation/<YYYY-MM-DD>.csv. - Parser script compara:
- Cantidades shares por ticker.
- Cash balance.
- Dividendos recibidos.
- Trades ejecutados vs
trade-log.md. - Si divergencias → alertar + NO operar hasta resolver.
Monthly (full audit)¶
Primer día del mes:
- Full download de statement mensual RACIONAL.
- Reconciliación completa con transaction-level detail.
- Export a formato contador (CSV con columnas: fecha, ticker, action, qty, price, fees, realized_gain).
- Export de
memory/tax-log.mdpara 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¶
- Resuelve: PP-02.
- Usado por: concepts/agent-prompts (Execution Agent + weekly review routine).
- Relacionado con: concepts/chile-us-tax-regime (tax-log export), analysis/adapting-broker-without-api.