# Estudio 01 · Cruce de EMA 9/20 en EUR/USD diario

Estudio reproducible, con protocolo pre-registrado, sobre una estrategia pública: el cruce de medias móviles exponenciales de 9 y 20 periodos aplicado a la serie diaria EUR/USD de la publicación H.10 de la Reserva Federal, de 1999-01-04 a 2026-09-30.

Este estudio no es un certificado ni usa el puntaje de la plataforma TRAVIDENCE. Usa únicamente reglas, datos y métricas públicos, y su código no usa ningún componente de la plataforma.

## Qué hay en esta carpeta

| Ruta | Contenido |
|---|---|
| `protocolo-v0_4.md` | El protocolo registrado, copia byte a byte (sha256 `ed02a661f8083632137b667f17e3bc4d92121bad356fe413fde356cbb12e22e1`) |
| `data/` | Los cinco archivos de datos tal como se descargaron, `SHA256SUMS`, `download-log.json` y el anexo de datos |
| `download.py` | Descarga y congelado de los cinco archivos (el único módulo del estudio con acceso a la red) |
| `annex_counts.py` | Conteos de solo lectura sobre los archivos congelados, usados en el anexo de datos |
| `run_study.py` | Comando único del estudio: comprueba las seis huellas (cinco archivos de `data/` y el anexo), corre el estudio y escribe `outputs/` |
| `estudio01/` | Módulos del estudio: lectura de datos, motor y métricas |
| `tests/` | Pruebas con datos sintéticos (ninguna lee `data/`) |
| `requirements.lock` | Versiones fijadas de las dependencias |
| `outputs/` | Resultados de la corrida sobre los datos congelados: tablas, curvas de capital, `run-log.json` y la bitácora de intentos (`bitacora.md`, que `run_study.py` no escribe) |

Están publicados los datos congelados, su anexo, el código del estudio (`run_study.py` y `estudio01/`), las pruebas con datos sintéticos (`tests/`) y las versiones fijadas de las dependencias (`requirements.lock`). Los resultados sobre los datos reales están en `outputs/` (corrida del 2026-10-29).

## Verificar los datos

```bash
cd data && shasum -a 256 -c SHA256SUMS
```

Debe imprimir `OK` en los cinco archivos. Los archivos se guardan sin ninguna modificación, con sus saltos de línea CRLF, su BOM y su falta de salto final tal como llegaron. Por eso `.gitattributes` los marca como `-text` y los controles de formato del repositorio no los tocan.

## Datos y fuentes

| Nº | Archivo | Fuente |
|---|---|---|
| 1 | `data/01-h10-daily-rates.csv` | Board of Governors of the Federal Reserve System, H.10 Foreign Exchange Rates (Data Download Program, serie del euro) |
| 2 | `data/02-h10-hist-euro.htm` | Board of Governors of the Federal Reserve System, página histórica del euro de la H.10 (solo control de igualdad) |
| 3 | `data/03-fomc-openmarket.htm` | Board of Governors of the Federal Reserve System, Open Market Operations |
| 4 | `data/04-fomc-openmarket-archive.htm` | Board of Governors of the Federal Reserve System, Open Market Operations Archive |
| 5 | `data/05-ecb-dfr.csv` | European Central Bank, ECB Data Portal, tasa de la facilidad de depósito |

El anexo de datos (`data/anexo-datos-2026-10-22.md`) da la URL exacta, la fecha y hora de descarga, los bytes y el sha256 de cada archivo, los conteos de barras y las anomalías.

Recibo OpenTimestamps del anexo: data/anexo-datos-2026-10-22.md.ots (upgrade completado el 2026-10-23: `ots upgrade` responde «Timestamp complete»; verificable con `ots verify` o en opentimestamps.org).

Sello público del anexo: https://x.com/_ignacioarias/status/2113688830872035442 (2026-10-23T17:47:42Z).

## Descarga

`download.py` hace una sola petición por URL y guarda cada cuerpo sin modificarlo. Si cualquier petición falla, se detiene sin escribir ningún archivo de datos y deja el intento en `data/download-log.json`. Si los archivos ya existen, se niega a correr: los datos se descargan una sola vez.

