Algoritmi genetici (1 Viewer)

Skarso

Forumer attivo
e questa invece è la routine FINDBESTX1 dove viene esaminato ogni cromosoma per sciegliere e quello che ha dato i risultati migliori da utilizzare per la previsione del giorno “k” e i primi 10 ( Limeio ) che serviranno per la prossima generazione

Codice:
Ultimo = k
    '
    best(0) = Bestz
    Best2 = -999
    '
    For r = 1 To Ncromo
        cumx = 0
        ' recupera dist1 e dist2 dal cromosoma r-simo
        S = Tabcromo(r)
        cromo1 = Left(S, LLvar1)
        T = Left(S, LLvar1 + LLvar2)
        cromo2 = Right(T, LLvar2)
        dist1 = 0.5 + 0.05 * Convtodec(cromo1, LLvar1)
        dist2 = 0.5 + 0.05 * Convtodec(cromo2, LLvar2)
        '
        ' recupera le rules dal cromosoma r-simo
        j = 0
        For i = 1 To LLvar3 Step 2
            j = j + 1
            rule(j) = 1
            T = Right(S, LLvar3 - i + 1)
            W = Left(T, 1)
            rule(j) = rule(j) + Convtodec(W, 1)
            T = Right(S, LLvar3 - i)
            W = Left(T, 1)
            rule(j) = rule(j) + Convtodec(W, 1)
        Next i
        rule(3) = 2
        '
        ' valorizza i centri dei fuzzy sets
        zero = 0: mlow = -dist1: low = mlow - dist2
        mhigh = dist1: high = mhigh + dist2
        '
        ' calcola i 5 fuzzy sets
        j = 0
        For i = Primo To Ultimo - 1
            j = j + 1
            ' FUZZY SET  BASSO
            If fx(i) <= low Then
                basso(j) = 1
            ElseIf fx(i) >= mlow Then
                basso(j) = 0
            Else
                basso(j) = 1 - (Abs(fx(i) - low) / Abs(low - mlow))
            End If
            ' FUZZY SET  MBASSO
            If fx(i) <= low Or fx(i) >= zero Then
                mbasso(j) = 0
            ElseIf fx(i) < mlow Then
                mbasso(j) = 1 - (Abs(fx(i) - mlow) / Abs(mlow - low))
            Else
                mbasso(j) = 1 - (Abs(fx(i) - mlow) / Abs(mlow - zero))
            End If
            ' FUZZY SET  MEDIO
            If fx(i) <= mlow Or fx(i) >= mhigh Then
                medio(j) = 0
            ElseIf fx(i) < zero Then
                medio(j) = 1 - (Abs(fx(i) - zero) / Abs(zero - mlow))
            Else
                mbasso(j) = 1 - (Abs(fx(i) - zero) / Abs(zero - mhigh))
            End If
            ' FUZZY SET  MALTO
            If fx(i) <= zero Or fx(i) >= high Then
                malto(j) = 0
            ElseIf fx(i) < mhigh Then
                malto(j) = 1 - (Abs(fx(i) - mhigh) / Abs(mhigh - zero))
            Else
                malto(j) = 1 - (Abs(fx(i) - mhigh) / Abs(mhigh - high))
            End If
            ' FUZZY SET  ALTO
            If fx(i) <= mhigh Then
                alto(j) = 0
            ElseIf fx(i) >= high Then
                alto(j) = 1
            Else
                alto(j) = 1 - (Abs(fx(i) - high) / Abs(high - mhigh))
            End If
            '
            ' APPLICAZIONE REGOLE X RIEMPIRE INPUTZ()COI RISULTATI ( YIELD2 )
            '
            If alto(j) > malto(j) And alto(j) > medio(j) And alto(j) > mbasso(j) And alto(j) > basso(j) Then
                Select Case rule(5)
                Case 1
                    'Inputz(j) = -Yield2(i)
                    'best(j) = 1
                    inputz(j) = 0
                    best(j) = 2
                Case 2
                    inputz(j) = 0
                    best(j) = 2
                Case 3
                    inputz(j) = Yield2(i)
                    best(j) = 3
                End Select
            ElseIf malto(j) > alto(j) And malto(j) > medio(j) And malto(j) > mbasso(j) And malto(j) > basso(j) Then
                Select Case rule(4)
                Case 1
                    'inputz(j) = -Yield2(i)
                    'best(j) = 1
                    inputz(j) = 0
                    best(j) = 2
                Case 2
                    inputz(j) = 0
                    best(j) = 2
                Case 3
                    inputz(j) = Yield2(i)
                    best(j) = 3
                End Select
            ElseIf medio(j) > alto(j) And medio(j) > malto(j) And medio(j) > mbasso(j) And medio(j) > basso(j) Then
                Select Case rule(3)
                Case 1
                    inputz(j) = -Yield2(i)
                    best(j) = 1
                Case 2
                    inputz(j) = 0
                    best(j) = 2
                Case 3
                    inputz(j) = Yield2(i)
                    best(j) = 3
                End Select
            ElseIf mbasso(j) > alto(j) And mbasso(j) > malto(j) And mbasso(j) > medio(j) And mbasso(j) > basso(j) Then
                Select Case rule(2)
                Case 1
                    inputz(j) = -Yield2(i)
                    best(j) = 1
                Case 2
                    inputz(j) = 0
                    best(j) = 2
                Case 3
                    'inputz(j) = Yield2(i)
                    'best(j) = 3
                    inputz(j) = 0
                    best(j) = 2
                End Select
            ElseIf basso(j) > alto(j) And basso(j) > malto(j) And basso(j) > medio(j) And basso(j) > mbasso(j) Then
                Select Case rule(1)
                Case 1
                    inputz(j) = -Yield2(i)
                    best(j) = 1
                Case 2
                    inputz(j) = 0
                    best(j) = 2
                Case 3
                    'inputz(j) = Yield2(i)
                    'best(j) = 3
                    inputz(j) = 0
                    best(j) = 2
                End Select
            End If
        Next i
        '
        ' SCEGLIE FITNESS FUNCTION
        Select Case Scelta
        Case 1
            cumx = Cum(inputz(), j)
        Case 2
            cumx = Newix(inputz(), j)
        Case 3
            cumx = Omega(inputz(), j)
        Case 4
            cumx = Sharpe(inputz(), j)
        End Select
        '
        ' ORDINA I CROMOSOMI MIGLIORI
        For i = 1 To Nmeio
            If cumx = Bestx(i) Then
                Exit For
            ElseIf cumx > Bestx(i) Then
                m = Nmeio
                Do While m > i
                    Bestx(m) = Bestx(m - 1)
                    Limeio(m) = Limeio(m - 1)
                    m = m - 1
                Loop
                Bestx(i) = cumx
                Limeio(i) = Tabcromo(r)
                '
                If i = 1 Then
                    ' CROMOSOMA MIGLIORE
                    Best1 = r
                    Best2 = cumx
                    Best3 = dist1
                    Best4 = dist2
                    Bestz = best(j)
                    For n = 1 To 5
                        Bestrule(n) = rule(n)
                    Next n
                End If
                Exit For
            End If
        Next i
        '
    Next r
    '
