Trading di un portafoglio di coppie di valute - pagina 9

 
MetaDriver:

Sono lì per la storia. (Davvero tutto bianco, che è totalmente in linea con la pubblicità, confermo).

Devono solo essere bianchi e soffici, perché secondo il teorema di von Neumann-Morgenstern il valore MiniMax è il prezzo del gioco, cioè l'aspettativa minima. Un portafoglio ottimamente diversificato deve essere redditizio indipendentemente dalle direzioni in cui si muovono i prezzi degli strumenti selezionati. Corrispondentemente, se il portafoglio permette perdite almeno in un periodo storico, il suo payoff atteso, secondo il teorema di cui sopra, è negativo e non è diversificato in modo ottimale.
 
C-4:

Ma nessuno sano di mente userebbe qualcosa solo perché è aperto, senza capire come funziona.

Nessuno è obbligato ad usarlo. Il codice sorgente è aperto, la teoria matematica di base e gli algoritmi non sono segreti. Chi è sano di mente e di memoria è in grado di capire come funziona da solo. Il resto di noi può riposare.
 
kharko:

L'implementazione richiede l'enumerazione di tutte le varianti. Il numero totale di varianti è 2 alla potenza di N, dove N è il numero di strumenti nel portafoglio. Forse qualcuno può aiutare - con codice pronto. Te ne sarei molto grato.

Ottimizzato per l'estrazione. La linea è ora più dritta. Ma nel corso della mia riflessione, è sorta improvvisamente una domanda. Come si calcola lo spread? Dopo tutto, bisogna sapere quanti affari saranno fatti e in quali volumi! Non considero lo spread nel mio indicatore, ma ho provato a contare quanti punti perderemo/guadagneremo sugli swap. Durante l'ottimizzazione gli swap non sono considerati.

Attenzione! Raccomando vivamente di non utilizzare un gran numero di coppie di valute e il numero di barre da analizzare.

Quando si ottimizza per drawdown di 10 coppie di valute e il parametro Lengh = 100 l'indicatore inizializza circa 5 secondi! Abbiate pazienza :)

 

Esempio di riempimento del file ET_para.csv, che dovrebbe essere nella cartella dei file:

Simbolo Tipo
EURUSD1
EURGBP0
EURCHF1
EURJPY1
GBPUSD1
USDCHF0
USDJPY1
AUDUSD1
USDCAD1
NZDUSD0

La prima riga è usata per l'intestazione e non è inclusa nei calcoli!

File:
et_para.zip  1 kb
 
EvgeTrofi:

Ottimizzato per l'estrazione. La linea è ora più dritta. Ma nel corso della mia riflessione, è sorta improvvisamente una domanda. Come si calcola lo spread? Dopo tutto, bisogna sapere quanti affari saranno fatti e in quali volumi! Non considero lo spread nel mio indicatore, ma ho provato a contare quanti punti perderemo/guadagneremo sugli swap. Durante l'ottimizzazione gli swap non sono considerati.

Attenzione! Raccomando vivamente di non utilizzare un gran numero di coppie di valute e il numero di barre da analizzare.

Quando si ottimizza per drawdown di 10 coppie di valute e il parametro Lengh = 100 l'indicatore inizializza circa 5 secondi! Abbiate pazienza :)

Buon lavoro...

Spread e swap non sono presi in considerazione. L'indicatore funziona solo con i punti.

Se prendiamo in considerazione il volume, lo spread e il valore dei pip, otteniamo una curva di Equity virtuale, che dipende direttamente dai valori corretti di questi parametri. Abbiamo bisogno di calcolare il valore del pip su ogni barra per tutti gli strumenti del portafoglio nella valuta di deposito. In molte case di intermediazione il valore dello spread varia, il che distorce significativamente la curva.

Mi interessa il tuo algoritmo per provare tutte le opzioni. Vi sarei molto grato per il vostro aiuto.

 

La matrice delle opzioni è formata come segue:

