neural-risk 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- neural_risk-0.2.0/LICENSE +21 -0
- neural_risk-0.2.0/PKG-INFO +300 -0
- neural_risk-0.2.0/README.md +261 -0
- neural_risk-0.2.0/neural_risk/__init__.py +150 -0
- neural_risk-0.2.0/neural_risk/agents/__init__.py +4 -0
- neural_risk-0.2.0/neural_risk/agents/portfolio_agent.py +835 -0
- neural_risk-0.2.0/neural_risk/agents/strategy_router.py +179 -0
- neural_risk-0.2.0/neural_risk/cortex/__init__.py +16 -0
- neural_risk-0.2.0/neural_risk/cortex/causal_selector.py +98 -0
- neural_risk-0.2.0/neural_risk/cortex/feature_jury.py +90 -0
- neural_risk-0.2.0/neural_risk/data/__init__.py +18 -0
- neural_risk-0.2.0/neural_risk/data/binance_vision.py +137 -0
- neural_risk-0.2.0/neural_risk/data/data_processor.py +209 -0
- neural_risk-0.2.0/neural_risk/data/derivatives_features.py +109 -0
- neural_risk-0.2.0/neural_risk/data/feature_cache.py +87 -0
- neural_risk-0.2.0/neural_risk/data/feature_engineering.py +630 -0
- neural_risk-0.2.0/neural_risk/data/labeling.py +69 -0
- neural_risk-0.2.0/neural_risk/data/loaders.py +92 -0
- neural_risk-0.2.0/neural_risk/data/macro_context.py +196 -0
- neural_risk-0.2.0/neural_risk/engine.py +466 -0
- neural_risk-0.2.0/neural_risk/metrics/__init__.py +6 -0
- neural_risk-0.2.0/neural_risk/metrics/performance.py +25 -0
- neural_risk-0.2.0/neural_risk/metrics/risk_analytics.py +33 -0
- neural_risk-0.2.0/neural_risk/metrics/technical.py +44 -0
- neural_risk-0.2.0/neural_risk/models/__init__.py +0 -0
- neural_risk-0.2.0/neural_risk/models/anomaly_detection.py +320 -0
- neural_risk-0.2.0/neural_risk/models/base.py +20 -0
- neural_risk-0.2.0/neural_risk/models/bayesian_model.py +17 -0
- neural_risk-0.2.0/neural_risk/models/causal_strategy.py +40 -0
- neural_risk-0.2.0/neural_risk/models/classic.py +27 -0
- neural_risk-0.2.0/neural_risk/models/copula_expert.py +291 -0
- neural_risk-0.2.0/neural_risk/models/ensemble_trainer.py +297 -0
- neural_risk-0.2.0/neural_risk/models/garch_volatility.py +281 -0
- neural_risk-0.2.0/neural_risk/models/hmm_model.py +68 -0
- neural_risk-0.2.0/neural_risk/models/layers.py +69 -0
- neural_risk-0.2.0/neural_risk/models/lstm_transformer.py +229 -0
- neural_risk-0.2.0/neural_risk/models/reinforcement_learning.py +313 -0
- neural_risk-0.2.0/neural_risk/models/risk_model.py +26 -0
- neural_risk-0.2.0/neural_risk/models/temporal_cv.py +204 -0
- neural_risk-0.2.0/neural_risk/models/trainer.py +48 -0
- neural_risk-0.2.0/neural_risk/optimization/__init__.py +0 -0
- neural_risk-0.2.0/neural_risk/optimization/hedging.py +99 -0
- neural_risk-0.2.0/neural_risk.egg-info/PKG-INFO +300 -0
- neural_risk-0.2.0/neural_risk.egg-info/SOURCES.txt +47 -0
- neural_risk-0.2.0/neural_risk.egg-info/dependency_links.txt +1 -0
- neural_risk-0.2.0/neural_risk.egg-info/requires.txt +20 -0
- neural_risk-0.2.0/neural_risk.egg-info/top_level.txt +1 -0
- neural_risk-0.2.0/pyproject.toml +58 -0
- neural_risk-0.2.0/setup.cfg +4 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Lucas Alvarez
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: neural-risk
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Crypto quant toolkit: Binance Futures derivatives data loader, causal flow/positioning features and a multi-expert risk engine.
|
|
5
|
+
Author-email: Lucas Alvarez <lucasalvarez21k@gmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/alvarez1lucas/neural_risk
|
|
8
|
+
Project-URL: Repository, https://github.com/alvarez1lucas/neural_risk
|
|
9
|
+
Project-URL: Issues, https://github.com/alvarez1lucas/neural_risk/issues
|
|
10
|
+
Keywords: quant,crypto,trading,binance,futures,risk,backtesting,machine-learning
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Financial and Insurance Industry
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Topic :: Office/Business :: Financial :: Investment
|
|
17
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
18
|
+
Requires-Python: >=3.9
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
License-File: LICENSE
|
|
21
|
+
Requires-Dist: numpy>=1.23
|
|
22
|
+
Requires-Dist: pandas>=1.5
|
|
23
|
+
Requires-Dist: scipy>=1.9
|
|
24
|
+
Requires-Dist: scikit-learn>=1.2
|
|
25
|
+
Provides-Extra: ml
|
|
26
|
+
Requires-Dist: torch>=2.0; extra == "ml"
|
|
27
|
+
Requires-Dist: xgboost>=1.7; extra == "ml"
|
|
28
|
+
Requires-Dist: hmmlearn>=0.2.7; extra == "ml"
|
|
29
|
+
Requires-Dist: arch>=5.3; extra == "ml"
|
|
30
|
+
Requires-Dist: statsmodels>=0.13; extra == "ml"
|
|
31
|
+
Requires-Dist: networkx>=3.0; extra == "ml"
|
|
32
|
+
Provides-Extra: data
|
|
33
|
+
Requires-Dist: ccxt>=2.0; extra == "data"
|
|
34
|
+
Requires-Dist: yfinance>=0.2; extra == "data"
|
|
35
|
+
Requires-Dist: requests>=2.28; extra == "data"
|
|
36
|
+
Provides-Extra: all
|
|
37
|
+
Requires-Dist: neural-risk[data,ml]; extra == "all"
|
|
38
|
+
Dynamic: license-file
|
|
39
|
+
|
|
40
|
+
# Neural Risk Engine
|
|
41
|
+
|
|
42
|
+
Motor de trading algorítmico para cripto con dos pipelines:
|
|
43
|
+
|
|
44
|
+
1. **Motor multi-experto original** (velas diarias). Tiene 5 capas: ingesta de datos → ingeniería de features → selección estadística de features → comité de 9 modelos → agente con aprendizaje adaptativo (Thompson Sampling) y hedging a nivel portafolio. Después de auditarlo y corregirlo, **el backtest walk-forward no muestra ventaja predictiva**. Las features salen solo de velas OHLCV y no contienen información sobre el retorno futuro.
|
|
45
|
+
2. **Pipeline intradía de derivados** (velas de 5m a 4h). Usa datos que no están en el precio: flujo agresor real (taker), funding, basis, open interest y ratios long/short de Binance Futures, con un modelo ridge walk-forward. **Muestra ventaja fuera de muestra en BTC, ETH y SOL, neta de comisiones de Binance y funding.**
|
|
46
|
+
|
|
47
|
+
> ⚠️ Todos los resultados son backtests sobre datos históricos. No son garantía de resultados futuros ni una recomendación de inversión.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Arquitectura
|
|
52
|
+
|
|
53
|
+
```mermaid
|
|
54
|
+
flowchart TB
|
|
55
|
+
subgraph L1["Paso 1 · Datos"]
|
|
56
|
+
A1[BinanceLoader / YahooFinanceLoader<br/>OHLCV spot + macro VIX/DXY/SPX/Oro] --> A2[DataProcessor<br/>limpieza, tipos, timezone]
|
|
57
|
+
A3[BinanceVisionLoader<br/>futuros: taker flow, funding,<br/>basis, open interest, ratios L/S]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
subgraph L2["Paso 2 · Feature Engineering (causal)"]
|
|
61
|
+
B1[RiskFeaturePipeline<br/>~35 features de OHLCV: volatilidad,<br/>microestructura, HMM, anomaly score]
|
|
62
|
+
B2[derivatives_features<br/>~35 features de flujo y posicionamiento]
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
subgraph L3["Paso 3 · Cortex"]
|
|
66
|
+
C1[FeatureJury<br/>Granger + Mutual Info + Lasso<br/>consenso 2 de 3 jueces]
|
|
67
|
+
C2[Diagnóstico de IC<br/>vs. ruido y vs. costos]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
subgraph L4["Paso 4 · Modelos"]
|
|
71
|
+
direction LR
|
|
72
|
+
D1[HMM<br/>régimen]
|
|
73
|
+
D2[XGBoost]
|
|
74
|
+
D3[Causal<br/>inference]
|
|
75
|
+
D4[GARCH<br/>volatilidad]
|
|
76
|
+
D5[Ensemble<br/>Neural+XGB+Kalman]
|
|
77
|
+
D6[LSTM/Transformer]
|
|
78
|
+
D7[Anomaly<br/>Detector]
|
|
79
|
+
D8[Copula*]
|
|
80
|
+
D9[RL*]
|
|
81
|
+
R1[Ridge walk-forward<br/>✅ modelo ganador]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
subgraph L5["Paso 5 · Agente + Ejecución"]
|
|
85
|
+
E1[PortfolioAgent<br/>Thompson Sampling, Kelly, SL/TP por volatilidad]
|
|
86
|
+
E2[StrategyRouter<br/>asignación de capital]
|
|
87
|
+
E3[PortfolioHedgeOptimizer<br/>Differential Evolution sobre CVaR]
|
|
88
|
+
E4[OrderExecutor<br/>circuit breakers, rebalanceo]
|
|
89
|
+
E5[Backtest intradía<br/>futuros perp: comisiones + funding + apalancamiento]
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
A2 --> B1 --> C1 --> D1 & D2 & D3 & D4 & D5 & D6 & D7
|
|
93
|
+
A3 --> B2 --> C2 --> R1
|
|
94
|
+
D1 & D2 & D3 & D4 & D5 & D6 & D7 --> E1
|
|
95
|
+
E1 --> E4
|
|
96
|
+
E1 -.-> E2
|
|
97
|
+
E3 --> E4
|
|
98
|
+
R1 --> E5
|
|
99
|
+
|
|
100
|
+
style D8 stroke-dasharray: 5 5
|
|
101
|
+
style D9 stroke-dasharray: 5 5
|
|
102
|
+
style R1 stroke:#2ca02c,stroke-width:3px
|
|
103
|
+
```
|
|
104
|
+
<sub>*Copula y RL están implementados como parte de la librería, pero no están conectados a ningún pipeline.</sub>
|
|
105
|
+
|
|
106
|
+
### Scheduling de entrenamiento del motor original (dos velocidades)
|
|
107
|
+
|
|
108
|
+
| Tier | Expertos | Frecuencia | Por qué |
|
|
109
|
+
|---|---|---|---|
|
|
110
|
+
| **Rápido** | HMM, XGBoost, Causal, GARCH, Isolation Forest | 1x/día | Modelos deterministas o de árboles, baratos de reentrenar |
|
|
111
|
+
| **Lento** | Ensemble neuronal, LSTM/Transformer, Autoencoder | cada 5 días | Redes con backprop, costosas de reentrenar |
|
|
112
|
+
|
|
113
|
+
El ciclo **live** (60-300s) nunca reentrena: solo predice con los modelos que dejó cacheados `train_models.py`. El jurado de features solo vuelve a elegir columnas cuando se reentrena el tier lento, así los dos tiers usan siempre exactamente las mismas.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Resultados
|
|
118
|
+
|
|
119
|
+
### 1. Motor multi-experto original: sin ventaja
|
|
120
|
+
|
|
121
|
+
Backtest walk-forward sobre BTC diario, del 2022-08 al 2026-08 (1.449 barras fuera de muestra). Se reentrena cada 30 días, la entrada es en la apertura siguiente, hay SL/TP intrabarra y se cobra 0.15% por lado entre comisión y slippage.
|
|
122
|
+
|
|
123
|
+
| | Estrategia | Buy & Hold |
|
|
124
|
+
|---|---|---|
|
|
125
|
+
| Retorno total | -0.25% | +201% |
|
|
126
|
+
| Sharpe | -0.61 | 0.82 |
|
|
127
|
+
| Trades | 6 | — |
|
|
128
|
+
| Acierto direccional por experto | XGB 48.5% · Causal 52.0% · LSTM 48.8% · Ensemble 49.9% | — |
|
|
129
|
+
|
|
130
|
+

