Metodologia
Come funziona l'analisi
Un'architettura trasparente basata su dati astronomici reali, calcolo geometrico degli aspetti planetari, un motore di scoring con apprendimento adattivo e generazione del testo via intelligenza artificiale.
Flusso di elaborazione
Profilo natale
Dalla data di nascita viene ricavata la longitudine eclittica del Sole natale in gradi (0°–360°) tramite la formula di approssimazione J2000.0, standard in astronomia per il calcolo delle effemeridi solari.
Se l'utente ha inserito ora e coordinate di nascita nel profilo, viene calcolato l'ascendente — il punto dell'eclittica che transitava sull'orizzonte al momento della nascita — anch'esso in longitudine assoluta. L'ascendente aggiunge un secondo punto natale di riferimento per il calcolo degli aspetti.
n = JD - 2451545.0 // giorni dal 1 gen 2000
L = 280.459 + 0.9856474 × n // longitudine media
g = 357.529 + 0.9856003 × n // anomalia media
λ = L + 1.915 × sin(g) + 0.020 × sin(2g)
Posizioni planetarie reali — NASA JPL Horizons
Per ogni data di analisi, il sistema interroga l'API NASA JPL Horizons per ottenere le posizioni di 7 corpi celesti: Sole, Luna, Mercurio, Venere, Marte, Giove, Saturno.
Il parametro richiesto è QUANTITIES=31 — longitudine eclittica geocentrica osservata (standard astrologia tropicale occidentale) in gradi decimali 0°–360°. Il moto retrogrado viene rilevato confrontando la longitudine del giorno con quella del giorno successivo: una decrescita monotona (con Δ < 180°) indica retrogradazione.
Le posizioni vengono cachate per 6 ore su file JSON giornalieri. Il prefetch multi-giorno usa curl_multi_exec per recuperare tutti i 7 pianeti in parallelo (~1-2 secondi invece di ~8).
Calcolo degli aspetti e feature engineering
Il nucleo del motore è il calcolo degli aspetti planetari: la distanza angolare tra ogni pianeta in transito e i punti natali dell'utente (Sole natale, Ascendente). Quando questa distanza cade entro una tolleranza (orb) da certi angoli canonici, si definisce un aspetto.
| Aspetto | Angolo | Orb | Tipo | Forza |
|---|---|---|---|---|
| Congiunzione | 0° | ±8° | Armonico |
1 - (dist/orb)
|
| Sestile | 60° | ±6° | Armonico |
1 - (dist/orb)
|
| Quadratura | 90° | ±6° | Teso |
1 - (dist/orb)
|
| Trigono | 120° | ±6° | Armonico |
1 - (dist/orb)
|
| Opposizione | 180° | ±8° | Teso |
1 - (dist/orb)
|
La forza dell'aspetto (0.0–1.0) è inversamente proporzionale alla distanza dall'angolo esatto: un aspetto perfetto vale 1.0, uno al limite dell'orb vale ~0. Oltre alle forze dei singoli aspetti, vengono calcolati tre aggregati:
- harmonic_count — somma delle forze di congiunzione + sestile + trigono
- tense_count — somma delle forze di quadratura + opposizione
- net_harmony — harmonic_count − tense_count
A queste si aggiungono le feature di elemento (binarie 0/1: il pianeta transita in un segno di Fuoco, Terra, Aria, Acqua?) e le distanze angolari normalizzate (0° → 1.0, 180° → 0.0) per ciascun pianeta rispetto al Sole natale.
Motore di scoring — modello lineare con pesi adattativi
Le feature estratte (circa 20–25 per ciascun punto di riferimento natale) vengono combinate in un modello lineare pesato. Per ciascuno dei 4 domini base, il punteggio grezzo è:
score_final = clamp( score_raw, 0, 100 )
◈
Energia
Vitalità fisica, iniziativa, drive
◉
Relazioni
Interazioni sociali, empatia, armonia
◎
Mente
Lucidità, concentrazione, comunicazione
◌
Emozioni
Equilibrio interiore, stabilità affettiva
Gli utenti Premium ricevono 4 score aggiuntivi calcolati sui 4 base più il profilo natale completo:
I pesi iniziali (seed v1) derivano da principi astrologici classici: per esempio, Marte in tensione con il Sole natale abbassa l'Energia, un trigono Luna–Sole la aumenta. I pesi sono salvati in un file JSON versionato (horoscope_weights.json) e vengono aggiornati nel tempo tramite online learning.
Apprendimento adattivo dal feedback
Quando un utente fornisce feedback numerico (1–5 stelle per dominio), il sistema aggiorna i pesi del modello con un passo di gradient descent online:
new_weight = old_weight + lr × error × feature_value
new_bias = old_bias + lr × error × 0.1
// lr = 0.015 | pesi clampati in [−25, 25]
Il feedback 1–5 viene convertito in scala 0–100: (stars − 1) / 4 × 100. Ogni aggiornamento incrementa il numero di versione del modello, tracciabile nel file dei pesi. Il modello migliora quindi con l'uso, calibrandosi progressivamente sulle percezioni reali degli utenti.
Generazione del testo via AI
Gli score numerici e i dati planetari vengono assemblati in un prompt strutturato e inviati a GPT-4o mini (OpenAI) per la generazione del testo interpretativo. Il prompt include: profilo natale, score per dominio con trend, posizioni planetarie, fase lunare, stagione, highlights calcolati algoritmicamente.
Il testo generato viene poi suddiviso in sezioni tematiche (energia, relazioni, mente, emozioni, consiglio del giorno) tramite parsing del markup dell'AI. In assenza di connettività all'API OpenAI, un generatore di testo template-based garantisce un fallback sempre funzionante.
Astrologo AI — chat contestuale
La chat con l'Astrologo AI (funzionalità Premium) opera con un system prompt dinamico costruito a ogni sessione, che include il profilo astrologico completo, la lettura odierna integrale (testo + score + pianeti), lo storico delle ultime 10 letture con eventuali valutazioni, e le statistiche di accuratezza percepita per dominio.
L'AI non risponde in modo generico: ogni risposta è ancorata ai dati reali dell'utente e alla data corrente. La cronologia della conversazione (fino a 30 messaggi) viene inclusa nel contesto per garantire coerenza narrativa.
Nota metodologica
Il sistema utilizza dati astronomici reali e un modello algoritmico trasparente. L'astrologia non è una disciplina scientifica e non ha capacità predittive causalmente dimostrate. Gli score prodotti sono una trasformazione matematica di posizioni geometriche — offrono un frame interpretativo, non una previsione. Il sistema è progettato per essere massimamente trasparente sulla propria natura computazionale.
Crea un account per salvare lo storico e accedere alle funzionalità premium.