void Sbor(int& Ar[][]){
   //Создание массива вариантов сочитаний действий над валютными парами
   int Begin = 0;
   int Size = MathPow(V, CountSy);
   int min = 0;
   int max = 1;
   if(V==3) min = -1;
   ArrayResize(Ar, Size);
   for(int i = 0; i < Size; i++){ // Варианты (строки)
      for(int j = 0; j < CountSy; j++){ // Инструменты (столбцы)
         if(i==0){
            Ar[i][j]=0;
         }else{
            if(j==0){
               if(Ar[i-1][j]<max){
                  Ar[i][j]++;
               }else{
                  Ar[i][j]=min;
               }
            }else{
               if(Ar[i][j-1]<Ar[i-1][j-1]){
                  if(Ar[i-1][j]<max){
                     Ar[i][j]++;
                  }else{
                     Ar[i][j]=min;
                  }
               }else{
                  Ar[i][j]=Ar[i-1][j];
               }
            }
         }
      }//Next j
   }//Next i
}//Sbor()

Per facilitare la comprensione di questo codice, ho caricato un foglio Excel con le formule per formare una tale matrice privata.

Allora devi solo eseguire tutte le varianti con la forza bruta :)

File:
arvar.zip  5 kb
 
EvgeTrofi:

La matrice delle opzioni è formata come segue:

Per facilitare la comprensione di questo codice, ho caricato un foglio Excel con le formule per formare una tale matrice privata.

Tutto quello che devi fare dopo è eseguire tutte le varianti :)

spb

Ha scritto un codice più semplice:

void Matrica()
{
   double size = MathPow(2,Num.Para);
   int trend[];
//---
   ArrayResize(trend,Num.Para);
   for(int i=0;i<size;i++)
   {
      int x = i;
      int pos = 0;
      ArrayInitialize(trend,0);
      while(x>0)
      {
         trend[pos] = x % 2;
         pos++;
         x = MathFloor(x / 2);
      }
// Вывод варианта      
   }
}
Il numero della variante è rappresentato come un sistema di numeri binari.


 

Aggiunta una visualizzazione del drawdown e del fattore di profitto (rapporto tra il saldo corrente e il massimo drawdown). Più grande è questo numero, più stabile appare il grafico. L'ottimizzazione viene effettuata da questo valore.

Il numero di secondi spesi per l'ottimizzazione è mostrato nei commenti. :)

 

EvgeTrofi:

Attenzione! Raccomando vivamente di non utilizzare un gran numero di coppie di valute e il numero di barre analizzate.

Quando si ottimizza il drawdown di 10 coppie di valute e il parametro Lengh = 100, l'indicatore inizializza circa 5 secondi!!! Abbiate pazienza :)

Ho pensato a come bypassare il limite del numero di barre. Dovete dividere l'intervallo di tempo per l'ottimizzazione per un numero, per esempio 100. Se ci sono 1000 barre nell'intervallo, allora otterremo 1000 / 100 = 10 punti di tempo in cui possiamo eseguire i calcoli. Quindi, più piccolo è il numero, più alta è la precisione di calcolo.
 
kharko:
Ho pensato a un modo per aggirare la limitazione del numero di barre. È necessario dividere il lasso di tempo dell'ottimizzazione per un numero, per esempio 100. Se ci sono 1000 barre nell'intervallo, otterremo 1000 / 100 = 10 punti di tempo in cui possiamo eseguire i calcoli. Quindi, più piccolo è il numero, più alta è la precisione di calcolo.

Anche io mi sono grattato la testa su questo. Si scopre che meno sezioni ci sono, più alta è la probabilità di aggiustamento.

D'altra parte, R-Portfolio utilizza matrici di pagamento, tra le quali le più informative sono quelle quadrate, cioè quanti strumenti finanziari vengono analizzati, quindi molte sezioni dovrebbero essere approssimativamente.

Ma il punto è che anche strumenti ben correlati possono cambiare segno di correlazione in certi momenti. Cioè, se si scompongono i frammenti come si vuole, allora c'è la possibilità che l'analisi contenga proprio questi brutti momenti con i segni cambiati.

Per farla breve, sono arrivato alla conclusione che non dovremmo spezzare le sezioni a intervalli uguali (con lo stesso numero di barre), ma dovremmo farlo agli estremi di qualche singolo simbolo (per esempio, quello che ha la quota massima nel portafoglio). Cioè applicare ZigZag o qualche altro algoritmo, rilevare i punti di rottura delle tendenze e da questi punti (solo su queste barre) scontare le quotazioni per alimentare ulteriormente R-Portfolio (o qualche altro programma di analisi del portafoglio). Sembra essere il modo più kosher e più informativo. Altrimenti, otteniamo una sorta di analisi del rumore tra i punti di correzione cambia, per esempio, in laterale.

Motivazione: