Downloads · 30 days
0
andres31416/pen-usd-trading-model
pen-usd-trading-model is a time series forecasting model from andres31416. Use it for the time series forecasting task on the model card, and read the license before you ship it in a product. The card lists the license as mit.
Modelo Transformer (arquitectura tipo PatchTST) para forecasting del tipo de cambio Sol Peruano (PEN) / Dolar Americano (USD), con una capa de reglas que convierte la prediccion en señales de trading: COMPRAR / VENDER…
Downloads · 30 days
0
Access
Public
Updated Jul 25, 2026
Repo size
4.6 MB
Likes
1
Public
Click a slice to open those files.
.pt4.6 MB · 99%
From the Hugging Face model README
Modelo Transformer (arquitectura tipo PatchTST) para forecasting del tipo de cambio Sol Peruano (PEN) / Dolar Americano (USD), con una capa de reglas que convierte la prediccion en señales de trading: COMPRAR / VENDER / MANTENER.
Entrenado sobre andres31416/pen-usd-trading-dataset.
El modelo esta inspirado en PatchTST ("A Time Series is Worth 64 Words: Long-term Forecasting with Transformers", Nie et al. 2023): en vez de procesar la serie de precios punto por punto, la divide en parches (segmentos superpuestos) y aplica atencion (self-attention) sobre esos parches. Esto le permite capturar tanto patrones de corto plazo como tendencias de largo plazo de forma mas eficiente que un Transformer tradicional o una LSTM.
Precio (serie temporal)
|
v
Division en parches
|
v
Embedding + Positional Encoding
|
v
Transformer Encoder (N capas, atencion multi-cabeza)
|
v
Cabeza de prediccion -> precio(s) futuro(s)
El proyecto no se queda solo en "predecir el precio futuro". Combina dos enfoques complementarios:
Señal de forecasting (signal_logic.generar_senal): que predice
el Transformer sobre el precio FUTURO (proximo paso).
Señal tecnica (technical_indicators.generar_senal_tecnica): evalua
si el precio ACTUAL esta en una zona anormal (sobrecompra/sobreventa)
respecto a su comportamiento reciente, usando 3 indicadores clasicos
de estrategias de "mean reversion":
Los 3 indicadores "votan" COMPRAR/VENDER/NEUTRAL, y la señal tecnica final es la que tenga mayoria de votos.
Alarma combinada (signal_logic.combinar_senales): junta ambas
señales en una sola alerta, con 3 niveles:
| Forecasting | Tecnico | Resultado |
|---|---|---|
| COMPRAR | COMPRAR | 🔴 ALARMA ALTA — Comprar |
| VENDER | VENDER | 🔴 ALARMA ALTA — Vender |
| COMPRAR | MANTENER (o viceversa) | 🟡 ALARMA MODERADA — con precaucion |
| COMPRAR | VENDER (opuestas) | ⚪ SIN ALARMA — señales contradictorias |
| MANTENER | MANTENER | ⚪ SIN ALARMA — nada que hacer |
La logica completa esta en src/inference.py, que corre ambas
evaluaciones y muestra los 3 bloques de resultado (prediccion,
señal tecnica, alarma combinada).
Un requisito importante de este proyecto es que el modelo pueda incorporar datos nuevos en tiempo real sin re-entrenar desde cero.
Es importante ser claro sobre como se logra esto de forma segura: un modelo que actualiza sus pesos con CADA dato nuevo, sin ningun control, sufre "catastrophic forgetting" (olvida patrones de largo plazo al sobre-ajustarse a lo mas reciente) — esto es especialmente riesgoso en un modelo de trading.
Por eso este proyecto implementa fine-tuning incremental controlado
(src/incremental_update.py):
incremental_learning_rate en
config/config.py), y pocas epochs.checkpoints/backup_*.pt, para poder
revertir si el modelo actualizado empeora.incremental_updates) de cuantas veces se ha
actualizado el modelo desde su entrenamiento inicial.Este enfoque es el mismo que se usa en sistemas de trading algoritmico reales en produccion (a veces llamado online fine-tuning o continual learning con warm-start), y es mucho mas estable que el verdadero "online learning" punto-a-punto, que no es apto para modelos Transformer robustos como este.
pen-usd-trading-model/
├── README.md # Esta model card
├── requirements.txt
├── config/
│ └── config.py # Hiperparametros y rutas
├── src/
│ ├── dataset.py # Carga y ventaneo de datos
│ ├── model.py # Arquitectura PatchTST
│ ├── train.py # Entrenamiento inicial (desde cero)
│ ├── incremental_update.py # Fine-tuning incremental (warm-start)
│ ├── signal_logic.py # Señal forecasting + combinacion de alarma
│ ├── technical_indicators.py # RSI, Bollinger %B, Z-score (señal tecnica)
│ └── inference.py # Prediccion + señal tecnica + alarma combinada
└── checkpoints/
├── best_model.pt # Checkpoint activo (se sube via Git LFS)
├── backup_*.pt # Respaldos automaticos antes de cada update
└── training_history.json # Historial de perdida por epoch
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# Asegurate que el dataset este clonado como carpeta hermana, o define:
export PEN_USD_DATASET_DIR=/ruta/a/pen-usd-trading-dataset/data
python3 src/train.py
Esto genera checkpoints/best_model.pt y checkpoints/training_history.json.
python3 src/incremental_update.py --nuevos_datos ruta/a/datos_nuevos.csv
El CSV de datos nuevos debe tener el mismo formato que los del dataset
(date,time,datetime_utc,open,high,low,close,volume).
python3 src/inference.py --datos ruta/a/daily.csv
Salida de ejemplo (3 bloques: forecasting, tecnico, alarma combinada):
============================================================
RESULTADO DE LA PREDICCION (FORECASTING)
============================================================
Precio actual: 3.40000
Prediccion (siguiente paso): 3.36667
Prediccion ajustada al banco: 3.36667 (multiplicador=1.0)
Cambio esperado: -0.980%
Señal de forecasting: VENDER (confianza: alta)
------------------------------------------------------------
Prediccion completa (5 pasos futuros):
paso +1: 3.36667
paso +2: 3.35323
...
============================================================
SEÑAL TECNICA (basada en el precio ACTUAL)
============================================================
RSI: 55.42
Bollinger %B: 0.70
Z-score: 0.79
Votos compra/venta: 0/0
Señal tecnica: MANTENER
Detalle: RSI=55.4 (zona neutral) | Bollinger %B=0.70 (dentro del canal normal) | Z-score=0.79 (zona neutral)
============================================================
ALARMA COMBINADA (forecasting + tecnico)
============================================================
Nivel de alarma: MODERADA
Accion final: VENDER
¿Coinciden?: NO
Mensaje: Solo una de las dos señales sugiere accion (VENDER). Alarma moderada: considerar con precaucion.
============================================================
En config/config.py, SignalConfig.bank_spread_multiplier permite
ajustar la prediccion de mercado a una aproximacion de lo que cobraria
un banco comercial especifico (ej. BCP), sin contaminar el entrenamiento
del modelo con ese margen comercial. Ajusta este valor comparando
periodicamente contra la tasa real publicada por el banco.
training_history.json y comparar el desempeño antes/despues de cada
actualizacion incremental.MIT.