tutti questi codici sono più facilmente comprensibili esaminando i 2 esempi a cui sono stati applicati PROVA-GA-F1 e PROVA-GA-FI-1 caricati e disponibili come al solito su Dropbox
nel Foglio1 di questi files è presente un cpontrollo ( numcro ) mediante il quale si può scegliere il numero di individui della popolazione secondo la potenza del vostro PC
ovviamente si sconsiglia vivamente di usare questi sistemi perchè potrebbe essere pericoloso, bla bla bla etc
 

lelle47

Nuovo forumer
tutti questi codici sono più facilmente comprensibili esaminando i 2 esempi a cui sono stati applicati PROVA-GA-F1 e PROVA-GA-FI-1 caricati e disponibili come al solito su Dropbox
nel Foglio1 di questi files è presente un cpontrollo ( numcro ) mediante il quale si può scegliere il numero di individui della popolazione secondo la potenza del vostro PC
ovviamente si sconsiglia vivamente di usare questi sistemi perchè potrebbe essere pericoloso, bla bla bla etc
[/QUOTE]

Skarso, potresti cortesemente indicarmi come è possibile accedere a Dropbox?
grazie
 

Skarso

Forumer attivo
ho dimenticato la routine che verifica la "fitness function" cioè che calcola il risultato ottenuto da ogni individuo nella "window" precedente
cumx = Cum(inputz(), j)

Codice:
Public Function Cum(f() As Double, j As Integer)
    Dim n        As Integer
    Dim dernier  As Integer
    Dim min      As Integer
    Dim d1       As Double
    Dim pi       As Double
    Dim tr       As Double
    Dim cum1     As Double
    Dim cum2     As Double
    '
    dernier = j
    For n = 1 To dernier
        cum1 = cum1 + f(n)
    Next n
    Cum = cum1
    '
End Function

ho anche dimenticato di indicare i risultati ( ultimo anno ) per chi non è abbonato a Dropbox:
su FI utile netto = 85% Omega = 2.183 MDD = - 10.50%
su F utile netto = 87 % Omega = 2.554 MDD = - 6%
 
Ultima modifica:

quicksilver

Forumer storico
cioè nel fare la previsione per il giorno N non fare mai conoscere all’ algoritmo il risultato del giorno N, ma solo quelli precedenti fino al giorno N - 1

scusa Skarso, siccome io sono realmente scarso, non capisco bene nella realtà questo concetto
cioè mi manca probabilmente un passaggio, il giorno N facendo un esempio nella realta (TS daily)
è il risultato della giornata di oggi (esempio: valore di chiusura di stasera)
oppure è il giorno in cui si eseguira il segnale cioè la giornata di domani?

perchè non capisco
se dici "nel fare la previsione per il giorno N" mi viene da pensare che si intenda per il giorno in cui si esegue il segnale cioè domani
ma forse tu intendi "nel fare la previsione il giorno che si hanno gli ultimi dati disponibili cioè per il giorno N che è oggi (stasera) in modo da avere un segnale per domani"
grazie
 

GiuliaP

The Dark Side
...forse non c’ è nessuno che teme l’ overfitting più di me ed infatti per ridurre al minimo almeno quello dovuto al training ho cura di effettuare sempre stime ex-ante, cioè nel fare la previsione per il giorno N non fare mai conoscere all’ algoritmo il risultato del giorno N, ma solo quelli precedenti fino al giorno N - 1...


Skarso, questo non è evitare overfitting, questo è evitare di guardare al futuro relativo per prevederlo. Del resto se vuoi prevedere l'andamento futuro, non hai certo a disposizione le quotazioni di domani per farlo.

Ovvero significa semplicemente evitare un banale errore computazionale.

...quindi stando così le cose come è facile verificare nei files open source, parlare di overfitting senza conoscere è pura illazione ed anche malafede . . . :down:

Addirittura malafede? :D

"Overfitting" significa modellare rumore piuttosto che la legge di funzionamento del sistema reale che si vuole controllare/prevedere; questa non è una mia opinione: è una definizione.

Inutile dire che modellare rumore passato non serve certo a prevedere rumore futuro, per definizione stessa di rumore.

Tutti gli algoritmi da te citati possono essere efficaci per sistemi dove il rumore è trascurabile rispetto agli effetti delle leggi reali che li regolano. In questi casi riescono a "simulare" leggi di comportamento senza la necessità di conoscerle.

