Négocier un portefeuille de paires de devises - page 9

 
MetaDriver:

Ils sont là pour l'histoire. (Vraiment tout blanc, ce qui est tout à fait conforme à la publicité, je confirme).

Il suffit qu'ils soient blancs et duveteux, car selon le théorème de von Neumann-Morgenstern, la valeur MiniMax est le prix du jeu, c'est-à-dire l'espérance minimale. Un portefeuille diversifié de manière optimale doit être rentable, quelle que soit la direction dans laquelle évoluent les prix des instruments sélectionnés. En conséquence, si le portefeuille permet des pertes au moins dans une période historique, son gain attendu, selon le théorème ci-dessus, est négatif et il n'est pas diversifié de manière optimale.
 
C-4:

Et aucune personne saine d'esprit n'utiliserait quelque chose juste parce qu'il est ouvert, sans comprendre comment il fonctionne.

Personne n'est obligé de l'utiliser. Le code source est ouvert, la théorie mathématique de base et les algorithmes ne sont pas secrets. Les personnes saines d'esprit et de mémoire sont capables d'en comprendre le fonctionnement par elles-mêmes. Le reste d'entre nous peut se reposer.
 
kharko:

L'implémentation requiert l'énumération de toutes les variantes. Le nombre total de variantes est égal à 2 à la puissance de N, où N est le nombre d'instruments dans le portefeuille. Peut-être que quelqu'un peut aider - avec un code prêt. Je vous en serais très reconnaissant.

Optimisé pour le tirage au sort. La ligne est maintenant plus droite. Mais au cours de ma réflexion, une question s'est soudainement posée. Comment calculez-vous l'écart ? Après tout, vous devez savoir combien de transactions seront réalisées et dans quels volumes ! Je ne prends pas en compte le spread dans mon indicateur, mais j'ai essayé de compter combien de points nous allons perdre/gagner sur les swaps. Pendant l'optimisation, les swaps ne sont pas pris en compte.

Attention ! Je recommande vivement de ne pas utiliser un grand nombre de paires de devises et le nombre de barres à analyser.

Lors de l'optimisation par drawdown de 10 paires de devises et le paramètre Lengh = 100 l'indicateur s'initialise environ 5 secondes ! Soyez patient :)

Dossiers :
 

Exemple de remplissage du fichier ET_para.csv, qui doit se trouver dans le dossier des fichiers :

Symbole Type
EURUSD1
EURGBP0
EURCHF1
EURJPY1
GBPUSD1
USDCHF0
USDJPY1
AUDUSD1
USDCAD1
NZDUSD0

La première ligne est utilisée pour l'en-tête et n'est pas incluse dans les calculs !

Dossiers :
et_para.zip  1 kb
 
EvgeTrofi:

Optimisé pour le tirage au sort. La ligne est maintenant plus droite. Mais au cours de ma réflexion, une question s'est soudainement posée. Comment calculez-vous l'écart ? Après tout, vous devez savoir combien de transactions seront réalisées et dans quels volumes ! Je ne prends pas en compte le spread dans mon indicateur, mais j'ai essayé de compter combien de points nous allons perdre/gagner sur les swaps. Pendant l'optimisation, les swaps ne sont pas pris en compte.

Attention ! Je recommande vivement de ne pas utiliser un grand nombre de paires de devises et le nombre de barres à analyser.

Lors de l'optimisation par drawdown de 10 paires de devises et le paramètre Lengh = 100 l'indicateur s'initialise environ 5 secondes ! Soyez patient :)

Bon travail...

Le spread et le swap ne sont pas pris en compte. L'indicateur ne fonctionne qu'avec des points.

Si nous prenons en compte le volume, le spread et la valeur du pip, nous obtenons une courbe d'équité virtuelle, qui dépend directement des valeurs correctes de ces paramètres. Nous devons calculer la valeur du pip sur chaque barre pour tous les instruments du portefeuille dans la devise de dépôt. Dans de nombreuses maisons de courtage, la valeur du spread varie, ce qui déforme considérablement la courbe.

Je suis intéressé par votre algorithme pour essayer toutes les options. Je vous serais très reconnaissant de votre aide.

 

La matrice des options est formée comme suit :

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()

Pour faciliter la compréhension de ce code, j'ai téléchargé une feuille de calcul Excel contenant les formules permettant de former une telle matrice privée.

Il ne vous reste plus qu'à parcourir toutes les variantes par force brute :)

Dossiers :
arvar.zip  5 kb
 
EvgeTrofi:

La matrice des options est formée comme suit :

Pour faciliter la compréhension de ce code, j'ai téléchargé une feuille de calcul Excel contenant les formules permettant de former une telle matrice privée.

Après cela, il ne vous reste plus qu'à passer en revue toutes les variantes :)

spb

J'ai écrit un code plus simple :

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);
      }
// Вывод варианта      
   }
}
Le numéro de la variante est représenté par un système numérique binaire.


 

Ajout d'un affichage du drawdown et du facteur de profit (rapport entre le solde actuel et le drawdown maximum). Plus ce chiffre est élevé, plus le graphique semble stable. L'optimisation est effectuée par cette valeur.

Le nombre de secondes passées sur l'optimisation est indiqué dans les commentaires. :)

Dossiers :
 

EvgeTrofi:

Attention ! Je recommande fortement de ne pas utiliser un grand nombre de paires de devises et le nombre de barres analysées.

Lors de l'optimisation du drawdown de 10 paires de devises et du paramètre Lengh = 100, l'indicateur s'initialise environ 5 secondes ! !! Soyez patient :)

J'ai réfléchi à la façon de contourner la limite du nombre de barres. Vous devez diviser l'intervalle de temps pour l'optimisation par un nombre, par exemple 100. S'il y a 1000 barres dans l'intervalle, alors nous aurons 1000 / 100 = 10 points de temps où nous pourrons effectuer des calculs. Ainsi, plus le nombre est petit, plus la précision du calcul est élevée.
 
kharko:
J'ai pensé à un moyen de contourner la limitation du nombre de barres. Il est nécessaire de diviser le délai d'optimisation par un nombre, par exemple 100. S'il y a 1000 barres dans l'intervalle, nous aurons 1000 / 100 = 10 points de temps où nous pourrons effectuer des calculs. Ainsi, plus le nombre est petit, plus la précision du calcul est élevée.

Je me suis gratté la tête à ce sujet aussi. Il s'avère que moins il y a de sections, plus la probabilité d'ajustement est élevée.

D'autre part, R-Portfolio utilise des matrices de paiement, parmi lesquelles les plus informatives sont les matrices carrées, c'est-à-dire : combien d'instruments financiers sont analysés, autant de sections doivent y figurer.

Mais le fait est que même les instruments bien corrélés peuvent changer de signe de corrélation à certains moments. En d'autres termes, si vous décomposez les fragments comme bon vous semble, il est possible que l'analyse contienne justement ces mauvais moments avec les signes modifiés.

En bref, je suis arrivé à la conclusion que nous ne devrions pas diviser les sections à intervalles égaux (avec le même nombre de barres), mais aux extrémités d'un seul instrument (par exemple, celui qui a la part maximale dans le portefeuille). C'est-à-dire appliquer ZigZag ou un autre algorithme, détecter les points de rupture des tendances et, en fonction de ces points (sur ces barres uniquement), actualiser les cotations pour les transmettre à R-Portfolio (ou à un autre programme d'analyse de portefeuille). Cela semble être le moyen le plus kasher et le plus informatif. Sinon, nous obtenons une sorte d'analyse du bruit entre les points de correction des changements, par exemple, en latéral.