Negociando uma carteira de pares de moedas - página 9

 
MetaDriver:

Eles estão lá para a história. (Realmente todo branco, o que está totalmente de acordo com o anúncio, eu confirmo).

Eles só precisam ser brancos e fofos, porque de acordo com o teorema de von Neumann-Morgenstern o valor MiniMax é o preço do jogo, ou seja, a expectativa mínima. Uma carteira otimamente diversificada deve ser lucrativa independentemente das direções em que os preços dos instrumentos selecionados se movimentam. De forma correspondente, se a carteira permite perdas pelo menos em um período histórico, seu pagamento esperado, de acordo com o teorema acima, é negativo e não é otimamente diversificado.
 
C-4:

E ninguém em seu perfeito juízo usaria algo só porque está aberto, sem entender como funciona.

Ninguém é obrigado a usá-lo. O código fonte é aberto, a teoria matemática básica e os algoritmos não são secretos. Aqueles que são de mente e memória sãs são capazes de descobrir como funciona por conta própria. O resto de nós pode descansar.
 
kharko:

A implementação requer a enumeração de todas as variantes. O número total de variantes é 2 para o poder de N, onde N é o número de instrumentos na carteira. Talvez alguém possa ajudar - com código pronto. Eu ficaria muito grato.

Otimizado para o sorteio. A linha agora está mais reta. Mas, no decorrer do meu pensamento, surgiu de repente uma pergunta. Como você calcula o spread? Afinal de contas, você precisa saber quantos negócios serão feitos e em que volumes! Não considero o spread em meu indicador, mas tentei contar quantos pontos perderemos/ganharemos em swaps. Durante os swaps de otimização não são considerados.

Advertência! Recomendo fortemente não usar um grande número de pares de moedas e o número de barras a serem analisadas.

Ao otimizar por drawdown de 10 pares de moedas e o parâmetro Lengh = 100, o indicador inicializa cerca de 5 segundos! Tenha paciência :)

Arquivos anexados:
 

Exemplo de preenchimento do arquivo ET_para.csv, que deve estar na pasta de arquivos:

Símbolo Tipo
EURUSD1
EURGBP0
EURCHF1
EURJPY1
GBPUSD1
USDCHF0
USDJPY1
AUDUSD1
USDCAD1
NZDUSD0

A primeira linha é usada para o cabeçalho e não está incluída nos cálculos!

Arquivos anexados:
et_para.zip  1 kb
 
EvgeTrofi:

Otimizado para o sorteio. A linha agora está mais reta. Mas, no decorrer do meu pensamento, surgiu de repente uma pergunta. Como você calcula o spread? Afinal de contas, você precisa saber quantos negócios serão feitos e em que volumes! Não considero o spread em meu indicador, mas tentei contar quantos pontos perderemos/ganharemos em swaps. Durante os swaps de otimização não são considerados.

Advertência! Recomendo fortemente não usar um grande número de pares de moedas e o número de barras a serem analisadas.

Ao otimizar por drawdown de 10 pares de moedas e o parâmetro Lengh = 100, o indicador inicializa cerca de 5 segundos! Tenha paciência :)

Bom trabalho...

A propagação e a troca não são levadas em conta. O indicador só funciona com pontos.

Se levarmos em conta volume, spread e valor pip, obtemos uma curva de Equidade virtual, que depende diretamente dos valores corretos destes parâmetros. Precisamos calcular o valor do pip em cada barra para todos os instrumentos da carteira na moeda do depósito. Em muitas corretoras, o valor de spread varia, o que distorcerá significativamente a curva.

Estou interessado em seu algoritmo para experimentar todas as opções. Eu ficaria muito grato por sua ajuda.

 

A matriz de opções é formada da seguinte forma:

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

Para facilitar a compreensão deste código, eu carreguei uma planilha Excel com fórmulas para formar uma matriz tão privada.

Então você só tem que percorrer todas as variantes por força bruta :)

Arquivos anexados:
arvar.zip  5 kb
 
EvgeTrofi:

A matriz de opções é formada da seguinte forma:

Para facilitar a compreensão deste código, eu carreguei uma planilha Excel com fórmulas para formar uma matriz tão privada.

Tudo o que você precisa fazer depois disso é passar por todas as variantes :)

spb

Escreveu um código mais simples:

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);
      }
// Вывод варианта      
   }
}
O número da variante é representado como um sistema de número binário.


 

Acrescentou uma exibição de drawdown e fator de lucro (relação do saldo atual para o drawdown máximo). Quanto maior for este número, mais estável será o gráfico. A otimização é realizada por este valor.

O número de segundos gastos com a otimização é mostrado nos comentários. :)

Arquivos anexados:
 

EvgeTrofi:

Atenção! Recomendo fortemente não usar um grande número de pares de moedas e o número de barras analisadas.

Ao otimizar o drawdown de 10 pares de moedas e o parâmetro Lengh = 100, o indicador inicializa cerca de 5 segundos!!! Tenha paciência :)

Pensei em como contornar o limite do número de barras. Você precisa dividir o intervalo de tempo para otimização por um número, por exemplo, 100. Se houver 1000 barras no intervalo, então obteremos 1000 / 100 = 10 pontos de tempo onde podemos realizar cálculos. Assim, quanto menor é o número, maior é a precisão do cálculo.
 
kharko:
Pensei em uma maneira de contornar a limitação do número de barras. É necessário dividir o prazo para a otimização por um número, por exemplo, 100. Se houver 1000 barras no intervalo, obteremos 1000 / 100 = 10 pontos de tempo onde podemos realizar cálculos. Assim, quanto menor o número, maior é a precisão do cálculo.

Eu também tenho coçado a cabeça por causa disso. Acontece que, quanto menos seções, maior a probabilidade de ajuste.

Por outro lado, o R-Portfólio utiliza matrizes de pagamento, entre as quais as mais informativas são as quadradas, ou seja, quantos instrumentos financeiros são analisados, tantas seções devem ser aproximadamente.

Mas a questão é que mesmo instrumentos bem correlacionados podem mudar os sinais de correlação em certos momentos. Ou seja, se você quebrar os fragmentos como achar conveniente, então existe a possibilidade de que a análise possa conter momentos tão ruins com os sinais alterados.

Para resumir uma longa história, cheguei à conclusão de que não devemos dividir seções em intervalos iguais (com o mesmo número de barras), mas devemos fazê-lo em extremos de algum símbolo único (por exemplo, aquele que tem a participação máxima na carteira). Isto é, aplicar ZigZag ou algum outro algoritmo, detectar pontos de quebra de tendências e por estes pontos (somente nestas barras) cotações de desconto para alimentação adicional do R-Portfólio (ou algum outro programa de análise de portfólio). Parece ser a maneira mais kosher e mais informativa. Caso contrário, obtemos algum tipo de análise de ruído entre os pontos de correção de mudanças, por exemplo, de lado.