Programmazione Amibroker Amibroker, programmazione avanzata (1 Viewer)

reef

...
Anzitutto scusate il titolo del 3D così pretenzioso. :)

Sono solo due mesi che uso AmiBroker, ma lo trovo interessante e promettente, tant'è che lo uso come palestra per provare il TS giorno e notte e ci vorrei costruire un sistema intraday.
Cosa mi ha colpito di AB? A livello di struttura del SW la nota negativa principale è che sembra un sistema one-man-based, ovvero compare sempre e solo Tomasz Janeczko (e se dovesse vincere al totolcalcio?). La nota positiva di questo aspetto è che, probabilmente, la semplicità nell'organizzazione aziendale consente un costo assolutamente vantaggioso.

Il manuale d'uso è molto ben fatto ed è anche aggiornato on-line, molto comodo per fare ricerche con google e visualizzare i molti codici afl portati come esempi.
L'interfaccia chart e intuitiva e potente, permette configurazioni complesse a piacere e una personalizzazione anche molto spinta, essendo tutta la visualizzazione interpretata attraverso comandi testuali declinati su files testo.
La programmazione dei codici afl è semplice per chi conosce il C, permette di programmare a oggetti (=vettori dati) o in modalità sequenziale (cicli for.., if...).

Per chi come me approccia per la prima volta un linguaggio trading-oriented, ci sono molte novità interessanti. Quelle che mi hanno più colpito recentemente sono:
Foreign: la possibilità di caricare vettori di dati da confrontare con quello corrente
Timeframe: la possibilità di espandere o comprimere dinamicamente il time frame della serie in uso
AddToComposite: la possibilità di creare un vettore "combinazione lineare" di valori ricavati da altri vettori.
 
Ultima modifica:

reef

...
Nel TS giorno e notte abbiamo il seguente problema da risolvere, per la parte notte: presa la serie di dati da tradare (MIB), operiamo se si verificano condizioni su un altra serie (DJ o SP500) ad orari fissati.

Il mio approccio con questo problema è stato subito traumatico. Il buon skarso ci ha fatto vedere che con poche righe di codice Excel (e le idee molto, molto chiare!) ci si può giocare dentro a piacere e ottenere risultati.

I sistemi orientati al trading spesso sono in grado di lavorare solo su una serie di dati, oppure non consentono di trattare valori ad orari diversi da quello corrente se non con programmazioni complicatissime... Insomma, questa sembrava la palestra ideale per valutare se è vero o no che AmiBroker può essere "meglio" di Excel (almeno per me).

E qui veniamo al titolo di questo 3D. "Programmazione avanzata" per me significa non cercare l'ennesimo algoritmo di media mobile o di mean-reverse da applicare ai dati passati per "prevedere il futuro", ma sfuttare ad esempio i time-lag di serie diverse, soprattutto nell'intraday, o creare combinazioni lineari di indici per destagionalizzare dati (giusto come esempio).
 
Ultima modifica:

reef

...
Per esempio, nel caso del TS notte, il principio è semplice: compro in chiusura il MIB se la differenza tra le due ultime aperture del SP500 (o DJ, che è circa uguale) è negativa, e lo rivendo all'apertura successiva.

Con la serie EOD di entrambe si fa prestissimo. Posizionandosi sulla serie MIB di default, il codice è

sp5o = Foreign("SP500","O",1); //carico i valori Open della serie SP500
delta_sp5o = sp5o - Ref(sp5o,-1); //Open - Open giorno precedente
Buy = delta_sp5o < 0; //Compro se il delta è negativo
Sell = Ref(Buy,-1); //Vendo subito dopo il buy

Per funzionare bisogna settare le preferenze di acquisto sul Close e di vendita sull'Open.

Ma se voglio decidere l'orario della rilevazione SP500? E l'orario d'acquisto del MIB? Bisogna passare alla serie intraday.
Ora la logica diventa: se il dato SP500 alle 15.30 - il dato alle 15.30 di ieri è negativo, compra il MIB alle 17.40 e rivendilo domani alle 9.00
 
Ultima modifica:

reef

...
Quindi, passando alle serie Intraday, posso usare gli orari come variabili di ottimizzazione. Può essere interessante anche aggiungere un'ulteriore serie esogena, il cambio EURUSD. E magari successivamente il future Eurostoxx50, come già proposto da qualcuno.

Inoltre skarso ha introdotto la rolling window, per l'ottimizzazione del parametro "soglia di acquisto".

Ho a tiro le serie del MIB a 5min, SP500 a 5min e EURUSD a 30min. Allego gli ultimi 20 gg per chi volesse provare a seguire questo test.
 

Allegati

  • EURUSD30.csv
    37,1 KB · Visite: 276
  • FSPMIB_5.csv
    79,9 KB · Visite: 273
  • SP5I_5.csv
    66,1 KB · Visite: 277
Ultima modifica:

reef

...
Cominciamo col primo problema.
La serie di default inizializza il frame temporale. Se ho i dati MIB dalle 9.00 alle 17.30, per le altre serie di dati (foreign) con altro timing, quelli visibili saranno solo quelli compresi in tale finestra.
Se voglio avere una finestra che li comprenda tutti posso caricare come default l'EURUSD che è su 24 ore e come foreign gli altri.
Questo è quel che risulta nel chart
 

Allegati

  • eurusd.jpg
    eurusd.jpg
    110,5 KB · Visite: 1.012
Ultima modifica:

reef

...
Come facciamo ora ad avere il delta Open-Open(-1day) di SP500?

Codice:
//SP500 Open - Open(-1day)
e=Foreign("SP5I_5","O"); //Open SP500 5 min
t=153000; //Orario di rilevazione quotidiana
d= e * (TimeNum()==t); 
d= ValueWhen(d!=0, d);
dd= 100*(d - Ref(d,-1))/Ref(d,-1);
dd=  ValueWhen(dd!=0, dd) ;

Abbiamo una serie a 5 minuti.
Creiamo una nuova serie "d" con il valore rilevato a una certa ora e il resto a 0
Con ValueWhen (formidabile!) riempiamo gli zeri coll'ultimo valore diverso da 0
Stessa cosa per "dd" (delta col giorno precedente)
In dd otteniamo una serie a 5 minuti dove il valore cambia solo all'ora fissata e si ripete fino al giorno successivo.

Pausa di riflessione... Interessa l'argomento? :)
Altri riferimenti? Suggerimenti dai più esperti?
Se non si fosse capito, sono qui per imparare ;)
 
Ultima modifica:

reef

...
interessa, interessa ;) sarebbe carino se me la spiegata questa costruzione, in modo da capire il concetto
mi riferisco a valuewhen.

ValueWhen è documentata sul manuale http://www.amibroker.com/guide/afl/afl_view.php?id=163
Ma nell'esempio riportato sopra questo array d=[21,0,0,0,23,0,0,0,24], con ValueWhen(d!=0,d) diventa d=[21,21,21,21,23,23,23,23,24]. Piace? :D

Quella costruzione magnifica col ValueWhen arriva da una mia domanda a Tomasz. Tutto merito suo! :D
Grazie ender, mi fa piacere che passi di qui. Tomasz ovviamente conosce tutti i trucchi di AB, l'ha fatto lui... :lol:
Infatti mi interessa entrare nel merito e capire come è strutturato, sembra che il progetto sia talmente buono che riesce ad infilarci sempre qualcosa.

Dicevo, tre istruzioni mi hanno lasciato di stucco: foreign per importare vettori esterni, le TimeFrameXXXYYY per modificare a piacere i TF più volte all'interno di un TS e AddToComposite, che ho guardato ma non ancora applicato.

Per tornare al nostro esempio, i foreign e timeframe ci dovrebbero aiutare a riallineare le serie (ne abbiamo due a 5 min e una a 30). Partiamo con il default su EURUSD per avere un vettore giornaliero a 30 min (48 valori semiorari/die), sul quale dovremo innestare SP500 (104 val 5m/die) e FSPMIB (93 val 5m/die ). Senza colpo ferire solo in occorrenza degli orari della serie a 30 min vengono inseriti quelli della serie foreign a 5 min (pari pari), perdendo, ahinoi, le informazioni sulle O,H,L dei 25 minn precedenti (ovvero i 5/6 del campione). Giusto per informazione. Se dobbiamo operare sull'open, in questo caso è meglio andare sul close del frame precedente...
In orario di apertura mercato "dovrebbe" essere indifferente (si va al meglio...).
 
Ultima modifica:

reef

...
Ricordiamo comunque che questo è un TS prettamente EOD overnight, quindi l'ottimizzazione non dovrebbe essere fatta su TF intraday (5 o 30 min) ma sul dato giornaliero.
Non ho trovato il modo per lavorare in contemporanea su dati EOD e Intraday, per cui l'unica tecnica possibile è quella di prendere come dato giornaliero uno specifico dato (all'ora di interesse) e utilizzarlo come dato giornaliero in un loop che permetta di ottenere il parametro di ottimizzazione.

Tornando al TS giorno notte, skarso propone un'ottimizzazione su kappa, tale che l'operazione
Codice:
Buy = delta_sp5o < -kappa; //Compro se il delta è minore di un fattore kappa (>0)
sia più profittevole del semplice kappa=0, ovvero cerchiamo quello che massimizza il "profitto" (omega, CAR/MDD, ecc.) negli ultimi XX (=50) giorni. Per i dettagli teorici si rimanda agli interventi di Skarso sul 3d giorno notte.

Qui il nostro problema è che abbiamo una serie intraday e dobbiamo calcolare un fattore EOD. Nell'esempio di codice AB nel 3D TS giorno notte, ender ha pubblicato un codice per Ami. In sostanza viene replicato il dato orario fino alla chiusura della giornata, e la chiusura della giornata viene presa come EOD. Poichè il vettore dati è intraday, per lavorare in EOD bisogna usare un ciclo for...next che utilizzi SOLO l'ultimo dato del giorno.
Skarso suggerisce di normalizzare sempre il dato di incremento % giornaliero. Per fare ciò bisogna calcolare media e dev standard e, con le approsimazioni del caso (si ignorano skewness e curtosi), si ottiene un dato normalizzato ad una gaussiana unitaria.
 
Ultima modifica:

reef

...
In una serie intraday il salto del giorno di può identificare facilmente con l'ottima istruzione Iif
Codice:
data=DateNum();
cambiogiorno=IIf(data != Ref(data,-1),1,0);
(bassamente copiaincollata da ender :D )

Iif in questo caso restuisce un vettore analogo alla serie dati, dove i valori sono tutti a 0 escluso il primo di ogni giorno a 1.
cambiogiorno è fatto così [1,0,0,0,0,0,...,0,1,0,0,0,0,0,...] Nel caso EURUSD il valore 1 sarà in corrispondenza delle ore 0:30

Per ottenere la media o la dev standard di questi valori, dovremo quindi estrarre l'unico valore che ci interessa per ogni giorno. Quindi le funzioni AB, in questo caso, non ci servono e ce le dobbiamo scrivere ad-hoc. Sempre rimandando a skarso, scriviamo la media e la dev standard approssimate, dove in serie c'è la serie di dati col dato valido solo alla scadenza del giorno (il resto dell'array a 0):

Codice:
function media(serie) {
	alpha=0.1;
	med=0;
	for (i=1;i<BarCount;i++) {
		if (serie[i]!=0)
			med[i]=(1 - alpha) * med[i-1] + alpha * serie[i]; 
		else 
			med[i]=med[i-1];
	}
	return med;

}

function devst(serie, med) {
	alpha=0.1;
	std=0;
	for (i=1;i<BarCount;i++) {
		if (serie[i]!=0) 
			std[i] = sqrt((1 - alpha) * std[i-1] * std[i-1] + alpha * (serie[i] - med[i]) * (serie[i] - med[i])); 
		else 
			std[i]=std[i-1];
	}
	return std;
}

Le funzioni considerano SOLO i valori validi che saranno scritti in corrispondenza del cambio giorno.
 
Ultima modifica:

Users who are viewing this thread

Alto