|
|
131
|
+
|
|
132
|
+
**Por qué no funciona.** Medí el poder predictivo de cada feature por separado: la correlación de rango (IC) con el retorno de los 5 días siguientes, contra 20 columnas de ruido aleatorio como control.
|
|
133
|
+
|
|
134
|
+
- **Solo 1 de 43 features supera el umbral de azar** (|IC| > 0.10 con ~389 observaciones independientes). Las otras 42 rinden igual o peor que el ruido.
|
|
135
|
+
- Las features se llaman "order book", "bid-ask", "order flow" u "opciones", pero **todas son fórmulas sobre velas OHLCV**. El sistema no tiene ninguno de esos datos.
|
|
136
|
+
- El jurado eligió en el 88% de los reentrenamientos una feature con IC 0.002.
|
|
137
|
+
- Hay ~389 observaciones independientes para entrenar redes con atención, LSTM y Transformer, así que memorizan ruido.
|
|
138
|
+
- El agente no pudo "premiar al experto bueno" por dos razones: Thompson Sampling solo aprende de trades cerrados (hubo 6) y ningún experto tenía ventaja.
|
|
139
|
+
|
|
140
|
+
### 2. Pipeline intradía de derivados: con ventaja
|
|
141
|
+
|
|
142
|
+
**Configuración**: velas de 30 min, ridge walk-forward (reentreno mensual, solo con datos cuyo resultado ya se conocía), se opera el 5% más extremo de la señal, se mantiene 24 horas, entrada en la apertura siguiente, posición 1x sin apalancamiento. Los costos son las comisiones de Binance Futures más el **funding real pagado o cobrado cada 8h**. El período va de 2021-06 a 2026-07 en BTC, y de 2021-12 a 2026-07 en ETH y SOL.
|
|
143
|
+
|
|
144
|
+
#### Resultado por activo (futuros taker, VIP 0)
|
|
145
|
+
|
|
146
|
+
| Activo | Retorno total | CAGR | Sharpe | Max DD | Trades | Buy & Hold |
|
|
147
|
+
|---|---|---|---|---|---|---|
|
|
148
|
+
| **BTC** | **+1.259%** | 68% | **1.60** | -45% | 386 (6/mes) | +75% (Sharpe 0.47, DD -77%) |
|
|
149
|
+
| **ETH** | +516% | ~48% | 1.08 | -47% | 405 (7/mes) | **-54%** |
|
|
150
|
+
| **SOL** | +1.244% | ~76% | 1.20 | -70% | 369 (7/mes) | **-63%** |
|
|
151
|
+
|
|
152
|
+
Los parámetros se eligieron mirando solo BTC. **ETH y SOL funcionan como prueba fuera de muestra**: nunca se usaron para ajustar nada, y la estrategia gana aunque los dos activos cayeron más del 50% en el período. Gana tanto en longs como en shorts.
|
|
153
|
+
|
|
154
|
+

|
|
155
|
+
|
|
156
|
+
#### Cuánto queda con las comisiones de Binance (BTC, 1x)
|
|
157
|
+
|
|
158
|
+
Cada trade gana en promedio **87 bps brutos** y se hacen ~74 trades por año.
|
|
159
|
+
|
|
160
|
+
| Escenario | Costo ida y vuelta | Retorno total | CAGR | Sharpe | Max DD | Costo anual aprox. |
|
|
161
|
+
|---|---|---|---|---|---|---|
|
|
162
|
+
| Sin costos (referencia) | 0% | +2.061% | — | 1.85 | -43% | — |
|
|
163
|
+
| Spot taker (0.10% + slippage) | 0.30% | +586% | 46% | 1.22 | -49% | ~22% |
|
|
164
|
+
| **Futuros taker (0.05% + 1bp)** | **0.12%** | **+1.304%** | **68%** | **1.60** | **-46%** | **~9%** |
|
|
165
|
+
| Futuros taker con descuento BNB | 0.11% | +1.361% | 69% | 1.63 | -46% | ~8% |
|
|
166
|
+
| Futuros maker (0.02%) | 0.04% | +1.830% | 79% | 1.78 | -45% | ~3% |
|
|
167
|
+
|
|
168
|
+
*Tarifas VIP 0 de Binance al momento del análisis; verificalas antes de operar. Con órdenes maker el fill no está garantizado. Esta tabla y la de modelos salen de `compare_models.py`, que normaliza el target antes de entrenar; por eso el retorno de BTC difiere levemente del de la tabla por activo (+1.304% contra +1.259%).*
|
|
169
|
+
|
|
170
|
+
**Qué lo hacía no rentable**: (1) features sin información, (2) los costos de spot, que se comen un tercio de la ventaja, y (3) tenencias cortas. Con tenencia de 1 hora el Sharpe es **negativo en todos los timeframes**, porque la ventaja por trade (~8 bps) es menor que el costo (12 bps). La señal se puede calcular cada 5, 15 o 30 min, pero **la posición tiene que durar 12-24 h**.
|
|
171
|
+
|
|
172
|
+
#### Robustez: no depende de un solo parámetro
|
|
173
|
+
|
|
174
|
+
Sharpe con futuros taker en BTC, según el timeframe de la señal y la tenencia:
|
|
175
|
+
|
|
176
|
+
| Timeframe \ tenencia | 1 h | 4 h | 12 h | 24 h |
|
|
177
|
+
|---|---|---|---|---|
|
|
178
|
+
| 5m | -1.07 | 0.92 | 1.32 | 1.55 |
|
|
179
|
+
| 15m | -1.05 | 0.79 | 1.32 | 1.42 |
|
|
180
|
+
| 30m | -0.22 | 0.92 | 1.25 | 1.54 |
|
|
181
|
+
| 1h | 0.19 | 0.62 | 0.93 | 1.29 |
|
|
182
|
+
| 4h | — | 0.52 | 0.74 | 0.84 |
|
|
183
|
+
|
|
184
|
+
*(Umbral del 2% más extremo. La grilla completa, con 4 umbrales y 3 escenarios de costos, se genera con `scripts/intraday_grid.py`.)*
|
|
185
|
+
|
|
186
|
+
#### Apalancamiento: no mejora la estrategia, solo multiplica el riesgo
|
|
187
|
+
|
|
188
|
+
| BTC, futuros taker | 1x | 2x | 3x | 5x |
|
|
189
|
+
|---|---|---|---|---|
|
|
190
|
+
| Sharpe | 1.60 | 1.60 | 1.60 | 1.60 |
|
|
191
|
+
| Max drawdown | -46% | -73% | -89% | **-99%** |
|
|
192
|
+
|
|
193
|
+
Hay trades individuales de -17% (BTC) a -26% (SOL) a 1x. A 5x, uno solo de esos trades liquida la cuenta. **Se recomienda 1x o menos.** Por ejemplo, con 0.5x el drawdown queda en ~-25%.
|
|
194
|
+
|
|
195
|
+
#### Qué modelo funciona mejor (BTC, futuros taker, 1x)
|
|
196
|
+
|
|
197
|
+
Todos usan las mismas features, el mismo target y el mismo walk-forward.
|
|
198
|
+
|
|
199
|
+
| Modelo | IC fuera de muestra | Sharpe | Retorno total |
|
|
200
|
+
|---|---|---|---|
|
|
201
|
+
| **Ridge (lineal)** | **0.072** | **1.60** | **+1.304%** |
|
|
202
|
+
| Solo `crowd_ls` (ratio long/short del público) | 0.038 | 1.09 | +428% |
|
|
203
|
+
| Ensemble 80% ridge / 20% XGB | 0.058 | 1.05 | +359% |
|
|
204
|
+
| Ensemble 60% ridge / 30% XGB / 10% MLP | 0.060 | 1.01 | +333% |
|
|
205
|
+
| Ensemble 70% ridge / 20% XGB / 10% MLP | 0.061 | 0.93 | +275% |
|
|
206
|
+
| Ensemble con pesos iguales | 0.061 | 0.75 | +175% |
|
|
207
|
+
| XGBoost | 0.053 | 0.57 | +100% |
|
|
208
|
+
| Red neuronal (MLP) | 0.037 | 0.47 | +74% |
|
|
209
|
+
| Ensemble adaptativo (pesos según el IC de los 180 días previos) | 0.055 | 0.36 | +40% |
|
|
210
|
+
|
|
211
|
+
Lo mismo se repite en los tres activos (Sharpe con futuros taker, 1x):
|
|
212
|
+
|
|
213
|
+
| Modelo | BTC | ETH | SOL |
|
|
214
|
+
|---|---|---|---|
|
|
215
|
+
| **Ridge solo** | **1.60** | **1.08** | **1.17** |
|
|
216
|
+
| 80% ridge / 20% XGB | 1.05 | 0.94 | 0.90 |
|
|
217
|
+
| 70% ridge / 20% XGB / 10% MLP | 0.93 | 0.73 | 0.71 |
|
|
218
|
+
| Pesos iguales | 0.75 | 1.04 | 0.63 |
|
|
219
|
+
| Adaptativo por IC | 0.36 | 0.81 | 0.64 |
|
|
220
|
+
| XGBoost | 0.57 | 0.39 | 0.24 |
|
|
221
|
+
| MLP | 0.47 | -0.28 | -0.06 |
|
|
222
|
+
|
|
223
|
+
**Cuanto más peso tiene ridge, mejor da la combinación, y el óptimo es ridge solo.** XGBoost y la red neuronal no aportan información que ridge no tenga; solo agregan ruido de sobreajuste. Con esta relación señal/ruido, el modelo más simple gana. Los pesos adaptativos asignaron en promedio 38% / 30% / 32%: en una ventana de 180 días el IC de los tres modelos se parece, pero las predicciones extremas de ridge (las que se operan) son mejores.
|
|
224
|
+
|
|
225
|
+
**De dónde viene la ventaja**: de los datos de posicionamiento (ratios long/short de top traders y del público, funding, basis, open interest). Lo que más aporta es operar contra el lado sobrecargado del mercado.
|
|
226
|
+
|
|
227
|
+
#### Limitaciones conocidas
|
|
228
|
+
|
|
229
|
+
- **El retorno está concentrado en 2023-2024.** En 2021-2022 el resultado fue de -22% a +35% según el activo. En los últimos 12 meses: BTC +44%, SOL +8%, **ETH -2%**. La ventaja puede estar achicándose.
|
|
230
|
+
- **Un drawdown de -45% a 1x es alto.** Conviene dimensionar la posición según la volatilidad en vez de usar siempre el 100% del capital.
|
|
231
|
+
- El backtest no modela fills parciales de órdenes maker, slippage real en activos menos líquidos (SOL) ni impacto de mercado con capital grande.
|
|
232
|
+
- Falta validación en vivo: el siguiente paso es paper trading en el testnet de Binance Futures.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Ingeniería y debugging destacado
|
|
237
|
+
|
|
238
|
+
El proyecto pasó por una auditoría completa. Los bugs más importantes se confirmaron **ejecutando** el código, no solo leyéndolo:
|
|
239
|
+
|
|
240
|
+
- **Expertos que fallaban en todos los ciclos sin que nada avisara.** El ensemble le pasaba a XGBoost una ventana aplanada (`Feature shape mismatch, expected 6, got 60`), y GARCH llamaba `.values` sobre un ndarray. Como los dos estaban envueltos en `try/except` que devolvían 0, el smoke test "pasaba" igual.
|
|
241
|
+
- **Look-ahead en las features.** IsolationForest, KMeans y HMM se ajustaban sobre la serie completa, y el HMM devolvía probabilidades *smoothed*, que usan observaciones futuras. Ahora se ajustan por bloques, solo con datos pasados, y el HMM usa probabilidades *filtradas*. También se eliminó un `bfill()` que rellenaba con valores futuros, y un desfase de 5 min en el premium index.
|
|
242
|
+
- **Triple barrier mal etiquetado.** No miraba qué barrera se tocaba primero: un camino que tocaba el stop y después el profit quedaba como ganador.
|
|
243
|
+
- **Target asimétrico usado para decidir dirección.** Con barreras de +2σ y -1σ, un "-1" significa que un long habría tocado el stop, no que un short gana. El sistema terminaba "shorteando" por un sesgo de la etiqueta.
|
|
244
|
+
- **Kelly se bloqueaba solo.** Un trade perdedor dejaba el sizing en 0, sin trades no hay feedback nuevo, y el agente quedaba bloqueado para siempre. Se corrigió con shrinkage hacia un prior y un tamaño mínimo.
|
|
245
|
+
- **La equity del backtest contaba el capital dos veces** (`portfolio_value + cash`): el gráfico mostraba un +100% falso.
|
|
246
|
+
- **Tiers desincronizados.** El reentreno rápido pisaba las features elegidas mientras los modelos lentos seguían entrenados con otras columnas.
|
|
247
|
+
- **Backtest inviable por tiempo de cómputo** (27s de features por barra, ~27 h por corrida). Con el pipeline causal las features se calculan una sola vez y la corrida baja a minutos.
|
|
248
|
+
- Antes de la auditoría: look-ahead en `synthetic_delta` (`shift(-1)`), circuit breaker de pérdida diaria muerto, error en Kelly con señales negativas, reentrenamiento de los 9 modelos en cada ciclo de 60s, e imports ansiosos de todo el paquete.
|
|
249
|
+
|
|
250
|
+
## Stack técnico
|
|
251
|
+
|
|
252
|
+
`Python` · `PyTorch` · `XGBoost` · `scikit-learn` · `hmmlearn` · `arch (GARCH)` · `statsmodels` · `SQLite` · `ccxt` (Binance) · `data.binance.vision` · `scipy.optimize` (Differential Evolution) · `matplotlib`
|
|
253
|
+
|
|
254
|
+
## Cómo correrlo
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
# Como librería (PyPI)
|
|
258
|
+
pip install neural-risk # core: loader de Binance Vision, features de derivados, métricas
|
|
259
|
+
pip install "neural-risk[ml]" # + modelos (torch, xgboost, hmmlearn, arch, statsmodels)
|
|
260
|
+
pip install "neural-risk[all]" # + conectores en vivo (ccxt, yfinance)
|
|
261
|
+
|
|
262
|
+
# Desde el repo (scripts de backtest y servicios en vivo)
|
|
263
|
+
git clone https://github.com/alvarez1lucas/neural_risk.git && cd neural_risk
|
|
264
|
+
pip install -r requirements.txt
|
|
265
|
+
|
|
266
|
+
# --- Pipeline intradía de derivados ---
|
|
267
|
+
# 1) Descargar datos de futuros de Binance (caché local en data/binance_vision/, ~150 MB por símbolo)
|
|
268
|
+
python -c "from neural_risk.data.binance_vision import BinanceVisionLoader as L; l=L(); \
|
|
269
|
+
l.klines('BTCUSDT','5m','2021-01','2026-07'); l.premium_index('BTCUSDT','5m','2021-01','2026-07'); \
|
|
270
|
+
l.funding_rate('BTCUSDT','2021-01','2026-07'); l.metrics('BTCUSDT','2021-01-01','2026-08-10')"
|
|
271
|
+
# (los scripts esperan data/binance_vision/{SYMBOL}_{klines_5m,premium_5m,funding,metrics_5m}.pkl)
|
|
272
|
+
|
|
273
|
+
# 2) Diagnóstico de señal: IC por feature vs. ruido y vs. costos
|
|
274
|
+
python scripts/feature_diagnostics.py --symbol BTCUSDT --timeframes 15m 1h 4h
|
|
275
|
+
|
|
276
|
+
# 3) Backtest con comisiones de Binance + funding
|
|
277
|
+
python scripts/backtest_intraday.py --symbol BTCUSDT --timeframe 30m --hold 48 --q 0.05
|
|
278
|
+
|
|
279
|
+
# 4) Robustez (timeframe x tenencia x umbral) y comparación de modelos / comisiones / apalancamiento
|
|
280
|
+
python scripts/intraday_grid.py --symbol BTCUSDT --timeframes 5m 15m 30m 1h 4h
|
|
281
|
+
python scripts/compare_models.py --symbol BTCUSDT --timeframe 30m --hold-hours 24 --q 0.05 --leverages 1 2 3 5
|
|
282
|
+
|
|
283
|
+
# --- Motor multi-experto original ---
|
|
284
|
+
python scripts/backtest.py --asset BTC --data "data/raw/BTC_UST Binance Historical Daily Data.csv"
|
|
285
|
+
|
|
286
|
+
# Sistema en vivo del motor original (4 procesos, comunicados por SQLite)
|
|
287
|
+
python scripts/run_data_fetcher.py # Layer 1: ingesta
|
|
288
|
+
python scripts/train_models.py # Layer 2: entrenamiento por tiers
|
|
289
|
+
python scripts/run_engine.py # Layer 3-5: predicción + decisión
|
|
290
|
+
python scripts/run_executor.py # Layer 6: ejecución + circuit breakers
|
|
291
|
+
python scripts/run_portfolio_hedge.py # Hedging a nivel portafolio (asesor)
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Los resultados se guardan en `backtest_results/`: equity, trades, métricas y gráficos.
|
|
295
|
+
|
|
296
|
+
## Estado del proyecto
|
|
297
|
+
|
|
298
|
+
- ✅ Motor original auditado, corregido y ejecutable de punta a punta (sin ventaja predictiva sobre datos OHLCV diarios).
|
|
299
|
+
- ✅ Pipeline intradía de derivados con ventaja fuera de muestra en 3 activos, neta de costos.
|
|
300
|
+
- ⏳ Pendiente: paper trading en el testnet de Binance Futures, dimensionamiento de la posición según la volatilidad, y conectar la señal ridge al executor live.
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# Neural Risk Engine
|
|
2
|
+
|
|
3
|
+
Motor de trading algorítmico para cripto con dos pipelines:
|
|
4
|
+
|
|
5
|
+
1. **Motor multi-experto original** (velas diarias). Tiene 5 capas: ingesta de datos → ingeniería de features → selección estadística de features → comité de 9 modelos → agente con aprendizaje adaptativo (Thompson Sampling) y hedging a nivel portafolio. Después de auditarlo y corregirlo, **el backtest walk-forward no muestra ventaja predictiva**. Las features salen solo de velas OHLCV y no contienen información sobre el retorno futuro.
|
|
6
|
+
2. **Pipeline intradía de derivados** (velas de 5m a 4h). Usa datos que no están en el precio: flujo agresor real (taker), funding, basis, open interest y ratios long/short de Binance Futures, con un modelo ridge walk-forward. **Muestra ventaja fuera de muestra en BTC, ETH y SOL, neta de comisiones de Binance y funding.**
|
|
7
|
+
|
|
8
|
+
> ⚠️ Todos los resultados son backtests sobre datos históricos. No son garantía de resultados futuros ni una recomendación de inversión.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Arquitectura
|
|
13
|
+
|
|
14
|
+
```mermaid
|
|
15
|
+
flowchart TB
|
|
16
|
+
subgraph L1["Paso 1 · Datos"]
|
|
17
|
+
A1[BinanceLoader / YahooFinanceLoader<br/>OHLCV spot + macro VIX/DXY/SPX/Oro] --> A2[DataProcessor<br/>limpieza, tipos, timezone]
|
|
18
|
+
A3[BinanceVisionLoader<br/>futuros: taker flow, funding,<br/>basis, open interest, ratios L/S]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
subgraph L2["Paso 2 · Feature Engineering (causal)"]
|
|
22
|
+
B1[RiskFeaturePipeline<br/>~35 features de OHLCV: volatilidad,<br/>microestructura, HMM, anomaly score]
|
|
23
|
+
B2[derivatives_features<br/>~35 features de flujo y posicionamiento]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
subgraph L3["Paso 3 · Cortex"]
|
|
27
|
+
C1[FeatureJury<br/>Granger + Mutual Info + Lasso<br/>consenso 2 de 3 jueces]
|
|
28
|
+
C2[Diagnóstico de IC<br/>vs. ruido y vs. costos]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
subgraph L4["Paso 4 · Modelos"]
|
|
32
|
+
direction LR
|
|
33
|
+
D1[HMM<br/>régimen]
|
|
34
|
+
D2[XGBoost]
|
|
35
|
+
D3[Causal<br/>inference]
|
|
36
|
+
D4[GARCH<br/>volatilidad]
|
|
37
|
+
D5[Ensemble<br/>Neural+XGB+Kalman]
|
|
38
|
+
D6[LSTM/Transformer]
|
|
39
|
+
D7[Anomaly<br/>Detector]
|
|
40
|
+
D8[Copula*]
|
|
41
|
+
D9[RL*]
|
|
42
|
+
R1[Ridge walk-forward<br/>✅ modelo ganador]
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
subgraph L5["Paso 5 · Agente + Ejecución"]
|
|
46
|
+
E1[PortfolioAgent<br/>Thompson Sampling, Kelly, SL/TP por volatilidad]
|
|
47
|
+
E2[StrategyRouter<br/>asignación de capital]
|
|
48
|
+
E3[PortfolioHedgeOptimizer<br/>Differential Evolution sobre CVaR]
|
|
49
|
+
E4[OrderExecutor<br/>circuit breakers, rebalanceo]
|
|
50
|
+
E5[Backtest intradía<br/>futuros perp: comisiones + funding + apalancamiento]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
A2 --> B1 --> C1 --> D1 & D2 & D3 & D4 & D5 & D6 & D7
|
|
54
|
+
A3 --> B2 --> C2 --> R1
|
|
55
|
+
D1 & D2 & D3 & D4 & D5 & D6 & D7 --> E1
|
|
56
|
+
E1 --> E4
|
|
57
|
+
E1 -.-> E2
|
|
58
|
+
E3 --> E4
|
|
59
|
+
R1 --> E5
|
|
60
|
+
|
|
61
|
+
style D8 stroke-dasharray: 5 5
|
|
62
|
+
style D9 stroke-dasharray: 5 5
|
|
63
|
+
style R1 stroke:#2ca02c,stroke-width:3px
|
|
64
|
+
```
|
|
65
|
+
<sub>*Copula y RL están implementados como parte de la librería, pero no están conectados a ningún pipeline.</sub>
|
|
66
|
+
|
|
67
|
+
### Scheduling de entrenamiento del motor original (dos velocidades)
|
|
68
|
+
|
|
69
|
+
| Tier | Expertos | Frecuencia | Por qué |
|
|
70
|
+
|---|---|---|---|
|
|
71
|
+
| **Rápido** | HMM, XGBoost, Causal, GARCH, Isolation Forest | 1x/día | Modelos deterministas o de árboles, baratos de reentrenar |
|
|
72
|
+
| **Lento** | Ensemble neuronal, LSTM/Transformer, Autoencoder | cada 5 días | Redes con backprop, costosas de reentrenar |
|
|
73
|
+
|
|
74
|
+
El ciclo **live** (60-300s) nunca reentrena: solo predice con los modelos que dejó cacheados `train_models.py`. El jurado de features solo vuelve a elegir columnas cuando se reentrena el tier lento, así los dos tiers usan siempre exactamente las mismas.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Resultados
|
|
79
|
+
|
|
80
|
+
### 1. Motor multi-experto original: sin ventaja
|
|
81
|
+
|
|
82
|
+
Backtest walk-forward sobre BTC diario, del 2022-08 al 2026-08 (1.449 barras fuera de muestra). Se reentrena cada 30 días, la entrada es en la apertura siguiente, hay SL/TP intrabarra y se cobra 0.15% por lado entre comisión y slippage.
|
|
83
|
+
|
|
84
|
+
| | Estrategia | Buy & Hold |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| Retorno total | -0.25% | +201% |
|
|
87
|
+
| Sharpe | -0.61 | 0.82 |
|
|
88
|
+
| Trades | 6 | — |
|
|
89
|
+
| Acierto direccional por experto | XGB 48.5% · Causal 52.0% · LSTM 48.8% · Ensemble 49.9% | — |
|
|
90
|
+
|
|
91
|
+

|
|
92
|
+
|
|
93
|
+
**Por qué no funciona.** Medí el poder predictivo de cada feature por separado: la correlación de rango (IC) con el retorno de los 5 días siguientes, contra 20 columnas de ruido aleatorio como control.
|
|
94
|
+
|
|
95
|
+
- **Solo 1 de 43 features supera el umbral de azar** (|IC| > 0.10 con ~389 observaciones independientes). Las otras 42 rinden igual o peor que el ruido.
|
|
96
|
+
- Las features se llaman "order book", "bid-ask", "order flow" u "opciones", pero **todas son fórmulas sobre velas OHLCV**. El sistema no tiene ninguno de esos datos.
|
|
97
|
+
- El jurado eligió en el 88% de los reentrenamientos una feature con IC 0.002.
|
|
98
|
+
- Hay ~389 observaciones independientes para entrenar redes con atención, LSTM y Transformer, así que memorizan ruido.
|
|
99
|
+
- El agente no pudo "premiar al experto bueno" por dos razones: Thompson Sampling solo aprende de trades cerrados (hubo 6) y ningún experto tenía ventaja.
|
|
100
|
+
|
|
101
|
+
### 2. Pipeline intradía de derivados: con ventaja
|
|
102
|
+
|
|
103
|
+
**Configuración**: velas de 30 min, ridge walk-forward (reentreno mensual, solo con datos cuyo resultado ya se conocía), se opera el 5% más extremo de la señal, se mantiene 24 horas, entrada en la apertura siguiente, posición 1x sin apalancamiento. Los costos son las comisiones de Binance Futures más el **funding real pagado o cobrado cada 8h**. El período va de 2021-06 a 2026-07 en BTC, y de 2021-12 a 2026-07 en ETH y SOL.
|
|
104
|
+
|
|
105
|
+
#### Resultado por activo (futuros taker, VIP 0)
|
|
106
|
+
|
|
107
|
+
| Activo | Retorno total | CAGR | Sharpe | Max DD | Trades | Buy & Hold |
|
|
108
|
+
|---|---|---|---|---|---|---|
|
|
109
|
+
| **BTC** | **+1.259%** | 68% | **1.60** | -45% | 386 (6/mes) | +75% (Sharpe 0.47, DD -77%) |
|
|
110
|
+
| **ETH** | +516% | ~48% | 1.08 | -47% | 405 (7/mes) | **-54%** |
|
|
111
|
+
| **SOL** | +1.244% | ~76% | 1.20 | -70% | 369 (7/mes) | **-63%** |
|
|
112
|
+
|
|
113
|
+
Los parámetros se eligieron mirando solo BTC. **ETH y SOL funcionan como prueba fuera de muestra**: nunca se usaron para ajustar nada, y la estrategia gana aunque los dos activos cayeron más del 50% en el período. Gana tanto en longs como en shorts.
|
|
114
|
+
|
|
115
|
+