## Reproducción del estudio

El protocolo (§8) fija que un solo comando verifica las huellas, corre el estudio y escribe las métricas. Ese comando es `python -B run_study.py`, desde esta carpeta (opciones en `python -B run_study.py --help`). Antes de interpretar nada comprueba el sha256 de los cinco archivos de `data/` y del anexo; si alguna huella no coincide, se detiene con el código de salida 4 (`EXIT_CHECKSUM`) y no escribe nada en `outputs/`. Las versiones exactas de las dependencias están en `requirements.lock`.

## Corrida y ventana evaluada

Corrida de las cuatro variantes, la referencia, los tres escenarios de costos y las corridas de atribución sobre los datos congelados. Hora anotada en `outputs/run-log.json` (`run_utc`): 2026-10-29T15:39:49Z.

- Barras de la serie del euro: 6,958. Las barras 1 a 1,000 son de calentamiento.
- Ventana evaluada: primer retorno el 2002-12-24, último retorno el 2026-09-30; T = 5,958 retornos.
- Entorno: Python 3.11.15 y numpy 2.4.6. El código usa solo la biblioteca estándar de Python y numpy; `requirements.lock` fija también pandas 3.0.3 porque el protocolo (§8) lo prevé, pero el código no lo importa. Al instalar `requirements.lock`, pip añade python-dateutil 3.0.0, six 1.17.0 y tzdata 2026.6 (dependencias de pandas, sin fijar), que el código tampoco importa.

## Reproducción byte a byte de la corrida del 2026-10-29

Desde una copia de esta carpeta sin `outputs/` y con las versiones de arriba:

```bash
python -B run_study.py --run-utc 2026-10-29T15:39:49Z
```

Con esa hora, los 21 archivos que escribe `run_study.py` salen idénticos byte a byte a los de `outputs/`, como se comprobó el 2026-10-29 en dos sistemas: un entorno limpio en macOS y una segunda máquina Linux x86_64, ambos con Python 3.11.15 y `requirements.lock`. `bitacora.md` no entra en la comparación porque el comando no la escribe. Si `outputs/` ya existe con algo más que las dos tablas derivadas, el comando se detiene con el código de salida 3 y no escribe nada.

## Huellas sha256

