TS costruiti con metodi non convenzionali

Skarso

Forumer attivo
apro un nuovo thread in quanto quello su FI è stato scorrettamente inquinato con grafici voodoo ed argomenti OT da un personaggio molto invasivo . . . :(
che “minkia cccentrrano” i grafici voodoo con la logica fuzzy ? nulla proprio nulla . . . :-?
inoltre personalmente non capisco e quindi detesto questi grafici ed i programmi “pacco” che li generano perché – imo - se talvolta spiegano il passato cioè quello che è successo prima, quasi sempre toppano quando si vuole prevedere il futuro . . . :eek:
il problema – imo – è che i grafici vanno bene x dati ed eventi deterministici mentre i dati di borsa sono a volte caotici, quasi sempre pieni di noise, direi “casinisti” . . .
x rispondere alla domanda di reef
“al verificarsi delle condizioni, si prendono le uscite yield2 (16.00-Close, ma perchè queste non sono normalizzate?) in corrispondenza delle colonne R-V, cercando il rapporto causa-effetto nei numeri.”
dirò che occorre dare dei valori alle 5 regole corrispondenti alle 5 suddivisioni del rendimento del titolo e ciò viene fatto con una media esponenziale attribuendo a ciascuna regola ogni volta la porzione di risultato ( yield2 ) di sua spettanza

passiamo ora ad esaminare un altro metodo “non convenzionale” di costruire TS, secondo il principio dei Nearest Neighbour ( vicini + vicini ) utilizzato nel file PROVA-FI-NN disponibile come al solito su Dropbox ( x molti ma non x tutti . . . :lol: )
il metodo è abbastanza intuitivo: l’ idea di base è che stati simili nel breve periodo avranno successori ( cioè esiti ) simili
poiché i valori dei successori di stati simili sono noti , questi possono essere utilizzati per predire il valore futuro di stati correnti simili
un esempio in linguaggio Basic, che è simile all’ inglese parlato, chiarirà forse meglio ( o peggio ? . . . :D )
For k = 1 to Last
FindNN Input1(), k
R_pevis( 3 + k ) = bestx
Next k

Sub FindNN(fx() As Double, k As Integer)
Dim i As Integer
Dim j As Integer
Dim m As Integer
Dim dist As Double
Dim cumx As Double

'
Ultimo = k: Primo = 1
'
BW = 0
For m = 1 To 10
BW = BW + 0.05
j = 0
For i = Primo To Ultimo - 1
If Abs(Input1(k) - Input1(i)) < BW Then
j = j + 1
dist = (1 - Abs(Input1(k) - Input1(i)) / BW)
If j = 1 Then
cumx = dist * Input2(i)
Else
cumx = (1 - Beta * dist) * cumx + Beta * dist * Input2(i)
End If
End If
Next i
If j >= Nvic Then Exit For
Next m
Bestx = cumx
Best0 = j
'
End Sub
 
scusate, ho omesso di dire che la “similitudine” tra stati ( in questo caso i valori di Input1 ) si ricava tramite una misura di “distanza”
vi sono vari metodi per calcolare questa distanza, nel programma ne ho utilizzato uno molto semplice, noto come mappa triangolare o tent map la cui equazione è
dist = 1 - | x1 – x2 |/ v
essendo v l’ intervallo ammesso di variazione
è anche molto usata la funzione pseudo – normale
dist = exp( 0.5*( - (( x – media )/sigma) ^2 )
 
il metodo è abbastanza intuitivo: l’ idea di base è che stati simili nel breve periodo avranno successori ( cioè esiti ) simili
poiché i valori dei successori di stati simili sono noti , questi possono essere utilizzati per predire il valore futuro di stati correnti simili

Ottima partenza... :up:

un esempio in linguaggio Basic, che è simile all’ inglese parlato, chiarirà forse meglio ( o peggio ? . . . :D )

:eek: Magari così è più leggibile? ;)

Codice:
For k = 1 to Last
	FindNN Input1(), k
	R_pevis( 3 + k ) = bestx
Next k
‘
Sub FindNN(fx() As Double, k As Integer)
	Dim i As Integer
	Dim j As Integer
	Dim m As Integer
	Dim dist As Double
	Dim cumx As Double

'
	Ultimo = k: Primo = 1
'
	BW = 0
	For m = 1 To 10
		BW = BW + 0.05
		j = 0
		For i = Primo To Ultimo - 1
			If Abs(Input1(k) - Input1(i)) < BW Then
				j = j + 1
				dist = (1 - Abs(Input1(k) - Input1(i)) / BW)
				If j = 1 Then
					cumx = dist * Input2(i)
				Else
					cumx = (1 - Beta * dist) * cumx + Beta * dist * Input2(i)
				End If
			End If
		Next i
		If j >= Nvic Then Exit For
	Next m
	Bestx = cumx
	Best0 = j
'
End Sub
 
apro un nuovo thread in quanto quello su FI è stato scorrettamente inquinato con grafici voodoo ed argomenti OT da un personaggio molto invasivo . . . :(
che “minkia cccentrrano” i grafici voodoo con la logica fuzzy ? nulla proprio nulla . . . :-?
inoltre personalmente non capisco e quindi detesto questi grafici ed i programmi “pacco” che li generano perché – imo - se talvolta spiegano il passato cioè quello che è successo prima, quasi sempre toppano quando si vuole prevedere il futuro . . . :eek:
il problema – imo – è che i grafici vanno bene x dati ed eventi deterministici mentre i dati di borsa sono a volte caotici, quasi sempre pieni di noise, direi “casinisti” . . .
x rispondere alla domanda di reef
“al verificarsi delle condizioni, si prendono le uscite yield2 (16.00-Close, ma perchè queste non sono normalizzate?) in corrispondenza delle colonne R-V, cercando il rapporto causa-effetto nei numeri.”
dirò che occorre dare dei valori alle 5 regole corrispondenti alle 5 suddivisioni del rendimento del titolo e ciò viene fatto con una media esponenziale attribuendo a ciascuna regola ogni volta la porzione di risultato ( yield2 ) di sua spettanza

passiamo ora ad esaminare un altro metodo “non convenzionale” di costruire TS, secondo il principio dei Nearest Neighbour ( vicini + vicini ) utilizzato nel file PROVA-FI-NN disponibile come al solito su Dropbox ( x molti ma non x tutti . . . :lol: )
il metodo è abbastanza intuitivo: l’ idea di base è che stati simili nel breve periodo avranno successori ( cioè esiti ) simili
poiché i valori dei successori di stati simili sono noti , questi possono essere utilizzati per predire il valore futuro di stati correnti simili
un esempio in linguaggio Basic, che è simile all’ inglese parlato, chiarirà forse meglio ( o peggio ? . . . :D )
For k = 1 to Last
FindNN Input1(), k
R_pevis( 3 + k ) = bestx
Next k

Sub FindNN(fx() As Double, k As Integer)
Dim i As Integer
Dim j As Integer
Dim m As Integer
Dim dist As Double
Dim cumx As Double

'
Ultimo = k: Primo = 1
'
BW = 0
For m = 1 To 10
BW = BW + 0.05
j = 0
For i = Primo To Ultimo - 1
If Abs(Input1(k) - Input1(i)) < BW Then
j = j + 1
dist = (1 - Abs(Input1(k) - Input1(i)) / BW)
If j = 1 Then
cumx = dist * Input2(i)
Else
cumx = (1 - Beta * dist) * cumx + Beta * dist * Input2(i)
End If
End If
Next i
If j >= Nvic Then Exit For
Next m
Bestx = cumx
Best0 = j
'
End Sub


posso?

scusa l'ignoranza, ma ...
la variabile input2 come è definita ?
lo 0.05 nella definizione di BW da cosa deriva?


grazie :)
 
posso?

scusa l'ignoranza, ma ...
la variabile input2 come è definita ?
lo 0.05 nella definizione di BW da cosa deriva?


grazie :)

domande + che legittime, debbo io scusarmi x la fretta e la conseguente poca chiarezza . . .
se guardi le dichiarazioni e le assegnazioni ( Sub Inizia ) Input2 è il rendimento successivo alle 16.00 fino alla close oppure a scelta alla open successiva
sono stati stabiliti come necessari 11 ( numero dispari intorno a 10 ) vicini - se si trovano – per calcolare la previsione come media esponenziale dei rendimenti + simili passati
BW è il campo di variazione x il calcolo della distanza che aumenta progressivamente a step di 0.05% quando non ci sono sufficienti vicini cioè quando i valori di Input1 sono + lontani dalla media
si poteva ovviamente anche scegliere un valore di step + fine ( es 0.01% ) ma 0.05 mi è sembrato un buon trade-off ( compromesso ) almeno così risulta dall' esperienza . . .
 
proviamo ora ad aggiungere un secondo predittore, il rendimento 16. 00 vs 15.30 del DJ ottenendo il file PROVA-FI-NN-2
come distanza tra 2 configurazioni ( giornate ) ”k” ed “i” scegliamo la cosiddetta “distanza euclidea”:
dist = Sqr( ( Input1( k ) – Input1( i ) )^2 + (Input2( k ) – Input2( i ) )^2 )
in pratica il Teorema di Pitagora che si studia alla scuola dell’ obbligo
se il valore dell’ intervallo di variabilità è BW per entrambe le coppie allora questo valore di distanza varierà tra un minimo = 0 ed un max = BW*Sqr( 2 )
però x i calcoli è + comodo indicare con 1 il valore della distanza minima ( punti coincidenti nel piano delle variabili Input1, Input2 ) e 0 quello distanza max ( punti posti negli estremi dell’ intervallo BW ) e di conseguenza la formula della distanza diviene:
dist = 1 - Sqr( ( Input1( k ) – Input1( i ) )^2 + (Input2( k ) – Input2( i ) )^2 )/( BW*Sqr( 2 ) )
nella subroutine FindNN che calcola la previsione, il loop for m = 1 to 20 fa sì che m e di conseguenza BW cresce quando ci sono nell’ intervallo pochi vicini il che accade generalmente quando i valori di Input1 e/o Input2 sono abbastanza alti
i risultati pur nel difficile periodo sembrano abbastanza soddisfacenti in termini di indici di performance:
trade positivi = 65% Omega = 2.243 MDD = - 4.36%
Codice:
Sub FindNN(fx() As Double, k As Integer)
    Dim i        As Integer
    Dim j        As Integer
    Dim m        As Integer
    Dim n        As Integer
    Dim dist     As Double
    Dim cumx     As Double
    '
    '
    ' Ultimo = giorno in esame x previsione
    ' Primo = giorno da cui iniziare
    ' BW = ampiezza banda di variazione ammessa x calcolo distanza
    ' cumx = variabile di comodo x accumulo media exp
    ' j = contatore vicini
    ' Input1(k) = rendimento del titolo nel giorno in esame
    ' Input2(k) = rendimento del DJIA nel giorno in esame
    ' Input1(i) = rendimento del titolo nel giorno i
    ' Input2(i) = rendimento del DJIA nel giorno i
    ' BW * Sqr(2) = distanza max relativ. a intervalli di ampiezza BW
    ' Nvic = numero di vicini desiderato
    ' Beta = fattore di smoothing
    '
    Ultimo = k: Primo = 1
    BW = 0
    For m = 1 To 20
        BW = BW + 0.05
        j = 0: cumx = 0
        For i = Primo To Ultimo - 1
            If Abs(Input1(k) - Input1(i)) < BW And Abs(Input2(k) - Input2(i)) < BW Then
                j = j + 1
                dist = 1 - Sqr((Input1(k) - Input1(i)) ^ 2 + (Input2(k) - Input2(i)) ^ 2) / (BW * Sqr(2))
                If j = 1 Then
                    cumx = dist * Yield2(i)
                Else
                    cumx = (1 - Beta * dist) * cumx + Beta * dist * Yield2(i)
                End If
            End If
        Next i
        If j >= Nvic Then Exit For
    Next m
    Bestx = cumx
    Best0 = j
    Best4 = BW
    '
End Sub
 
proviamo ora ad aggiungere un secondo predittore, il rendimento 16. 00 vs 15.30 del DJ ottenendo il file PROVA-FI-NN-2
come distanza tra 2 configurazioni ( giornate ) ”k” ed “i” scegliamo la cosiddetta “distanza euclidea”:
dist = Sqr( ( Input1( k ) – Input1( i ) )^2 + (Input2( k ) – Input2( i ) )^2 )
in pratica il Teorema di Pitagora che si studia alla scuola dell’ obbligo
se il valore dell’ intervallo di variabilità è BW per entrambe le coppie allora questo valore di distanza varierà tra un minimo = 0 ed un max = BW*Sqr( 2 )
però x i calcoli è + comodo indicare con 1 il valore della distanza minima ( punti coincidenti nel piano delle variabili Input1, Input2 ) e 0 quello distanza max ( punti posti negli estremi dell’ intervallo BW ) e di conseguenza la formula della distanza diviene:
dist = 1 - Sqr( ( Input1( k ) – Input1( i ) )^2 + (Input2( k ) – Input2( i ) )^2 )/( BW*Sqr( 2 ) )
nella subroutine FindNN che calcola la previsione, il loop for m = 1 to 20 fa sì che m e di conseguenza BW cresce quando ci sono nell’ intervallo pochi vicini il che accade generalmente quando i valori di Input1 e/o Input2 sono abbastanza alti
i risultati pur nel difficile periodo sembrano abbastanza soddisfacenti in termini di indici di performance:
trade positivi = 65% Omega = 2.243 MDD = - 4.36%
Codice:
Sub FindNN(fx() As Double, k As Integer)
    Dim i        As Integer
    Dim j        As Integer
    Dim m        As Integer
    Dim n        As Integer
    Dim dist     As Double
    Dim cumx     As Double
    '
    '
    ' Ultimo = giorno in esame x previsione
    ' Primo = giorno da cui iniziare
    ' BW = ampiezza banda di variazione ammessa x calcolo distanza
    ' cumx = variabile di comodo x accumulo media exp
    ' j = contatore vicini
    ' Input1(k) = rendimento del titolo nel giorno in esame
    ' Input2(k) = rendimento del DJIA nel giorno in esame
    ' Input1(i) = rendimento del titolo nel giorno i
    ' Input2(i) = rendimento del DJIA nel giorno i
    ' BW * Sqr(2) = distanza max relativ. a intervalli di ampiezza BW
    ' Nvic = numero di vicini desiderato
    ' Beta = fattore di smoothing
    '
    Ultimo = k: Primo = 1
    BW = 0
    For m = 1 To 20
        BW = BW + 0.05
        j = 0: cumx = 0
        For i = Primo To Ultimo - 1
            If Abs(Input1(k) - Input1(i)) < BW And Abs(Input2(k) - Input2(i)) < BW Then
                j = j + 1
                dist = 1 - Sqr((Input1(k) - Input1(i)) ^ 2 + (Input2(k) - Input2(i)) ^ 2) / (BW * Sqr(2))
                If j = 1 Then
                    cumx = dist * Yield2(i)
                Else
                    cumx = (1 - Beta * dist) * cumx + Beta * dist * Yield2(i)
                End If
            End If
        Next i
        If j >= Nvic Then Exit For
    Next m
    Bestx = cumx
    Best0 = j
    Best4 = BW
    '
End Sub



eccellente :):):) :up::up::up:
gran lavoro .... grazie :)
 
Ho qualche domanda sul codice. Anzitutto sarebbe eccellente se riuscissi, in qualche modo, a dare qualche riferimento di partenza a monte del codice, tipo un articolo, qualche formula... ;) Francamente, dal codice non riesco a risalire banalmente a quel che ci sta dietro.

Nonostante ciò, ti sottopongo una richiesta di chiarimento, che magari sarà un'occasione di approfondimento.

skarso ha scritto:
Codice:
	Ultimo = k: Primo = 1
'
	BW = 0
	For m = 1 To 10
		BW = BW + 0.05
		j = 0
		[B]For i = Primo To Ultimo - 1[/B]

Prendi sempre in esame tutta la serie dati, non sarebbe meglio considerare una finestra di n elementi? Tipo:
Codice:
	Window=40 'il numero di elementi da considerare nell'ottimizzazione
	If Ultimo<Window w=Ultimo else w= Window
	For m = 1 To 10
		BW = BW + 0.05
		j = 0
		[B]For i = Ultimo-w To Ultimo - 1[/B]

Il considerare tutta la serie comporta, inoltre, che pesi di più valori lontani a minore distanza (=BW), piuttosto che valori più vicini a distanza inferiore. Hai fatto delle prove in questo senso?

Grazie ancora per gli ottimi spunti :)
 
Ultima modifica:
Ho qualche domanda sul codice. Anzitutto sarebbe eccellente se riuscissi, in qualche modo, a dare qualche riferimento di partenza a monte del codice, tipo un articolo, qualche formula... ;) Francamente, dal codice non riesco a risalire banalmente a quel che ci sta dietro.

Nonostante ciò, ti sottopongo una richiesta di chiarimento, che magari sarà un'occasione di approfondimento.



Prendi sempre in esame tutta la serie dati, non sarebbe meglio considerare una finestra di n elementi? Tipo:
Codice:
    Window=40 'il numero di elementi da considerare nell'ottimizzazione
    If Ultimo<Window w=Ultimo else w= Window
    For m = 1 To 10
        BW = BW + 0.05
        j = 0
        [B]For i = Ultimo-w To Ultimo - 1[/B]

Il considerare tutta la serie comporta, inoltre, che pesi di più valori lontani a minore distanza (=BW), piuttosto che valori più vicini a distanza inferiore. Hai fatto delle prove in questo senso?

Grazie ancora per gli ottimi spunti :)


il metodo dei ”nearest neighbour” rientra nella categoria dei metodi di “classificazione”, cercando con queste parole chiave credo tu possa trovare articoli sul web
questi metodi non parametrici che apprendono dai dati ( data in rules out ) non funzionano bene quando soffrono della cosiddetta “curse of dimensionality” cioè in pratica dell’ insufficienza di dati disponibili
di qui la scelta di considerare l’ intero data set anche se i dati + lontani nel tempo sono meno significativi
come soluzione si potrebbe pensare ad una pesatura dei dati secondo il tempo ma non ho fatto prove in tal senso
 
il metodo dei ”nearest neighbour” rientra nella categoria dei metodi di “classificazione”, cercando con queste parole chiave credo tu possa trovare articoli sul web
questi metodi non parametrici che apprendono dai dati ( data in rules out ) non funzionano bene quando soffrono della cosiddetta “curse of dimensionality” cioè in pratica dell’ insufficienza di dati disponibili
di qui la scelta di considerare l’ intero data set anche se i dati + lontani nel tempo sono meno significativi
come soluzione si potrebbe pensare ad una pesatura dei dati secondo il tempo ma non ho fatto prove in tal senso

Provo a fare un riepilogo da newbie. Vediamo cosa ho capito.
1. Per raggiungere un risultato positivo (gain alle 17.30), fisso un'orario X<17.30, orario al quale deciderò se e come procedere con l'acquisto di un titolo, sulla base di uno o più indicatori.
2. Nel primo dei due esempi l'indicatore è l'andamento del titolo dall'apertura all'orario X, diciamo G%
3. Per determinare la probabilità di guadagno, misuro la relazione causa-effetto in un set di dati, assegnando punteggi di "winning bet" al verificarsi di alcune condizioni, es. G%<A, G%<B, G%>C, G%>D. A,B,C,D sono soglie stabilite sulla base della distribuzione dei risultati.
4. Per dare robustezza al sistema, nel secondo esempio individuo una variabile esogena che influisce sull'andamento della scommessa (quindi ben correlata a quella sotto osservazione), valutando la relazione causa-effetto tra le due variabili (esogena e osservata).

Se fin qui va bene, poi procedo :)
 
Ultima modifica:

Users who are viewing this thread

Back
Alto