' LOTTO AVENGERS 2026 - BACKTEST TAVOLA SETTENARIA (SpazioScript v1.3)
' Novita': ruota configurabile in UN solo punto + report con nome ruota
Dim Famiglie(20, 12)
Dim FamiglieLunghezza(20)
Dim FamiglieID(20)
Dim NumeriVisitati(90)
Dim NumFamiglie
' >>> VARIABILI RUOTA (globali, le legge anche il report) <<<
Dim CodiceRuota
Dim sNomeRuota
Sub Main()
' ============================================================
' >>> CAMBIA QUI LA RUOTA DA ANALIZZARE <<<
' Codici: 1=Bari, 2=Cagliari, 3=Firenze, 4=Genova, 5=Milano,
' 6=Napoli, 7=Palermo, 8=Roma, 9=Torino, 10=Venezia,
' 12=Nazionale
' ============================================================
CodiceRuota = 1
sNomeRuota = NomeRuota(1)
GeneraFamiglie()
EseguiBacktest()
End Sub
Sub GeneraFamiglie()
Dim i, n, j, Current, Lunghezza
For i = 1 To 90
NumeriVisitati(i) = 0
Next
NumFamiglie = 0
For n = 1 To 90
If NumeriVisitati(n) = 0 Then
NumFamiglie = NumFamiglie + 1
Current = n
Lunghezza = 0
Do
NumeriVisitati(Current) = 1
Lunghezza = Lunghezza + 1
Famiglie(NumFamiglie, Lunghezza) = Current
Current = (Current * 7) Mod 90
If Current = 0 Then
Current = 90
End If
Loop While NumeriVisitati(Current) = 0
FamiglieLunghezza(NumFamiglie) = Lunghezza
FamiglieID(NumFamiglie) = n
End If
Next
Scrivi "Generate " & NumFamiglie & " famiglie settenarie uniche."
End Sub
Function Comb(n, k)
Dim i, result
If k < 0 Or k > n Then
Comb = 0
Exit Function
End If
If k = 0 Or k = n Then
Comb = 1
Exit Function
End If
If k > n - k Then
k = n - k
End If
result = 1
For i = 0 To k - 1
result = result * (n - i) / (i + 1)
Next
Comb = result
End Function
Function ProbAlmeno2In1Estrazione(nGiocati)
Dim totale, p_zero, p_uno
If nGiocati < 2 Then
ProbAlmeno2In1Estrazione = 0
Exit Function
End If
totale = Comb(90, 5)
p_zero = Comb(nGiocati, 0) * Comb(90 - nGiocati, 5) / totale
p_uno = Comb(nGiocati, 1) * Comb(90 - nGiocati, 4) / totale
ProbAlmeno2In1Estrazione = 1 - p_zero - p_uno
End Function
Function ProbAlmeno1In3Estrazioni()
ProbAlmeno1In3Estrazioni = 1 - (85/90)^3
End Function
Function ProbAmbo2NumeriIn3Estrazioni()
Dim p_ambo_1
p_ambo_1 = Comb(2, 2) * Comb(88, 3) / Comb(90, 5)
ProbAmbo2NumeriIn3Estrazioni = 1 - (1 - p_ambo_1)^3
End Function
Function ZScore(pEmpirica, pTeorica, nCampioni)
Dim std_dev
If nCampioni = 0 Then
ZScore = 0
Exit Function
End If
std_dev = Sqr(pTeorica * (1 - pTeorica) / nCampioni)
If std_dev = 0 Then
ZScore = 0
Exit Function
End If
ZScore = (pEmpirica - pTeorica) / std_dev
End Function
Sub EseguiBacktest()
Dim Attivazioni(20), TestA_Successi(20), TestB_Successi(20)
Dim TestC_Successi(20), TestD_CoppieTotali(20), TestD_CoppieVincenti(20)
Dim TestC_Count(20), TestD_Count(20)
Dim i, f, j, k, a, b, c1, c2, m
Dim NumEstrazioni, EstrazioneCorrente(5), EstrazioneFutura(5)
Dim Lunghezza, NumeriPresenti, Trovato, NMancanti, Mancanti(12)
Dim TestA_OK, TestB_OK, TestC_OK, Colpiti
Dim PrimoTrovato, SecondoTrovato, PrimoIn, SecondoIn
Dim temp, probC, idx
For i = 1 To 20
Attivazioni(i) = 0
TestA_Successi(i) = 0
TestB_Successi(i) = 0
TestC_Successi(i) = 0
TestD_CoppieTotali(i) = 0
TestD_CoppieVincenti(i) = 0
TestC_Count(i) = 0
TestD_Count(i) = 0
Next
On Error Resume Next
NumEstrazioni = EstrazioniArchivio
If Err.Number <> 0 Then
NumEstrazioni = 1000
End If
On Error GoTo 0
Scrivi "================================================================="
Scrivi "RUOTA ANALIZZATA: " & sNomeRuota & " (codice " & CodiceRuota & ")"
Scrivi "================================================================="
Scrivi "Inizio backtest su " & NumEstrazioni & " estrazioni..."
For i = 1 To NumEstrazioni - 3
' Estrazione corrente: usa CodiceRuota (prima era il fisso 1)
On Error Resume Next
For k = 1 To 5
EstrazioneCorrente(k) = Estratto(i, k, CodiceRuota)
Next
If Err.Number <> 0 Then
Exit Sub
End If
On Error GoTo 0
For f = 1 To NumFamiglie
Lunghezza = FamiglieLunghezza(f)
NumeriPresenti = 0
For j = 1 To Lunghezza
For k = 1 To 5
If Famiglie(f, j) = EstrazioneCorrente(k) Then
NumeriPresenti = NumeriPresenti + 1
End If
Next
Next
If NumeriPresenti >= 2 Then
Attivazioni(f) = Attivazioni(f) + 1
NMancanti = 0
For j = 1 To Lunghezza
Trovato = 0
For k = 1 To 5
If Famiglie(f, j) = EstrazioneCorrente(k) Then
Trovato = 1
End If
Next
If Trovato = 0 Then
NMancanti = NMancanti + 1
If NMancanti <= 12 Then
Mancanti(NMancanti) = Famiglie(f, j)
End If
End If
Next
' Bubble sort semplice
For a = 1 To NMancanti - 1
For b = 1 To NMancanti - a
If b + 1 <= NMancanti Then
If Mancanti(b) > Mancanti(b + 1) Then
temp = Mancanti(b)
Mancanti(b) = Mancanti(b + 1)
Mancanti(b + 1) = temp
End If
End If
Next
Next
TestA_OK = 0
TestB_OK = 0
TestC_OK = 0
If NMancanti >= 2 Then
For c1 = 1 To NMancanti - 1
For c2 = c1 + 1 To NMancanti
TestD_CoppieTotali(f) = TestD_CoppieTotali(f) + 1
Next
Next
End If
For j = 1 To 3
' Estrazione futura: usa CodiceRuota (prima era il fisso 1)
On Error Resume Next
For k = 1 To 5
EstrazioneFutura(k) = Estratto(i + j, k, CodiceRuota)
Next
On Error GoTo 0
Colpiti = 0
For m = 1 To NMancanti
For k = 1 To 5
If Mancanti(m) = EstrazioneFutura(k) Then
Colpiti = Colpiti + 1
End If
Next
Next
If TestA_OK = 0 And NMancanti > 0 Then
For k = 1 To 5
If Mancanti(1) = EstrazioneFutura(k) Then
TestA_OK = 1
End If
Next
End If
If TestB_OK = 0 And NMancanti >= 2 Then
PrimoTrovato = 0
SecondoTrovato = 0
For k = 1 To 5
If Mancanti(1) = EstrazioneFutura(k) Then
PrimoTrovato = 1
End If
If Mancanti(2) = EstrazioneFutura(k) Then
SecondoTrovato = 1
End If
Next
If PrimoTrovato = 1 And SecondoTrovato = 1 Then
TestB_OK = 1
End If
End If
If TestC_OK = 0 And Colpiti >= 2 Then
TestC_OK = 1
End If
If NMancanti >= 2 Then
idxD = 0
For c1 = 1 To NMancanti - 1
For c2 = c1 + 1 To NMancanti
idxD = idxD + 1
PrimoIn = 0
SecondoIn = 0
For k = 1 To 5
If Mancanti(c1) = EstrazioneFutura(k) Then
PrimoIn = 1
End If
If Mancanti(c2) = EstrazioneFutura(k) Then
SecondoIn = 1
End If
Next
If PrimoIn = 1 And SecondoIn = 1 Then
TestD_CoppieVincenti(f) = TestD_CoppieVincenti(f) + 1
End If
Next
Next
End If
Next
If TestA_OK = 1 Then
TestA_Successi(f) = TestA_Successi(f) + 1
End If
If TestB_OK = 1 Then
TestB_Successi(f) = TestB_Successi(f) + 1
End If
If TestC_OK = 1 Then
TestC_Successi(f) = TestC_Successi(f) + 1
End If
If NMancanti >= 2 Then
probC = 1 - (1 - ProbAlmeno2In1Estrazione(NMancanti))^3
TestC_Count(f) = TestC_Count(f) + 1
End If
End If
Next
' Progresso ogni 1000 estrazioni
If i Mod 1000 = 0 Then
Scrivi "Elaborate " & i & " estrazioni..."
End If
Next
' Stampa risultati
Dim pTeorica_1num, pTeorica_ambo
pTeorica_1num = ProbAlmeno1In3Estrazioni()
pTeorica_ambo = ProbAmbo2NumeriIn3Estrazioni()
Scrivi "================================================================="
Scrivi "BACKTEST TAVOLA SETTENARIA - RISULTATI"
Scrivi "RUOTA: " & sNomeRuota & " (codice " & CodiceRuota & ")"
Scrivi "================================================================="
Scrivi "Baselines teoriche:"
Scrivi " TEST A (1 numero secco): " & FormatNumber(pTeorica_1num * 100, 2) & "%"
Scrivi " TEST B (ambo 2 numeri): " & FormatNumber(pTeorica_ambo * 100, 3) & "%"
Scrivi "================================================================="
Scrivi ""
Dim TotAttivazioni, TotA, TotB, TotC, TotD_Coppie, TotD_Vin
TotAttivazioni = 0
TotA = 0
TotB = 0
TotC = 0
TotD_Coppie = 0
TotD_Vin = 0
For f = 1 To NumFamiglie
Dim att, pA, zA, pB, zB, pC, pD
att = Attivazioni(f)
If att > 0 Then
pA = TestA_Successi(f) / att
zA = ZScore(pA, pTeorica_1num, att)
pB = TestB_Successi(f) / att
zB = ZScore(pB, pTeorica_ambo, att)
pC = TestC_Successi(f) / att
pD = 0
If TestD_CoppieTotali(f) > 0 Then
pD = TestD_CoppieVincenti(f) / TestD_CoppieTotali(f)
End If
Scrivi "Famiglia_" & FamiglieID(f) & " | Attiv: " & att & " | A: " & FormatNumber(pA * 100, 2) & "% (z:" & FormatNumber(zA, 2) & ") | B: " & FormatNumber(pB * 100, 3) & "% (z:" & FormatNumber(zB, 2) & ")"
TotAttivazioni = TotAttivazioni + att
TotA = TotA + TestA_Successi(f)
TotB = TotB + TestB_Successi(f)
TotC = TotC + TestC_Successi(f)
TotD_Coppie = TotD_Coppie + TestD_CoppieTotali(f)
TotD_Vin = TotD_Vin + TestD_CoppieVincenti(f)
End If
Next
Scrivi "================================================================="
Scrivi "TOTALI GLOBALI - RUOTA " & UCase(sNomeRuota)
Scrivi "================================================================="
Scrivi "Attivazioni totali: " & TotAttivazioni
Scrivi "Coppie testate: " & TotD_Coppie
Scrivi ""
If TotAttivazioni > 0 Then
Dim pA_Tot, zA_Tot, pB_Tot, zB_Tot, pC_Tot, pD_Tot
pA_Tot = TotA / TotAttivazioni
zA_Tot = ZScore(pA_Tot, pTeorica_1num, TotAttivazioni)
pB_Tot = TotB / TotAttivazioni
zB_Tot = ZScore(pB_Tot, pTeorica_ambo, TotAttivazioni)
pC_Tot = TotC / TotAttivazioni
pD_Tot = 0
If TotD_Coppie > 0 Then
pD_Tot = TotD_Vin / TotD_Coppie
End If
Scrivi "TEST A: Empirico " & FormatNumber(pA_Tot * 100, 2) & "% | Teorico " & FormatNumber(pTeorica_1num * 100, 2) & "% | z-score: " & FormatNumber(zA_Tot, 2)
Scrivi "TEST B: Empirico " & FormatNumber(pB_Tot * 100, 3) & "% | Teorico " & FormatNumber(pTeorica_ambo * 100, 3) & "% | z-score: " & FormatNumber(zB_Tot, 2)
Scrivi "TEST C: Empirico " & FormatNumber(pC_Tot * 100, 2) & "%"
Scrivi "TEST D: Empirico " & FormatNumber(pD_Tot * 100, 3) & "%"
End If
Scrivi "================================================================="
Scrivi "Backtest completato per " & sNomeRuota & "!"
End Sub