Files
Multi_Swarm_Coevolutive/docs/superpowers/specs/2026-05-19-strategy-pythagoras-design.md
T
Adriano Dal Pastro 14f476dd09 docs(strategy_pythagoras): spec + plan + summaries dei PDF
Base per l'esecuzione del sub-project strategy_pythagoras:
- docs/superpowers/specs/2026-05-19-strategy-pythagoras-design.md (spec)
- docs/superpowers/plans/2026-05-19-strategy-pythagoras.md (14 task, 72 step TDD)
- src/strategy_pythagoras/Pythagoras/*.summary.md (riassunti numerici dei 2 PDF)
- src/strategy_pythagoras/Pythagoras/_extracted/*.txt (estrazione testo grezzo via pypdf)

I PDF stessi non vengono committati (vedi .gitignore).
2026-05-19 13:03:09 +00:00

344 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# strategy_pythagoras — Design
**Data:** 2026-05-19
**Autore design:** Adriano Dal Pastro (con Claude/brainstorming)
**Stato:** Design approvato per parti 1-4, in attesa di review utente sulla spec consolidata
**Audience:** implementatori (Claude executor o umano)
## 0. Riassunto esecutivo
Nuovo workspace member `strategy_pythagoras` parallelo a `strategy_crypto`. Replica il pattern coevolutivo GA del monorepo applicato a un dominio diverso: la **scoperta di pattern frattali ricorrenti** sui mercati crypto secondo il framework Pythagoras-Malanga (Fourier + frattali + geometria Evideon), descritto nei due PDF in `src/strategy_pythagoras/Pythagoras/`.
**Non cambia il genoma del core:** gli agenti restano `HypothesisAgentGenome` e producono `Strategy JSON` nella stessa DSL S-expression. Cambiano:
- 7 stili cognitivi Pythagoras-themed (in `prompts.json`)
- 3 nuovi indicatori candle (`candle_pattern`, `pythagorean_ratio`, `fractal_mirror`)
- Fitness con bonus di asset-invariance BTC↔ETH
- Output: strategie JSON freezate + dashboard NiceGUI + report markdown di analisi cross-book
**Deliverable di chiusura task:** scaffolding completo + 1 GA run short (smoke test) + `docs/analysis_first_run.md` con sintesi numerica e top winners.
---
## 1. Architettura
### Layout package
```
src/strategy_pythagoras/
├── pyproject.toml # workspace member, dipende da multi-swarm-core
├── README.md
├── tests/
│ └── test_indicators.py # unit-test per i 3 nuovi indicatori
└── strategy_pythagoras/
├── __init__.py
├── prompts.json # 7 stili Pythagoras-aligned (schema v3.2 di strategy_crypto)
├── indicators.py # candle_pattern, pythagorean_ratio, fractal_mirror
├── backend/
│ ├── __init__.py
│ ├── schema.py # tabelle paper_trading_*
│ ├── executor.py # PaperExecutor (port da strategy_crypto)
│ ├── portfolio.py # Portfolio (port da strategy_crypto)
│ └── persistence.py # PaperRepository
├── frontend/
│ ├── __init__.py
│ ├── nicegui_app.py # /strategy_pythagoras_gui
│ └── data.py # dual-reader: GA db + paper db + invariance metrics
└── strategies/ # JSON winners shippati col package
└── (vuoto al t0)
```
### Workspace registration
In `pyproject.toml` (root):
```toml
[tool.uv.workspace]
members = ["src/multi_swarm_core", "src/strategy_crypto", "src/strategy_pythagoras"]
[tool.uv.sources]
strategy-pythagoras = { workspace = true }
```
Aggiungere `strategy-pythagoras` a `[project].dependencies` per il deployable root.
### Riuso
| Componente | Source | Note |
|---|---|---|
| GA loop, mutation, crossover | `multi_swarm_core.ga` | invariato |
| Protocol parser/validator/compiler | `multi_swarm_core.protocol` | esteso con 3 indicatori (vedi §2) |
| Backtest engine | `multi_swarm_core.backtest` | invariato |
| LLM / OpenRouter / Anthropic clients | `multi_swarm_core.llm` | invariato |
| PaperExecutor + Portfolio | `strategy_crypto.backend` | **port** (non import), per isolamento DB |
| NiceGUI dashboard shell | `strategy_crypto.frontend` | **port** + adatta tabs |
### Persistence
```
state/strategy_pythagoras.db # GA: genomi, generazioni, fitness history
state/strategy_pythagoras_paper.db # paper-trading post-deploy
strategy_pythagoras/strategies/ # JSON winners shippati
docs/analysis_first_run.md # report cross-book
docs/analysis_runs/<run-id>/ # per-run dump
```
Env vars:
- `STRATEGY_PYTHAGORAS_DB_PATH` (default `state/strategy_pythagoras.db`)
- `STRATEGY_PYTHAGORAS_PAPER_DB_PATH` (default `state/strategy_pythagoras_paper.db`)
- `GA_INVARIANCE_ALPHA` (default 0.3)
- `GA_INVARIANCE_TOLERANCE_BARS` (default 36 = ±3h su 5m TF)
### Routing GUI
`/strategy_pythagoras_gui` (allinea a [[gui_subpath_routing]] in memory: ogni asset GUI su subpath, root dominio libera).
### Docker (Phase 2, fuori scope di questa spec)
Servizi paralleli a quelli di strategy_crypto:
- `strategy-pythagoras-paper` (runner)
- `strategy-pythagoras-gui` (dashboard)
Rete Traefik external, bind mount uid 1000 (vedi [[production_deployment]]).
---
## 2. Genoma e DSL
### Il genoma non cambia
`HypothesisAgentGenome` di `multi_swarm_core.genome.hypothesis` resta identico:
- `system_prompt: str`
- `feature_access: list[str]`
- `temperature: float`
- `top_p: float`
- `model_tier: ModelTier`
- `lookback_window: int` — vincolo 12 ≤ lw ≤ 200
- `cognitive_style: str` — uno dei 7 nuovi stili
- `parent_ids, generation, id` — invariati
### 3 nuovi indicatori (`strategy_pythagoras/indicators.py`)
| Nome | Params (JSON) | Output | Semantica operativa |
|---|---|---|---|
| `candle_pattern` | `[seq_str]` es. `"UDU"`, `"UUD0U"` | 1.0 se le ultime k=len(seq_str) candele matchano la sequenza, 0.0 altrimenti | `"U"` = close>open; `"D"` = close<open; `"0"` = `abs(close-open)/open < 0.001` |
| `pythagorean_ratio` | `[lookback: int]` | float = `max(close[-lookback:]) / min(close[-lookback:])` | Ratio prezzo, da confrontare con literal vicini a φ=1.618, π=3.1416, √2=1.414, e=2.718 |
| `fractal_mirror` | `[k: int, axis: str]` axis ∈ `{"h","v"}` | float ∈ [-1, +1] | Correlazione di Pearson tra ultime k candele e loro mirror: `"h"` = mirror tempo (inversione sequenza); `"v"` = mirror prezzo (1 - close/max) |
Vincoli del compiler:
- `candle_pattern`: `len(seq_str)` ∈ [3, 12], simboli ∈ `{U,D,0}`
- `pythagorean_ratio`: `lookback` ∈ [12, 200]
- `fractal_mirror`: `k` ∈ [3, 12], `axis``{"h","v"}`
Tutti e 3 vanno aggiunti a `KNOWN_INDICATORS` in `multi_swarm_core.protocol.grammar`.
### Esempio strategy JSON tipica
```json
{
"rules": [
{
"condition": {
"op": "and",
"args": [
{"op": "eq", "args": [
{"kind": "indicator", "name": "candle_pattern", "params": ["UDDU"]},
{"kind": "literal", "value": 1.0}
]},
{"op": "gt", "args": [
{"kind": "indicator", "name": "pythagorean_ratio", "params": [89]},
{"kind": "literal", "value": 1.618}
]}
]
},
"action": "entry-long"
},
{
"condition": {
"op": "or", "args": [
{"op": "gt", "args": [
{"kind": "indicator", "name": "pythagorean_ratio", "params": [89]},
{"kind": "literal", "value": 2.618}
]},
{"op": "crossunder", "args": [
{"kind": "indicator", "name": "fractal_mirror", "params": [12, "h"]},
{"kind": "literal", "value": 0.0}
]}
]
},
"action": "exit"
}
]
}
```
### Vincoli protettivi (anti-overfitting)
- `lookback_window ≤ 200`
- `candle_pattern` seq length ∈ [3, 12] (range 1+2 del Libro dei Frattali)
- `time_in_market` monitorato come metric (red flag [[selectivity_red_flag]]); non hard-gate al primo run
- Letterali con `pythagorean_ratio`: max 4 decimali (no `1.6180339`)
- Max 4 condizioni in AND per regola (eredita da prompts.json)
---
## 3. Stili cognitivi (`strategy_pythagoras/prompts.json`)
### Schema
Schema v3.2 identico a `strategy_crypto/prompts.json` (campi `_schema`, `_changelog`, `_design_invariants`, `agent_role`, `pattern_guidance`, `instruction`, `domain_warnings`, `anti_patterns`, `output_priorities`, `styles`).
### `agent_role`
> Sei un agente di un sistema swarm coevolutivo che cerca pattern frattali ricorrenti sui mercati crypto secondo il framework Pythagoras-Malanga (frattali H-C, trasformata di Fourier, geometria Evideon). Sei parte di una popolazione che esplora collettivamente lo spazio dei pattern: la diversità delle ipotesi è un asset critico. Preferisci esplorare strutture meno ovvie per la tua lente cognitiva. La strategia che produci deve essere riconoscibile come emanata dal tuo stile.
### `pattern_guidance` (specifico Pythagoras)
- Sequenze candle 3-12 lunghezza in alfabeto `{U,D,0}` via `candle_pattern`
- Mirror H/V come operatori di proiezione via `fractal_mirror`
- Ratios di prezzo vicini a φ=1.618, 1/φ=0.618, √2=1.414, π/2=1.571, e/2=1.359 entro tolleranza 0.5%
- Pattern composti: pattern lunghi (6-12) come concatenazione di pattern corti (Pattern 13 = Pattern 3 + Pattern 11, p. 53 del paper)
- Cicli ricorrenti: stesso pattern firato a distanze regolari (Poincaré)
### `domain_warnings`
- Crypto 24/7, no CME gap
- I "numeri sacri" (Solfeggio 396-852 Hz, 137.0359, etc.) sono prior teorici, NON leggi: usali come scale candidate, non come dogma
- Il paper Pythagoras è esplicitamente non-falsificabile (cita "consapevolezza del trader" come jolly per il fallimento): il backtest è l'unico arbitro
- `time_in_market > 80%` red flag (leveraged B&H camuffato)
- Tolleranza ±3h del paper → su 5m TF = ±36 barre
### `anti_patterns`
- Sequenza `candle_pattern` con `len > 7` simboli vincolati → overfitting
- `pythagorean_ratio` con tolleranza > 2% sui literal → numerologia spuriosa
- `fractal_mirror` con `k == lookback_window` → tautologico
- Letterali con più di 4 decimali
- Più di 4 condizioni in AND
- Crossover tra indicatori dello stesso tipo con lookback vicini → chattering
### `output_priorities`
1. **Coerenza con lente cognitiva** (es. `pythagorean` usa ratios, `candle_grammarian` usa sequenze esplicite)
2. **Asset-invariance** (segnali che attivano sia su BTC che su ETH entro ±36 barre)
3. **Selettività** (poche entry forti)
4. **Composizionalità** (pattern lunghi come somma di corti)
5. **Robustezza vs random baseline** (3σ richiesto da `skeptic_quant`)
### I 7 stili (`styles`)
Ogni stile mantiene shape v3.2 (directive 800-950 char ASCII-safe, `focus_metrics` 4 voci, ultimo periodo = "Archetipo dominante: X.", lookback range esplicito):
| `cognitive_style` | Archetipo / Metafora ancorante | `focus_metrics` | Lookback consigliato |
|---|---|---|---|
| `pythagorean` | Armonia di ratios sacri (φ, π, √2) | `pythagorean_ratio`, `candle_pattern`, `sma_pct`, `realized_vol` | 89-144 |
| `fractal_geometer` | Autosimilarità: pattern di 3 candele si ripetono dilatati a 6, 12 | `candle_pattern`, `fractal_mirror`, `atr_pct`, `pythagorean_ratio` | 48-144 |
| `fourier_analyst` | Somma di seni: frequenze ricorrenti dominanti | `sma_pct`, `realized_vol`, `candle_pattern`, `atr` | 60-200 |
| `evideonic_projector` | Presente = passato proiettato via mirror H+V e scale | `fractal_mirror`, `pythagorean_ratio`, `candle_pattern`, `sma_pct` | 24-96 |
| `candle_grammarian` | Lingua di 3 simboli (U,D,0); parole 3-12 lettere | `candle_pattern`, `volume`, `atr`, `realized_vol` | 12-48 |
| `recurrence_theorist` | Per Poincaré, eventi tornano: cerca pattern di oggi che firarono ieri | `candle_pattern`, `fractal_mirror`, `pythagorean_ratio`, `sma_pct` | 100-200 |
| `skeptic_quant` | Anticorpo all'unfalsifiability: solo edge 3σ vs random | `realized_vol`, `atr_pct`, `sma_pct`, `candle_pattern` | 60-150 |
Lo `skeptic_quant` è importante: la sua directive richiede esplicitamente che la strategia sia testabile e che il fitness sia confrontato contro random baseline.
### `_design_invariants`
Stessa filosofia di v3.2 di strategy_crypto:
- ASCII-safe (no Unicode oltre U+007F nelle directive)
- Ogni directive chiude con `Archetipo dominante: <metafora>.`
- Ogni directive ha range lookback numerico esplicito
- Prima frase: `Il mercato e ...`
- Lunghezza 800-950 char
---
## 4. Fitness, run GA short, deliverable analisi
### Fitness con bonus invariance
```
fitness(genome) = mean(sharpe_BTC, sharpe_ETH) × (1 + α × invariance_score)
invariance_score = corr_signal(entries_BTC, entries_ETH, tolerance_bars=GA_INVARIANCE_TOLERANCE_BARS)
∈ [0, 1]
α = GA_INVARIANCE_ALPHA (default 0.3)
```
`corr_signal` = frazione di entries su BTC che hanno una entry corrispondente su ETH entro ±36 barre (=±3h su 5m TF).
Implementazione come callback al GA in `multi_swarm_core.ga`, registrata da `strategy_pythagoras` al startup. Il core non sa nulla di Pythagoras: riceve solo la callback.
### GA run short (smoke test)
| Parametro | Valore | Note |
|---|---|---|
| `population_size` | 20 | minimo per 7 stili (~3 per stile) |
| `generations` | 5 | smoke test, non training |
| `elite_fraction` | 0.2 | top-4 sopravvivono |
| `mutation_rate` | 0.3 | invariato vs strategy_crypto |
| `crossover_rate` | 0.5 | invariato |
| `model_tier` distribuzione | 70% C (qwen-2.5-72b), 30% B (sonnet) | rispetta [[model_qwen_dependency]] |
| `dataset` | BTC 5m + ETH 5m da `strategy_crypto/series/` | riusa serie esistenti |
| `train_window` | 2024-07 → 2024-12 | copre le date Pythagoras (lug-ago 2024) |
| `test_window` | 2025-01 (1 mese) | hold-out per validare invariance |
| `name` | `pythagoras-smoke-001` | run id |
Lo smoke test verifica:
1. Workspace member installato in venv (`uv sync` + `uv run python -c "import strategy_pythagoras"`)
2. I 3 nuovi indicatori registrati nel grammar e compilabili
3. `prompts.json` caricato, 7 stili producono genomi distinti (no collisioni di id)
4. Bonus invariance impatta fitness (verifica via log)
5. JSON winners atterrano in `strategy_pythagoras/strategies/`
6. Dashboard NiceGUI si avvia e legge i due DB
### Deliverable analisi cross-book
`docs/analysis_first_run.md` con:
1. **Sintesi numerica dei riassunti** — riferimenti a `src/strategy_pythagoras/Pythagoras/Pythagoras_Trading_Prediction.summary.md` e `Libro_frattali.summary.md`
2. **Top-5 winners** — id, cognitive_style, fitness, sharpe_BTC, sharpe_ETH, invariance_score
3. **Pattern frattali emersi** — dump dei `candle_pattern` seq usate, conteggio per stile, % sovrapposizione con spazio teorico dei 57 pattern del Libro
4. **Ratios di prezzo emersi** — distribuzione literal usati con `pythagorean_ratio`, distanza dai numeri universali (φ/π/√2/Solfeggio)
5. **Cross-asset invariance osservata** — istogramma di `corr_signal` per top genomi
6. **Conclusione onesta** — confronto vs random baseline, quanti winners superano sharpe>1.0 su test + invariance>0.3, cosa il framework Pythagoras predice e cosa NON regge al backtest
Niente "consapevolezza" come jolly. Solo numeri.
### Dashboard NiceGUI
`/strategy_pythagoras_gui`:
- Tab **Genomes** — winners con stile/sharpe/invariance, click per drill su rules
- Tab **Patterns** — heatmap delle sequenze `candle_pattern` emerse, frequenza per stile
- Tab **Ratios** — istogramma literal vicini a costanti universali, bins centrati su φ, π, √2, ecc.
- Tab **Invariance** — scatter sharpe_BTC vs sharpe_ETH per ogni winner
---
## 5. Out-of-scope (esplicito)
- **Asset oltre BTC/ETH** (Oro/Argento del paper): non in primo run. Estensione futura.
- **Range candele oltre 12**: range 3-5 del Libro (12-56 candele). Estensione futura quando lo smoke test conferma stabilità.
- **Live trading reale**: solo paper-trading via stesso pattern di strategy_crypto.
- **OCR/Vision sulle figure del Libro dei Frattali**: esplicitamente ESCLUSO da request utente ("senza passare alle immagini").
- **Modifica del genoma del core**: nessuna modifica a `HypothesisAgentGenome`. Solo extension del grammar (3 indicatori).
- **Riferimenti pseudoscientifici operativizzati come legge**: i numeri sacri/Solfeggio sono prior teorici per literal candidati, non vincoli rigidi.
---
## 6. Criteri di accettazione
- [ ] `uv sync` riesce dalla root con `strategy_pythagoras` come member
- [ ] `uv run python -c "from strategy_pythagoras.indicators import candle_pattern, pythagorean_ratio, fractal_mirror"` non solleva
- [ ] `pytest src/strategy_pythagoras/tests/` verde (almeno unit-test per i 3 indicatori)
- [ ] GA short run `pythagoras-smoke-001` completa 5 generazioni senza errori
- [ ] Almeno 1 winner con fitness > 0 e `cognitive_style` ∈ {7 stili Pythagoras}
- [ ] Dashboard avvia su `http://localhost:PORT/strategy_pythagoras_gui` e mostra winners
- [ ] `docs/analysis_first_run.md` esiste e contiene tutte le sezioni elencate in §4
---
## 7. Riferimenti
- [Pythagoras Trading Prediction — riassunto](../../../src/strategy_pythagoras/Pythagoras/Pythagoras_Trading_Prediction.summary.md)
- [Libro dei Frattali — riassunto](../../../src/strategy_pythagoras/Pythagoras/Libro_frattali.summary.md)
- Memory: [[monorepo_uv_workspace]], [[gui_subpath_routing]], [[ownership_per_modulo]], [[production_deployment]], [[model_qwen_dependency]], [[selectivity_red_flag]]
- Template: `src/strategy_crypto/` (paper-trading + GUI), `src/strategy_crypto/strategy_crypto/prompts.json` (schema v3.2)
- Core: `src/multi_swarm_core/multi_swarm_core/genome/hypothesis.py`, `multi_swarm_core/protocol/grammar.py`