|
|
116
|
+
|
|
117
|
+
#### Cuánto queda con las comisiones de Binance (BTC, 1x)
|
|
118
|
+
|
|
119
|
+
Cada trade gana en promedio **87 bps brutos** y se hacen ~74 trades por año.
|
|
120
|
+
|
|
121
|
+
| Escenario | Costo ida y vuelta | Retorno total | CAGR | Sharpe | Max DD | Costo anual aprox. |
|
|
122
|
+
|---|---|---|---|---|---|---|
|
|
123
|
+
| Sin costos (referencia) | 0% | +2.061% | — | 1.85 | -43% | — |
|
|
124
|
+
| Spot taker (0.10% + slippage) | 0.30% | +586% | 46% | 1.22 | -49% | ~22% |
|
|
125
|
+
| **Futuros taker (0.05% + 1bp)** | **0.12%** | **+1.304%** | **68%** | **1.60** | **-46%** | **~9%** |
|
|
126
|
+
| Futuros taker con descuento BNB | 0.11% | +1.361% | 69% | 1.63 | -46% | ~8% |
|
|
127
|
+
| Futuros maker (0.02%) | 0.04% | +1.830% | 79% | 1.78 | -45% | ~3% |
|
|
128
|
+
|
|
129
|
+
*Tarifas VIP 0 de Binance al momento del análisis; verificalas antes de operar. Con órdenes maker el fill no está garantizado. Esta tabla y la de modelos salen de `compare_models.py`, que normaliza el target antes de entrenar; por eso el retorno de BTC difiere levemente del de la tabla por activo (+1.304% contra +1.259%).*
|
|
130
|
+
|
|
131
|
+
**Qué lo hacía no rentable**: (1) features sin información, (2) los costos de spot, que se comen un tercio de la ventaja, y (3) tenencias cortas. Con tenencia de 1 hora el Sharpe es **negativo en todos los timeframes**, porque la ventaja por trade (~8 bps) es menor que el costo (12 bps). La señal se puede calcular cada 5, 15 o 30 min, pero **la posición tiene que durar 12-24 h**.
|
|
132
|
+
|
|
133
|
+
#### Robustez: no depende de un solo parámetro
|
|
134
|
+
|
|
135
|
+
Sharpe con futuros taker en BTC, según el timeframe de la señal y la tenencia:
|
|
136
|
+
|
|
137
|
+
| Timeframe \ tenencia | 1 h | 4 h | 12 h | 24 h |
|
|
138
|
+
|---|---|---|---|---|
|
|
139
|
+
| 5m | -1.07 | 0.92 | 1.32 | 1.55 |
|
|
140
|
+
| 15m | -1.05 | 0.79 | 1.32 | 1.42 |
|
|
141
|
+
| 30m | -0.22 | 0.92 | 1.25 | 1.54 |
|
|
142
|
+
| 1h | 0.19 | 0.62 | 0.93 | 1.29 |
|
|
143
|
+
| 4h | — | 0.52 | 0.74 | 0.84 |
|
|
144
|
+
|
|
145
|
+
*(Umbral del 2% más extremo. La grilla completa, con 4 umbrales y 3 escenarios de costos, se genera con `scripts/intraday_grid.py`.)*
|
|
146
|
+
|
|
147
|
+
#### Apalancamiento: no mejora la estrategia, solo multiplica el riesgo
|
|
148
|
+
|
|
149
|
+
| BTC, futuros taker | 1x | 2x | 3x | 5x |
|
|
150
|
+
|---|---|---|---|---|
|
|
151
|
+
| Sharpe | 1.60 | 1.60 | 1.60 | 1.60 |
|
|
152
|
+
| Max drawdown | -46% | -73% | -89% | **-99%** |
|
|
153
|
+
|
|
154
|
+
Hay trades individuales de -17% (BTC) a -26% (SOL) a 1x. A 5x, uno solo de esos trades liquida la cuenta. **Se recomienda 1x o menos.** Por ejemplo, con 0.5x el drawdown queda en ~-25%.
|
|
155
|
+
|
|
156
|
+
#### Qué modelo funciona mejor (BTC, futuros taker, 1x)
|
|
157
|
+
|
|
158
|
+
Todos usan las mismas features, el mismo target y el mismo walk-forward.
|
|
159
|
+
|
|
160
|
+
| Modelo | IC fuera de muestra | Sharpe | Retorno total |
|
|
161
|
+
|---|---|---|---|
|
|
162
|
+
| **Ridge (lineal)** | **0.072** | **1.60** | **+1.304%** |
|
|
163
|
+
| Solo `crowd_ls` (ratio long/short del público) | 0.038 | 1.09 | +428% |
|
|
164
|
+
| Ensemble 80% ridge / 20% XGB | 0.058 | 1.05 | +359% |
|
|
165
|
+
| Ensemble 60% ridge / 30% XGB / 10% MLP | 0.060 | 1.01 | +333% |
|
|
166
|
+
| Ensemble 70% ridge / 20% XGB / 10% MLP | 0.061 | 0.93 | +275% |
|
|
167
|
+
| Ensemble con pesos iguales | 0.061 | 0.75 | +175% |
|
|
168
|
+
| XGBoost | 0.053 | 0.57 | +100% |
|
|
169
|
+
| Red neuronal (MLP) | 0.037 | 0.47 | +74% |
|
|
170
|
+
| Ensemble adaptativo (pesos según el IC de los 180 días previos) | 0.055 | 0.36 | +40% |
|
|
171
|
+
|
|
172
|
+
Lo mismo se repite en los tres activos (Sharpe con futuros taker, 1x):
|
|
173
|
+
|
|
174
|
+
| Modelo | BTC | ETH | SOL |
|
|
175
|
+
|---|---|---|---|
|
|
176
|
+
| **Ridge solo** | **1.60** | **1.08** | **1.17** |
|
|
177
|
+
| 80% ridge / 20% XGB | 1.05 | 0.94 | 0.90 |
|
|
178
|
+
| 70% ridge / 20% XGB / 10% MLP | 0.93 | 0.73 | 0.71 |
|
|
179
|
+
| Pesos iguales | 0.75 | 1.04 | 0.63 |
|
|
180
|
+
| Adaptativo por IC | 0.36 | 0.81 | 0.64 |
|
|
181
|
+
| XGBoost | 0.57 | 0.39 | 0.24 |
|
|
182
|
+
| MLP | 0.47 | -0.28 | -0.06 |
|
|
183
|
+
|
|
184
|
+
**Cuanto más peso tiene ridge, mejor da la combinación, y el óptimo es ridge solo.** XGBoost y la red neuronal no aportan información que ridge no tenga; solo agregan ruido de sobreajuste. Con esta relación señal/ruido, el modelo más simple gana. Los pesos adaptativos asignaron en promedio 38% / 30% / 32%: en una ventana de 180 días el IC de los tres modelos se parece, pero las predicciones extremas de ridge (las que se operan) son mejores.
|
|
185
|
+
|
|
186
|
+
**De dónde viene la ventaja**: de los datos de posicionamiento (ratios long/short de top traders y del público, funding, basis, open interest). Lo que más aporta es operar contra el lado sobrecargado del mercado.
|
|
187
|
+
|
|
188
|
+
#### Limitaciones conocidas
|
|
189
|
+
|
|
190
|
+
- **El retorno está concentrado en 2023-2024.** En 2021-2022 el resultado fue de -22% a +35% según el activo. En los últimos 12 meses: BTC +44%, SOL +8%, **ETH -2%**. La ventaja puede estar achicándose.
|
|
191
|
+
- **Un drawdown de -45% a 1x es alto.** Conviene dimensionar la posición según la volatilidad en vez de usar siempre el 100% del capital.
|
|
192
|
+
- El backtest no modela fills parciales de órdenes maker, slippage real en activos menos líquidos (SOL) ni impacto de mercado con capital grande.
|
|
193
|
+
- Falta validación en vivo: el siguiente paso es paper trading en el testnet de Binance Futures.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Ingeniería y debugging destacado
|
|
198
|
+
|
|
199
|
+
El proyecto pasó por una auditoría completa. Los bugs más importantes se confirmaron **ejecutando** el código, no solo leyéndolo:
|
|
200
|
+
|
|
201
|
+
- **Expertos que fallaban en todos los ciclos sin que nada avisara.** El ensemble le pasaba a XGBoost una ventana aplanada (`Feature shape mismatch, expected 6, got 60`), y GARCH llamaba `.values` sobre un ndarray. Como los dos estaban envueltos en `try/except` que devolvían 0, el smoke test "pasaba" igual.
|
|
202
|
+
- **Look-ahead en las features.** IsolationForest, KMeans y HMM se ajustaban sobre la serie completa, y el HMM devolvía probabilidades *smoothed*, que usan observaciones futuras. Ahora se ajustan por bloques, solo con datos pasados, y el HMM usa probabilidades *filtradas*. También se eliminó un `bfill()` que rellenaba con valores futuros, y un desfase de 5 min en el premium index.
|
|
203
|
+
- **Triple barrier mal etiquetado.** No miraba qué barrera se tocaba primero: un camino que tocaba el stop y después el profit quedaba como ganador.
|
|
204
|
+
- **Target asimétrico usado para decidir dirección.** Con barreras de +2σ y -1σ, un "-1" significa que un long habría tocado el stop, no que un short gana. El sistema terminaba "shorteando" por un sesgo de la etiqueta.
|
|
205
|
+
- **Kelly se bloqueaba solo.** Un trade perdedor dejaba el sizing en 0, sin trades no hay feedback nuevo, y el agente quedaba bloqueado para siempre. Se corrigió con shrinkage hacia un prior y un tamaño mínimo.
|
|
206
|
+
- **La equity del backtest contaba el capital dos veces** (`portfolio_value + cash`): el gráfico mostraba un +100% falso.
|
|
207
|
+
- **Tiers desincronizados.** El reentreno rápido pisaba las features elegidas mientras los modelos lentos seguían entrenados con otras columnas.
|
|
208
|
+
- **Backtest inviable por tiempo de cómputo** (27s de features por barra, ~27 h por corrida). Con el pipeline causal las features se calculan una sola vez y la corrida baja a minutos.
|
|
209
|
+
- Antes de la auditoría: look-ahead en `synthetic_delta` (`shift(-1)`), circuit breaker de pérdida diaria muerto, error en Kelly con señales negativas, reentrenamiento de los 9 modelos en cada ciclo de 60s, e imports ansiosos de todo el paquete.
|
|
210
|
+
|
|
211
|
+
## Stack técnico
|
|
212
|
+
|
|
213
|
+
`Python` · `PyTorch` · `XGBoost` · `scikit-learn` · `hmmlearn` · `arch (GARCH)` · `statsmodels` · `SQLite` · `ccxt` (Binance) · `data.binance.vision` · `scipy.optimize` (Differential Evolution) · `matplotlib`
|
|
214
|
+
|
|
215
|
+
## Cómo correrlo
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
# Como librería (PyPI)
|
|
219
|
+
pip install neural-risk # core: loader de Binance Vision, features de derivados, métricas
|
|
220
|
+
pip install "neural-risk[ml]" # + modelos (torch, xgboost, hmmlearn, arch, statsmodels)
|
|
221
|
+
pip install "neural-risk[all]" # + conectores en vivo (ccxt, yfinance)
|
|
222
|
+
|
|
223
|
+
# Desde el repo (scripts de backtest y servicios en vivo)
|
|
224
|
+
git clone https://github.com/alvarez1lucas/neural_risk.git && cd neural_risk
|
|
225
|
+
pip install -r requirements.txt
|
|
226
|
+
|
|
227
|
+
# --- Pipeline intradía de derivados ---
|
|
228
|
+
# 1) Descargar datos de futuros de Binance (caché local en data/binance_vision/, ~150 MB por símbolo)
|
|
229
|
+
python -c "from neural_risk.data.binance_vision import BinanceVisionLoader as L; l=L(); \
|
|
230
|
+
l.klines('BTCUSDT','5m','2021-01','2026-07'); l.premium_index('BTCUSDT','5m','2021-01','2026-07'); \
|
|
231
|
+
l.funding_rate('BTCUSDT','2021-01','2026-07'); l.metrics('BTCUSDT','2021-01-01','2026-08-10')"
|
|
232
|
+
# (los scripts esperan data/binance_vision/{SYMBOL}_{klines_5m,premium_5m,funding,metrics_5m}.pkl)
|
|
233
|
+
|
|
234
|
+
# 2) Diagnóstico de señal: IC por feature vs. ruido y vs. costos
|
|
235
|
+
python scripts/feature_diagnostics.py --symbol BTCUSDT --timeframes 15m 1h 4h
|
|
236
|
+
|
|
237
|
+
# 3) Backtest con comisiones de Binance + funding
|
|
238
|
+
python scripts/backtest_intraday.py --symbol BTCUSDT --timeframe 30m --hold 48 --q 0.05
|
|
239
|
+
|
|
240
|
+
# 4) Robustez (timeframe x tenencia x umbral) y comparación de modelos / comisiones / apalancamiento
|
|
241
|
+
python scripts/intraday_grid.py --symbol BTCUSDT --timeframes 5m 15m 30m 1h 4h
|
|
242
|
+
python scripts/compare_models.py --symbol BTCUSDT --timeframe 30m --hold-hours 24 --q 0.05 --leverages 1 2 3 5
|
|
243
|
+
|
|
244
|
+
# --- Motor multi-experto original ---
|
|
245
|
+
python scripts/backtest.py --asset BTC --data "data/raw/BTC_UST Binance Historical Daily Data.csv"
|
|
246
|
+
|
|
247
|
+
# Sistema en vivo del motor original (4 procesos, comunicados por SQLite)
|
|
248
|
+
python scripts/run_data_fetcher.py # Layer 1: ingesta
|
|
249
|
+
python scripts/train_models.py # Layer 2: entrenamiento por tiers
|
|
250
|
+
python scripts/run_engine.py # Layer 3-5: predicción + decisión
|
|
251
|
+
python scripts/run_executor.py # Layer 6: ejecución + circuit breakers
|
|
252
|
+
python scripts/run_portfolio_hedge.py # Hedging a nivel portafolio (asesor)
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Los resultados se guardan en `backtest_results/`: equity, trades, métricas y gráficos.
|
|
256
|
+
|
|
257
|
+
## Estado del proyecto
|
|
258
|
+
|
|
259
|
+
- ✅ Motor original auditado, corregido y ejecutable de punta a punta (sin ventaja predictiva sobre datos OHLCV diarios).
|
|
260
|
+
- ✅ Pipeline intradía de derivados con ventaja fuera de muestra en 3 activos, neta de costos.
|
|
261
|
+
- ⏳ Pendiente: paper trading en el testnet de Binance Futures, dimensionamiento de la posición según la volatilidad, y conectar la señal ridge al executor live.
|