| Archivo | sha256 |
|---|---|
| `data/01-h10-daily-rates.csv` | `cb124b7f38f679860fdfda908f3dd395608753a7c7abbdfbe6c770e1f07c58e3` |
| `data/02-h10-hist-euro.htm` | `7505bd36c3ee64ab1415120e334b845840ae771a230a3e4d6924ef457a9458fc` |
| `data/03-fomc-openmarket.htm` | `0a08eb31c7b7c0b6ad9e0947bf0c12722ca19d1d803d1ed0a482698bf27bd9ab` |
| `data/04-fomc-openmarket-archive.htm` | `0f2b1b361bc6d197a378cc6ff8b62fea8cf1f0992e8dcfe93f3e059cca4833ff` |
| `data/05-ecb-dfr.csv` | `3b8163aa7331ea6fc41fbf8dbb9833de64b40f6cec4977efbb9bac834b7946af` |
| `data/anexo-datos-2026-10-22.md` | `debb30d7ae5960c6d0859d25309e058c253c72e3fed2d90aee29c0b447528a0f` |
| `run_study.py` | `98901fad65c2e8fb49d62aa47db34b732d4c38ed7585768bc1c9173cd417f0d6` |
| `requirements.lock` | `b883865636ee3268395c9669ad793410eae6dc3ce29260dba2f3979e0a66fcfa` |
| `estudio01/__init__.py` | `b1e3dcbe9f7840ce2939ec2ab5f52f2100949aed60644e1a6e45be67322524f6` |
| `estudio01/data_h10.py` | `353382b74b49b8434a7bd87f051638a383ee0e8251415f9d798db379d02eaa29` |
| `estudio01/engine.py` | `89b87210f41f5c19a9e51942221cdc81391e5dc3731a2e5133d9146070395c83` |
| `estudio01/metrics.py` | `9082ad2a849b333124faa89bb0f3283f74ed7761efc226c7cecc8173083b6b6c` |
| `estudio01/rates.py` | `ea47d4ce83ccb2dcdade09c0324df23899b8d74b7e3d64f6f6c3948a7f47113e` |
| `estudio01/report.py` | `dd0a99603773809c6fa6534dd53b0bcefc12d4e0cbfa7b75b17454fbe8c45c61` |
| `outputs/atribucion.csv` | `f5b9ea5427d60d56a682b3eb9450baa6416d90891eaeca61f9fe9b48e9a1fc2e` |
| `outputs/bitacora.md` (de redacción manual) | `59a6e8b96b0b682605dc729b18c54465667abf4da51dceeb84b5802d20ed1192` |
| `outputs/dsr.csv` | `f6ae6a94ccacb3fee3771f42152b2e8e8eeaf6e871d2e60ccd40ea24b9de54d5` |
| `outputs/ecb-dfr.csv` | `9296a31dec6ba6ee086ae0ca553166bab582e35dcba5b6696384b1112a7838fe` |
| `outputs/equity-v1-base.csv` | `08192262c695e6f077a391ef2519cd2ccfab2d0e42d52da69be7d75f713cd594` |
| `outputs/equity-v1-high.csv` | `4744b17b37a84d770fa74d1468104df05b0ef7c4c632621b8505b629502dd162` |
| `outputs/equity-v1-low.csv` | `6d86c1c7acdc2c36496965cfecb4c4cbad185f65ec06ce9486b0de51323b45c0` |
| `outputs/equity-v2-base.csv` | `be2af6a2b9673c2dc858396ea8690db70a7f20545659845344439e7336d7d7da` |
| `outputs/equity-v2-high.csv` | `f946b763d25a29f35f904c5c6e871b85bd1aa802d3c20405c7cd4d06aa0400a2` |
| `outputs/equity-v2-low.csv` | `6f04dfd70f771fab026d1634a0aca6b6084a80e46ec925f663bc4b435cf24529` |
| `outputs/equity-v3-base.csv` | `4e4893160beb203998b21322cd260f5f6435b6cb809f25b045aeed91777165dd` |
| `outputs/equity-v3-high.csv` | `f2236f3c659ce8c125f5af3036c75c738722d0a34de4d9b31fab052bd85511d6` |
| `outputs/equity-v3-low.csv` | `24047e5e56b2667402f63d22fcf132b9f5ae4499f268c5209613e97c7dcce88c` |
| `outputs/equity-v4-base.csv` | `34bfd9b5a7091fe06d6d377c2cdc49c05e85ad186070263c23744b681b5f0f48` |
| `outputs/equity-v4-high.csv` | `16684c1157c456dad9481d876de6ae7234beda57286a5016e0422fc070a8bed4` |
| `outputs/equity-v4-low.csv` | `0212979a1eb6af0608356bcdc2b9da32a6ca5d7671ee7ee5652a930a94c9f8bd` |
| `outputs/fomc-decisiones.csv` | `c352e31b99b9e138d330cc1469265c2e76d384bc694084054a90f266ca890794` |
| `outputs/metrics.csv` | `1b353a00811b548475634b88f818ca893832ba5a9e695f1a363e36b94d410445` |
| `outputs/pbo.csv` | `019ae64faa91734a296c202d53c6f488b83b14e9f5bffc35fe1ecab2267bcd1e` |
| `outputs/referencia.csv` | `11a7035b36e10664822c4dc07e83af704919fbee257a3d3f3deec0391a10ccf9` |
| `outputs/run-log.json` | `3adb49bcc5917f79b54d34eaaca9ff7c1235b4df0158cecc006370e7f64de694` |
| `outputs/tramo-final.csv` | `13228f8184112fefd7c3190b3b2181b2a194b7aac591634d99984e9ed2694bcf` |

## Citas

- «Source: Board of Governors of the Federal Reserve System, H.10 Foreign Exchange Rates»
- «Source: Board of Governors of the Federal Reserve System, Open Market Operations»
- «Source: ECB statistics»
