Operar con una cartera de pares de divisas - página 9

 
MetaDriver:

Están ahí por la historia. (Realmente todo blanco, lo que coincide totalmente con el anuncio, lo confirmo).

Sólo tienen que ser blancas y esponjosas, porque según el teorema de von Neumann-Morgenstern el valor MiniMax es el precio del juego, es decir, la expectativa mínima. Una cartera óptimamente diversificada debe ser rentable independientemente de la dirección en que se muevan los precios de los instrumentos seleccionados. En consecuencia, si la cartera admite pérdidas al menos en un periodo histórico, su rentabilidad esperada, según el teorema anterior, es negativa y no está óptimamente diversificada.
 
C-4:

Pero nadie en su sano juicio utilizaría algo sólo porque está abierto, sin entender cómo funciona.

Nadie está obligado a utilizarlo. El código fuente es abierto, la teoría matemática básica y los algoritmos no son secretos. Aquellos que tienen una mente y una memoria sanas son capaces de averiguar cómo funciona por sí mismos. Los demás podemos descansar.
 
kharko:

La implementación requiere la enumeración de todas las variantes. El número total de variantes es de 2 a la potencia de N, siendo N el número de instrumentos de la cartera. Tal vez alguien pueda ayudar - con un código listo. Se lo agradecería mucho.

Optimizado para la reducción de la carga. La línea es ahora más recta. Pero en el transcurso de mis pensamientos, surgió de repente una pregunta. ¿Cómo se calcula el diferencial? Al fin y al cabo, hay que saber cuántos tratos se harán y en qué volúmenes. No considero el spread en mi indicador, pero he tratado de contar cuántos puntos perderemos/ganaremos en los swaps. Durante la optimización no se tienen en cuenta los intercambios.

¡Atención! Recomiendo encarecidamente no utilizar un gran número de pares de divisas y el número de barras a analizar.

¡Cuando se optimiza por drawdown de 10 pares de divisas y el parámetro Lengh = 100 el indicador se inicializa unos 5 segundos! Tenga paciencia :)

Archivos adjuntos:
 

Ejemplo de llenado del archivo ET_para.csv, que debe estar en la carpeta de archivos:

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

La primera línea se utiliza para la cabecera y no se incluye en los cálculos.

Archivos adjuntos:
et_para.zip  1 kb
 
EvgeTrofi:

Optimizado para la reducción de la carga. La línea es ahora más recta. Pero en el transcurso de mis pensamientos, surgió de repente una pregunta. ¿Cómo se calcula el diferencial? Al fin y al cabo, hay que saber cuántos tratos se harán y en qué volúmenes. No considero el spread en mi indicador, pero he tratado de contar cuántos puntos perderemos/ganaremos en los swaps. Durante la optimización no se tienen en cuenta los intercambios.

¡Atención! Recomiendo encarecidamente no utilizar un gran número de pares de divisas y el número de barras a analizar.

¡Cuando se optimiza por drawdown de 10 pares de divisas y el parámetro Lengh = 100 el indicador se inicializa unos 5 segundos! Tenga paciencia :)

Buen trabajo...

El diferencial y el swap no se tienen en cuenta. El indicador sólo funciona con puntos.

Si tenemos en cuenta el volumen, el spread y el valor del pip, obtenemos una curva de Equidad virtual, que depende directamente de los valores correctos de estos parámetros. Tenemos que calcular el valor del pip en cada barra para todos los instrumentos de la cartera en la moneda del depósito. En muchas casas de bolsa, el valor del diferencial varía, lo que distorsiona considerablemente la curva.

Me interesa su algoritmo para probar todas las opciones. Le agradecería mucho su ayuda.

 

La matriz de opciones se forma de la siguiente manera:

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 la comprensión de este código, he subido una hoja de cálculo de Excel con fórmulas para formar dicha matriz privada.

Entonces sólo tienes que recorrer todas las variantes por fuerza bruta :)

Archivos adjuntos:
arvar.zip  5 kb
 
EvgeTrofi:

La matriz de opciones se forma de la siguiente manera:

Para facilitar la comprensión de este código, he subido una hoja de cálculo de Excel con fórmulas para formar dicha matriz privada.

Todo lo que tienes que hacer después es recorrer todas las variantes :)

spb

Escribió un código más 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);
      }
// Вывод варианта      
   }
}
El número de variante se representa como un sistema numérico binario.


 

Se ha añadido la visualización del factor de reducción y beneficio (relación entre el saldo actual y la reducción máxima). Cuanto mayor sea este número, más estable parecerá el gráfico. La optimización se realiza mediante este valor.

El número de segundos dedicados a la optimización se muestra en los comentarios. :)

Archivos adjuntos:
 

EvgeTrofi:

¡Atención! Recomiendo encarecidamente no utilizar un gran número de pares de divisas y el número de barras analizadas.

¡¡¡Al optimizar el drawdown de 10 pares de divisas y el parámetro Lengh = 100, el indicador se inicializa unos 5 segundos!!! Tenga paciencia :)

He pensado en cómo evitar el límite del número de barras. Hay que dividir el intervalo de tiempo para la optimización por un número, por ejemplo, 100. Si hay 1000 barras en el intervalo, entonces obtendremos 1000 / 100 = 10 puntos de tiempo en los que podemos realizar los cálculos. Así, cuanto más pequeño sea el número, mayor será la precisión del cálculo.
 
kharko:
He pensado en una forma de eludir la limitación del número de barras. Es necesario dividir el plazo de optimización por un número, por ejemplo, 100. Si hay 1000 barras en el intervalo, obtendremos 1000 / 100 = 10 puntos de tiempo en los que podemos realizar los cálculos. Así, cuanto más pequeño sea el número, mayor será la precisión del cálculo.

Yo también me he estado rascando la cabeza con esto. Resulta que cuantas menos secciones, mayor es la probabilidad de ajuste.

Por otro lado, R-Portfolio utiliza matrices de pago, entre las cuales las más informativas son las cuadradas, es decir, cuántos instrumentos financieros se analizan, por lo que debe haber muchas secciones.

Pero la cuestión es que incluso los instrumentos bien correlacionados pueden cambiar de signo de correlación en determinados momentos. Es decir, si se dividen los fragmentos como se considere oportuno, existe la posibilidad de que el análisis contenga precisamente esos malos momentos con los signos cambiados.

En resumen, llegué a la conclusión de que no debemos dividir las secciones en intervalos iguales (con el mismo número de barras), sino en los extremos de algún instrumento individual (por ejemplo, el que tenga la máxima participación en la cartera). Es decir, aplicar ZigZag o algún otro algoritmo, detectar los puntos de ruptura de las tendencias y por estos puntos (en estas barras solamente) descontar las cotizaciones para alimentar posteriormente a R-Portfolio (o algún otro programa de análisis de carteras). Parece ser la forma más kosher y más informativa. De lo contrario, obtendremos algún tipo de análisis de ruido entre los puntos de los cambios de corrección, por ejemplo, en los laterales.

Razón de la queja: