PDA

Visualizza Versione Completa : codificazione del meroAlgoritmi genetici



Diegohyah
20:30,
EDIT - questo post è stato originariamente di due anni fa, ho aggiunto un aggiornamento alla fine del thread ...



Sto lavorando fino a tardi stasera e ho un po 'di tempo libero tra le attività, quindi qui ci sono un sacco di vagabondaggi. Sono sicuro che il mio collaboratore apprezzerà questo.
https://www.forexmad.com/attachments/forex1508558441.png

Come ho iniziato a imparare sul trading, si è formato un logico treno di dichiarazioni e assunzioni di tipo ifthen, con quello che sembra essere una conclusione naturale sono sicuro che molti altri hanno raggiunto.

(1) Se il mero è del tutto imprevedibile, 50/50 nel lungo periodo, allora nemmeno il migliore sistema di gestione del denaro finirà per prevalere.

Contrariamente a quanto alcuni gioori d'azzardo della matematica hanno concluso, non credo che ci sia un modo per vincere in modo coerente in un gioco di aspettative negative (il taglio del broker è calcolato). Tutto quello che puoi fare IMO è riorganizzare le tue vittorie e sconfitte in varie strutture di aggregazione.

Presumo che il mero non sia del tutto imprevedibile, poiché sembra che ci siano persone oneste che riescono a realizzare costantemente un profitto. Non i gioori del piano grande che non si basano tanto sul prezzo quanto sulla egia, ma sui normali investitori al dettaglio che giocano nelle classifiche e nelle notizie.

(2) Se il mero ha un certo grado di prevedibilità, allora può essere codifio.

Gli esseri umani sono notevoli nel riconoscimento di modelli, e forse la capacità di riconoscere costantemente le condizioni di vittoria va ben oltre le semplici regole commerciali che formano i vari sistemi. Dopotutto, un essere umano può riconoscere un volto quasi istantaneamente in quasi tutte le condizioni mentre i computer potenti hanno bisogno di una buona illuminazione, di buoni angoli e dell'ultimo software per fare un lavoro decente. Tuttavia, difficile non è impossibile, e i computer hanno dimoo per molti anni la capacità di trovare modelli nei dati a cui gli esseri umani non si rendono conto.

Suppongo che non sia impossibile codificare la prevedibilità del mero, se esiste, a causa della presunta esistenza di operatori che utilizzano regole abbastanza semplici per generare guadagni consistenti.

(3) Se le emozioni e la psicologia umane sono nemiche della buona gestione del denaro e dell'esecuzione del sistema, eliminarle dal processo decisionale dovrebbe migliorare la coerenza e la redditività a lungo termine.

Ho letto post e articoli sulla psicologia del trading, e sia la paura che l'avidità sembrano essere seri ostacoli. Non solo, ma un semplice errore umano può impedire l'esecuzione solida di regole commerciali altrimenti valide (come un gioore di blackjack che commette errori di egia di base). Cumulativamente, un sistema che potrebbe avere sulla carta un'aspettativa positiva potrebbe diventare negativo a causa di errori e mentalità, oppure la gestione del denaro potrebbe svuotare un account prima che avesse la possibilità di avere successo.

Suppongo che se il mero è prevedibile e può essere codifio, l'esecuzione meccanica di quel codice produrrebbe i risultati più favorevoli. L'ovvio che if ifs include gli eventi esterni fondamentali ... terremoti, dichiarazioni di profitto, guerre, piccoli scioperi dei paesi petroliferi, ecc. In teoria si tratta semplicemente di più variabili che possono essere codifie, ma la loro rarità e variabilità potrebbero renderlo difficile o impossibile in molti casi. Anche così, dal momento che sembrano esserci regole sistematiche che generano rendimenti positivi durante i periodi di scambio libero di notizie relativamente, una soluzione semplice è smettere di usare il trading meccanizzato durante quei tempi e tornare ad esso quando il mero si è stabilizzato. Una soluzione più solida consiste nell'aggiungere eventi ricorrenti alle variabili delle regole, come dichiarazioni di profitto e forzate degli utili, cambiamenti di interesse primario, ecc. Poiché questi eventi si sono verifii numerose volte in tutti i dati di mero utilizzati per il backtesting, un sistema solido dovrebbe essere in grado di gestire questi eventi di routine.



Ora sull'interessante sconfinamento. Qual è la forma ideale di implementazione per un sistema di trading? Non l'ideale pratico, che includerebbe la possibilità di connettersi effettivamente ai broker e di eseguire operazioni, ma piuttosto la piattaforma teorica ideale su cui sviluppare le regole? Qui faccio alcune altre ipotesi. In primo luogo, vorrebbe che la regola cambi nel momento in cui il comportamento del mero è cambiato nel tempo. In secondo luogo, si vorrebbe che il sistema generasse tutte le decisioni, inclusi gli eventi di entrata e di uscita e le dimensioni della posizione.

Sembrerebbe che gli Algoritmi Genetici siano una soluzione in grado di soddisfare tutti i requisiti. La mia capacità di programmazione è limitata allo scripting semplicistico, e anche in questo caso è shakey, ma ho riflettuto su come sarebbe stata la struttura del sistema GA. Prenderò una coltellata sotto ...




Ci sarebbero tre parti principali: (1) un programma supervisore che legge dati, accetta input dell'utente, esegue subroutine di organismi, valuta l'idoneità dell'organismo, modifica gli organismi ed esegue eventi commerciali basati sull'organismo vincente, (2) un file contenente un elenco di tutte le subroutine di organismi e (3) un file di configurazione che controlla parametri quali velocità di mutazione, tipi di mutazioni, blocchi di costruzione dell'organismo, complessità massima dell'organismo, numero di bambini nati ogni generazione, tempi grafici degli organismi valutabili, massimo rischio consentito essere preso, ponderazione per la valutazione del fitness, ecc.

Il programma di supervisione dovrebbe essere in grado di funzionare sia in tempo reale sia su dati storici. vale a dire, deve accettare l'input dell'utente per includere i dati correnti nell'aggiornamento di organismi o solo eseguire con il vincitore corrente. Dovrebbe anche avere la flessibilità di usare conti virtuali virtuali e scambi per valutare l'idoneità quando si esegue il backtest dei dati storici.

La principale difficoltà sono i criteri di idoneità. Questo potrebbe essere valutato in molti modi: la previsione che il mero aumentasse o diminuisse in un momento specifico, la previsione di uno swing su X, la predizione della continuazione di una tendenza attuale, ecc. Il problema, se ho una qualsiasi comprensione di trading, è che sapere che il mero sta per salire o scendere non garantisce la redditività se non è possibile generare buoni punti di entrata e di uscita. Esiste una soluzione di fitness semplice e naturale che comprende i punti di ingresso e di uscita: redditività. L'organismo più adatto è quello che genera il massimo profitto, tuttavia ciò potrebbe essere realizzato. Solleva la questione di quali scadenze per giudicare la redditività oltre ... l'ultimo giorno, settimana o mese per i sistemi daytrading? L'anno scorso? La vita dell'organismo? Tale questione potrebbe probabilmente essere gestita dall'inclusione dei limiti di drawdown nei criteri di fitness. Tecnicamente si potrebbe desiderare che l'organismo produca il massimo profitto entro la fine dell'anno, ma praticamente se si esaurisce un account nel frattempo non è più utile.

Gli organismi subroutine sarebbero interessanti. La piccola lettura che ho fatto su GA usata per la previsione economica in passato li ha usati per trovare parametri ottimali per una funzione fissa. cioè, mettere a punto le variabili in un'equazione o un insieme di equazioni già stabilite come funzionanti. Tuttavia, l'evoluzione ha dimoo la capacità di produrre organismi capaci di enormi capacità di riconoscimento di pattern (occhio umano, per esempio), e non vedo ragioni per cui un GA rivolto ai meri economici non dovrebbe avere almeno una ragionevole possibilità di trovare schemi dove potrebbero esistere.

Poiché i sistemi stabiliti sembrano essere basati su un insieme di regole condizionali (IF a gt; b, AND IF a gt; avg (b, c, d) ... THEN ...), penso che sarebbe saggio mantenere questa caratteristica della previsione di mero. Non credo che un insieme di funzioni a tratti e di dichiarazioni condizionali possa essere riassunto in una grande equazione che dice IF xyz ^ abcdef-ghi = lmnop THEN trade.
https://www.forexmad.com/attachments/forex1508558442.pngLe azioni che un organismo può intraprendere in un mero semplice sono l'acquisto, la vendita e la posizione per ciascuna di esse. Nei meri bidirezionali si hanno scenari brevilunghi, quindi funzionalmente si entra in short, si entra in long, exit e in position size. Quindi la struttura di base di una subroutine di un organismo sarebbe probabilmente costituita da quattro serie di condizionali, ciascuno con un'azione quando le condizioni sono soddisfatte (immettere breve, immettere lunga, uscire breve e uscire a lungo) e una routine per calcolare la dimensione della posizione per ogni azione . La routine di posizione dovrebbe guardare al programma di supervisione per informazioni sulle dimensioni del conto corrente, denaro già in gioco e limiti dell'utente da utilizzare in aggiunta ai dati di mero. Il denaro in gioco potrebbe essere differenziato in denaro totale in gioco nel mero e denaro già in gioco in quel mero specifico (che porta ad aumentare o diminuire le dimensioni della posizione). Questa routine di posizione dovrebbe essere autorizzata a produrre risultati diversi per azioni brevilunghe e di entratauscita, quindi potrebbe anche essere parte di ogni affermazione condizionale - un calcolo che si basa sulle condizioni IF.

Il file di configurazione è abbastanza auto espliivo, ma l'implementazione potrebbe richiedere un po 'di riflessione. Il primo ostacolo è controllare i tipi di variabili che gli organismi sono nutriti, il secondo è determinare i tipi di manipolazioni dei dati che gli organismi possono condurre, e il terzo è determinare il tasso di mutazione.

Ci sono già molti calcoli eseguiti sui dati di mero e sui milemarker che forse le subroutine dell'organismo GA dovrebbero essere alimentate forzatamente, come i massimi dei periodi precedenti, le minime, le aperture, le chiusure, le medie o i calcoli come medie medie, medie mobili, ecc. Oppure puoi lasciare che l'algoritmo funzioni su dati grezzi senza forzare a guardare orari specifici (apre, chiude) o funzioni (massimi, minimi, medie, ecc.). Penso che l'approccio migliore per la diversità di GA sia quello di utilizzare una miscela ... alcuni organismi usano solo indici di mero correnti, altri usano dati di prezzo e volume grezzi, altri usano una miscela. Le impostazioni di configurazione potrebbero assicurare che una certa percentuale di ogni generazione rimanga sempre pura in ogni direzione, se lo si desidera.

La mutazione è un altro problema complio. Impostazioni di configurazione che controllano il numero di organismi trattenuti da ciascuna generazione (% superiore di esecutori eo tutti all'interno di una certa diffusione dal vincitore), quante copie mutate sono fatte da ciascuna e il grado di mutazione è abbastanza semplice da delineare. I tipi di mutazione permessi sono più coinvolti. Se ogni riga di un'istruzione condizionale implica un confronto algebrico, la domanda è quale forma sono le espressioni algebriche che è possibile prendere? Penso sia ovvio che ogni linea condizionale dovrebbe avere accesso a tutte le variabili disponibili, quindi la domanda è limitata alle funzioni disponibili per gli organismi. Le funzioni standard sarebbero addizione e moltiplicazione con la capacità di invertire e negare i termini per produrre sottrazione e divisione. Potrebbero essere consentite operazioni di costruzione di array e matrici? Probabilmente così. Che dire di registri, esponenti, derivati, integrali, ecc.? Gli organismi dovrebbero poter scoprire il calcolo (approssimando i derivati ??????con la differenza finita, ecc.) O questi strumenti matematici dovrebbero essere codifii esplicitamente? Se la piattaforma di codifica è in grado di gestirlo, penso che più operazioni sono disponibili e maggiore è la varietà prodotta, e in definitiva maggiore è la possibilità di trovare buone regole di sistema.

Una volta che questi blocchi predefiniti sono a posto, è necessario definire i tipi di mutazioni consentiti. L'incrocio tra programmi di successo è una buona idea, così come l'aggiunta di mutazioni brute. Ma quanti livelli? Il primo livello sarebbe scambiare i set di condizioni (immettere breve, immettere a lungo, ecc.) Sia all'interno di un organismo che tra organismi. Il secondo livello sarebbe lo scambio, l'aggiunta eo la rimozione di linee singole linee all'interno di un set condizionale, tra insiemi condizionali all'interno di un organismo e tra organismi. Il terzo livello potrebbe mutare una singola linea scambiando espressioni da altre linee. Quarto trasformerebbe una linea scambiando le variabili in un'espressione. Quinto sarebbe mutare una linea scambiando, aggiungendo eo rimuovendo funzioni e variabili. Sarebbero necessarie delle impostazioni per controllare quanti bambini a ciascun livello sono nati e quale grado di scambioaggiuntarimozione è consentito a ogni livello (quante nuove linee possono essere aggiunte a una condizione impostata in una generazione ... quante nuove? variabili o funzioni aggiunte a una linea ... ecc.). Le impostazioni conservative potrebbero produrre solo pochi bambini ad ogni livello, ciascuna contenente un solo cambiamento, le impostazioni aggressive potrebbero produrre fino a cento bambini (o più) ad ogni livello che coprono lo spread da una modifica a una sola cosa rimasta invariata. E naturalmente copie identiche di tutti i sopravvissuti di qualsiasi generazione.

Il file di configurazione dovrebbe anche occuparsi di limiti rigidi sulla complessità dell'organismo (non è possibile aggiungere funzioni o righe oltre una certa dimensione ...), limiti di rischio consentiti e forse variabili per indirizzare alcuni organismi verso il tempo desiderato (dallo scalping swing trading a lungo termine). Dovresti anche controllare la ponderazione del fitness. Ad esempio, se l'obiettivo di un programma è massimizzare i profitti e ridurre al minimo il drawdown, è necessario classificare la priorità relativa di ciascuno. Inoltre, dal momento che ogni organismo sopravvissuto è cresciuto attraverso il successo nelle generazioni precedenti, è necessario valutare l'importanza del successo e dell'insuccesso in funzione del tempo (i nuovi successi sono i più importanti, ovviamente, ma quanto? ... anche i sistemi quasi perfetti farà tive operazioni a volte e non si vuole uccidere un vincitore provato). Queste regole potrebbero diventare piuttosto elaborate, ad esempio esenzioni dall'eliminazione per qualsiasi vincitore assoluto di una singola generazione per le prossime generazioni X, esenzione da qualsiasi top 5% per le prossime generazioni Y, e prendendo la metà superiore dei rimanenti in base a una scala di prestazioni in cui le perdite nell'ultima generazione contano A%, B% di ultima generazione, due generazioni fa C% ecc. ?? interessante notare che, poiché gli organismi si adattano ai cambiamenti comportamentali nei dati, sarebbe più efficace iniziare il backtesting con i primi dati disponibili e lascia che gli organismi lo attraversino fino ai giorni nostri.



Come sarebbe un organismo? Bene, prendi una delle regole di per un esempio grezzo, doppia barra alta vicino bassa. Nella sezione delle condizioni appropriate (breve, giusto?
https://www.forexmad.com/attachments/forex1508558442.png) potresti vedere qualcosa come:

SE:
1:00 alle 2:00 alta - 12:00 a 1:00 alta = lt; 2 pips
E SE:
1:00 chiudi - 2:00 chiudi = gt; XX pips
E SE:
.............
E SE:
................
POI:
accedere


Puoi vedere anche in questo esempio di psuedocode molto spazio per semplici mutazioni. La maggior parte fallirà, alcuni potrebbero fare altrettanto bene o meglio delle tue regole iniziali.

Il tempo necessario per generare una generazione dipende dal numero di organismi, dalla complessità che possono avere, dall'efficienza del codice e, naturalmente, dalla potenza di calcolo a disposizione. La cosa davvero interessante è la possibilità che, poiché il programma GA riceve dati in tempo reale e prende decisioni di trading, continua a generare generazioni e migliorare. Questo è esattamente ciò che sembrano gli investitori tecnici ... regole di sistema che non si estinguono ma si adattano ai cambiamenti del mero e rimangono redditizi. L'idea sarebbe che tutti gli organismi abbiano accesso ai dati in tempo reale e simulino scambi durante ogni generazione, con il programma supervisore che tiene traccia di come ognuno di loro ha fatto cumulativamente se stessero scambiando per reale o no. Mentre tutti gli organismi pensano di fare scambi e operano sugli stessi dati, solo il prescelto si occuperebbe in modo reale se il sistema fosse in diretta. Dovrebbe essere presa una decisione sul fatto che le regole utilizzate per determinare i sopravvissuti (e quindi produca una classifica di idoneità) siano le stesse usate per decidere quale singolo sopravvissuto debba prendere le vere decisioni di trading (se effettivamente usa il sistema dal vivo) per la generazione attuale. Vuoi il tuo ultimo vincitore assoluto, che ha un lignaggio di almeno buoni risultati, o vuoi che il tuo tempo medio e comprovato money maker al timone? Penso che la domanda possa essere risolta simulando il crescere della colonia per lunghi periodi di dati con varie regole per la sopravvivenza e il trading re.

Un problema persistente è come gestire gli eventi mondiali. I dati sui profitti e gli utili, i tassi di interesse, l'inflazione, ecc. Possono essere inseriti ogni giorno nel file di configurazione come variabili aggiuntive che gli organismi possono utilizzare. Forse si potrebbe conservare uno stock di organismi di situazioni speciali che si sono rivelati particolarmente adatti a circostanze specifiche, come durante un incidente, un grande disastro naturale, una guerra, ecc. Il livello di potenziale complessità della colonia una volta stabilito è limitato solo dall'utente .

Una volta sul posto, la porta si apre a domande ancora più intriganti. Che dire di due organismi che sono effettivamente in competizione tra loro? Invece di simulare ciascuno di avere il pieno controllo sulle risorse dell'account per un determinato mero e il più in forma di controllo, cosa succederebbe se due o più delle persone più in forma dovessero combattere per il taglio del rischio consentito? Avrebbero sviluppato egie per controllare quel segmento di mero più dannoso che vantaggioso? Alcuni gruppi di organismi che lavorano insieme in vari meri saranno più proficui cumulativamente della somma di ogni operazione che è ignota agli altri gioori? Questa è la differenza tra il calcolo della dimensione della posizione tenendo conto di ciò che altri organismi di mero stanno facendo in quel momento o guardando solo le impostazioni di configurazione. Hard max per ogni transazione, o fluttuante a seconda del denaro già in gioco?



Basta pensieri per stasera. Il computer sputa solo i risultati ... torna al lavoro.