Quando invece il sistema è estremamente soggetto a rumore e reagisce ad ogni tentativo di "controllo" (una specie di legge di Heisenberg per i mercati :D), questi sistemi generano overfitting più di qualunque altro metodo.

Ovvero non sono adatti allo scopo.

Se si vuole una prova pratica di quanto detto, basta generare una serie casuale e verificare che una rete neurale sarà capace di generare su di essa una equity di tutto rispetto. Ex-post. Ex-ante, ovviamente, fallirà miseramente.

Per concludere, la ricerca empirica può anche essere fatta in maniera esaustiva, purchè si abbia tempo infinito. Altrimenti è fondamentale saper riconoscere al più presto le strade che possono avere più speranze di altre con logiche del tipo qui sopra descritte. Che si traduce metodologicamente parlando nel tagliare i rami morti della ricerca prima di doverli esplorare completamente (senza trascurare il rischio che questo tipo di operazione comporta).

Come al solito il tempo è un valore che si trascura sistematicamente, pur essendo il più importante di tutti.
 

Skarso

Forumer attivo
scusa Skarso, siccome io sono realmente scarso, non capisco bene nella realtà questo concetto
cioè mi manca probabilmente un passaggio, il giorno N facendo un esempio nella realta (TS daily)
è il risultato della giornata di oggi (esempio: valore di chiusura di stasera)
oppure è il giorno in cui si eseguira il segnale cioè la giornata di domani?

perchè non capisco
se dici "nel fare la previsione per il giorno N" mi viene da pensare che si intenda per il giorno in cui si esegue il segnale cioè domani
ma forse tu intendi "nel fare la previsione il giorno che si hanno gli ultimi dati disponibili cioè per il giorno N che è oggi (stasera) in modo da avere un segnale per domani"
grazie


uhm adesso sono io che non capisco, ma proprio per questo sono “scarso” . . . :-?
comunque ri –provo a spiegarmi : diciamo che il giorno N è il giorno in cui effettui una previsione per operare o in chiusura dello stesso giorno oppure in apertura del giorno dopo
chiunque per operare effettua in qualche modo una previsione a meno che non decida di operare ad minkiam canis . . . :eek:
per fare la previsione a meno che tu non sia di quelli che guardano se si è formata ad es la gobba di Quasimodo, utilizzerai un “qualcosa” riferito al comportamento odierno
ebbene questo “qualcosa” agisce coi parametri calcolati fino al giorno prima, cioè N-1
ecco questo comportamento che tieni nella realtà ( non potendo ancora conoscere l’ esito del tuo trade ) devi tenerlo anche nella simulazione o backtest che dir si voglia, pena commettere overfitting
 

Skarso

Forumer attivo
[/FONT][/SIZE]

Skarso, questo non è evitare overfitting, .

ah ma sei proprio de coccio !
certo, esiste anche lo “invisible overfitting” che non è eliminabile . . .
ma io sto parlando dell’ overfitting da training che è evitabilissimo se si fa girare l’ algoritmo una sola volta facendo conoscere alla previsione del giorno N solo i risultati fino al giorno N – 1
quanto poi alla possibilità di discernere segnale dal rumore, costruisco sistemi solo laddove esiste correlazione seriale statisticamente significativa
poi se non capisci ancora iscriviti a Dropbox, esamina i files e solo dopo eventualmente parla !
 

Skarso

Forumer attivo
dipende molto cosa dai in pasto
se dai spazzatura ottieni spazzatura
invece cosi' ha un senso

http://www.palisade.com/images3/product/NeuralTools/55NeuralToolsDataSet.png

certo se do in pasto la prod. ind..e' capace anche mio nonno....ma questo e'


ma la vuoi smettere di venire a disturbare in questo thread con le tue corbellerie da minus sapiens ? :down:
tornatene nel tuo ridicolo thread ( uno, due , tre figuriamoci, da sbellicarsi dalle risate . . . :D ) e non rompere !
 

Users who are viewing this thread

Alto