Random

Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

azinc escribió: 19 Abr 2018 12:00Perdonar mi ignorancia, que uso le podeis dar a una sucesión de números pseudo-aleatorios con distribución uniforme?
Hola, azinc.


Muy buena pregunta.

He visto en otros foros que hay traders que usan funciones random para simular los deslizamientos en un bactesting, para que sea más realista.

Cuando uno tiene que tomar una decisión (por ejemplo si abrir largos o cortos) y tiene muchas dudas, una de las opciones es lanzar una moneda. Y es posible que la moneda le de mejor resultado porque el mercado es muy engañoso.
Y eso es lo que quiero estudiar, el impacto de añadir, en un sistema de trading, un filtro aleatorio para ver si el sitema mejora, o empeora, y tomar conclusiones.

Recuerdo que las tortugas, si se rompia una banda Donchian(55), no se lo pensaban dos veces y abrian operación en el sentido de la ruptura. Pero si la banda que se rompia no era la Donchian(55) si no la Donchian(20), lo que hacían es que si la anterior operación (imaginaria o real) era ganadora, renunciaban a abrir operación, y si la anterior operación (imaginaria o real) era perdedora, abrían la operación. La pregunta es ¿es esto mejor que tirar una moneda? Porque esto va de astucia (de la asucia de las manos duras contra las manos blandas), y tal vez una función random se ría de la astucia de las manos duras. No sé si me explico.
azinc escribió: 19 Abr 2018 12:00 Supongo que tiene que ver con intentar demostrar la robusted de un sistema ¿?
Ese sería otro uso.

Podemos utilizar las entradas al azar para probar el funcionamiento de las estrategias de salida diferentes.

Aquí sería interesante compartir usos posibles de un indicador random en el diseño de sistemas de trading.



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Sres. forsitas,



El principal uso de un indicador Random, en sistemas de trading, es el de evaluar el subsistema de salida de un sistema de trading, sustituyendo el subsistema de entrada por entrada aleatoria.

Por ejemplo, un sistema con entrada aleatoria (si sale cara abrir largos, si sale cruz abrir cortos) y salida por trailing stop, puede ser ganador antes de comisiones porque la potencial ganancia de la operación es ilimitada y la potencial pérdida de la operación es limitada (por el stop loss inicial).



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Re: Random

Mensaje por cls »

Hola Rafa,

aunque trabajes con proreal, dejo aquí un estudio en NinjaTrader por si alguien quiere investigarlo más a fondo.

Voy a usar el trailing-stop que lleva ninja implementado automáticamente y que funciona del siguiente modo: se coloca el stop-loss y si al cierre de barra el precio se ha movido a favor, el stop-loss se mueve en la misma cantidad que el avance (para el avance se mira el High o el Low).

Si el SL lo tienes muy cerca te sacan pronto y en pérdidas, antes de que el precio haya avanzado lo suficiente. Pero si lo alejas mucho, el avance puede que sea escaso antes de que se dé la vuelta y te salte. El único escenario válido sería entrar al inicio de una tendencia, que tuviera retrocesos pequeños. Y ese inicio tendrías que pillarlo aleatoriamente.
Además, por definición siempre estarás en mercado y cuando llegue esa barra ideal para entrar, lo más probable es que ya estés en mercado; salvo que justo en la barra anterior te haya sacado el trailing, y en tal caso para entrar en el sentido correcto en esa barra ideal, tendrías sólo una probabilidad del 50%.

En resumen, tienes una probabilidad muy remota de entrar en esos precios de "ganancia ilimitada y pérdida limitada".

Para salir de dudas dejo un sistema de test para NinjaTrader8. Es muy básico y la gestión del trailing funciona como he dicho antes, siendo realizada automáticamente por NinjaTrader. Si ajustas los ticks del SL al rango puede que saques algún test en profit, pero la mayoría salen en pérdidas, y como no ajustes bien los ticks, las pérdidas son enormes. También he añadido un parámetro para los ticks de profit por si quieres probar a salir con ganancia fija; si sólo quieres que te saque por trailing hay que poner un valor muy alto que sea inalcanzable para los ticks de profit.

Saludos
Adjuntos
Zs8Random01.zip
(1.72 KiB) Descargado 230 veces
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Gracias, cls.



Cuando tenga la función random a punto, podré probarlo.

He utilizado periodo1 = 233 para la semilla y periodo2 = 144 para la serie. Pero veo unos problemas en que los periodos sean diferentes.
Si periodo1 > periodo2, tenemos colisiones, y, por lo tanto, las claves posibles tendrán probabilidades diferentes.
Si periodo1 < periodo2, tenemos un poco menos de claves posibles, aunque con la misma probabilidad.
De los 2 problemas el 2º es el menos grave.
Y conviene que periodo1 sea muy próximo a periodo2. (Los periodos no pueden ser el mismo porque quiero que periodo1 sea primo y que periodo2 no sea primo).
Así que probablemente me conviene tomar como periodo1 el primo inferior a 144, más próximo a 144, el cual es 139.
Esta noche probaré 139 como periodo1.

Otra opción muy interesante es generar los números pseudoaleatorios con el algoritmo RC4 (Rivest Cipher 4) pero aplicado a vectores con números enteros del 0 al 9 (en lugar de 0 a 255). Pero, para ello, tendría que estudiar a fondo el algoritmo RC4. La dificultad de implementar este algoritmo está en que ProRealTime no admite Arrays. La ventaja del RC4 como generador de números pseudoaleatorios está en que la serie generada no es necesariamente cíclica.



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com

Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Sres. foristas,



Viendo las limitaciones de ProRealTime con números muy grandes, me conformo con 2 decimales.
El algoritmo X(n) = (A * X(n - 1)) MOD M, se le llama congruencial multiplicativo, es adecuado para M = 2^k.
Y A debe verificar: A = 3 + 8 * h o A = 5 + 8 * h, para h = 1, 2, 3, ...
Por ejemplo A = 13 = 5 + 8 * 1
Otra cosa, para obtener un periodo de n elementos, se necesita que M >= n * 4.
Como quiero 2 decimales, necesito que M >= 400.
Ln(400) / Ln(2) = 8,64
Por lo tanto tomo M = 2^9 = 512.
Otra cosa, la semilla debe ser impar.

Os adjunto el código.

ProRealTime.random
ProRealTime.random

Código: Seleccionar todo

//Programado por Rafa7, forista de x-trader.net
//parámetros: hh (hora), mm (minuto) y ss (segundo), que por defecto son cero
//Si el mercado está cerrado, es necesario informar los parámetros, con la hora actual, ya que las funciones current* retornan ceros.
//Si el mercado está abierto, no hay necesidad de informar los parámetros porque las funciones current* estáran activas.
if periodo = 0 then
   if hh = 0 and mm = 0 and ss = 0 then
      hh = currentHour
      mm = currentminute
      ss = currentSecond
   else
      hh = abs(hh) mod 24
      mm = abs(mm) mod 60
      ss = abs(ss) mod 60
   endif
   periodo = 512
   random = 2 * (1440 * ss + 24 * mm + hh + days) + 1
endif
random = (13 * random) mod periodo
return random / (periodo - 1) as "random"
La instrucción "random = 2 * (1440 * ss + 24 * mm + hh + days) + 1" es porque para que el ciclo sea el más largo posible la semilla ha de ser impar.

Otra cosa que he añadido el código es proveer que los parámetros el trader los introduzca manualmente negativos o fuera de rango. Por ejemplo, con hh = abs(hh) mod 24, me aseguro que de hh esté entre 0 y 23, incluso si hh se introdujo como negativo.



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12781
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Random

Mensaje por X-Trader »

Muy interesante, me lo miro, a ver qué conclusiones saco.

Saludos,
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Curiosamente, en el algoritmo x(i) = (a * x(i - 1)) mod 2^n, conocido como congruencial multiplicativo, elijas la semilla que elijas, mientras sea impar va a tener un ciclo de 2^(n - 2) números (además todo ellos impares). En cambio si la semilla es par, el ciclo será inferior (y todos los números de la serie serán pares). Por ello conviene elegir semilla impar.
Con la semilla impar todo los valores de la serie serán impares, y, por lo tanto, nunca será cero. Por ello para generar número entre cero y uno, se divide el número de la serie por periodo - 1.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Sres. foristas,



En el algoritmo congruencial multiplicativo, x(n) = (a * x(n - 1)) mod (2^k), la máxima precisión que podemos conseguir con ProRealTime, son 5 dígitos, ya que he probado una precisión de 0,5 * 10^(-6), seis dígitos, y da problemas porque se operan con números demasiado grandes para los límites de ProRealtime.
Para obtener una precisión de 0,5 * 10^(-5), cinco dígitos, el algoritmo sería:
x(n) = (a * x(n - 1)) mod (2^20) = (a * x(n - 1)) mod 1048576.
Y, elijo, como "a", que tiene que ser de la forma 3 + 8 * n, o de la forma 5 + 8 * n, 1597, ya que 1597 = 5 + 8 * 199. Además, me gusta porque 199 es primo, y porque 1597 es número de Fibonacci.
Y, para preveer que algún día days sea un número enorme y tengamos problemas al calcular el 1r número random, acoto, con mod, a la función days.
Por mejora computacional (para ahorrar una resta en cada vela en el return), uso la variable periodo1 = periodo - 1. O sea periodo = 1048576 y periodo1 = 1048576 - 1 = 1048575.

Código: Seleccionar todo

//Programado por Rafa7, forista de x-trader.net
//parámetros: hh (hora), mm (minuto) y ss (segundo), que por defecto son cero
//Si el mercado está cerrado, es necesario informar los parámetros, con la hora actual, ya que las funciones current* retornan ceros.
//Si el mercado está abierto, no hay necesidad de informar los parámetros porque las funciones current* estáran activas.
if periodo = 0 then
   if hh = 0 and mm = 0 and ss = 0 then
      hh = currentHour
      mm = currentminute
      ss = currentSecond
   else
      hh = abs(hh) mod 24
      mm = abs(mm) mod 60
      ss = abs(ss) mod 60
   endif
   periodo = 1048576
   periodo1 = 1048575
   random = 2880 * ss + 48 * mm + 2 * hh + 2 * (days mod periodo)+ 1
endif
random = (1597 * random) mod periodo
return random / periodo1 as "random"


Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Sres. foristas,



He modificado el aporte anterior para corregir el código introduciendo pequeñas mejoras.



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

X-Trader escribió: 18 Abr 2018 10:17 Hola Rafa7, yo no me complicaría con los tiempos, prueba con este pseudocódigo:

Código: Seleccionar todo

var
   x  : real;
begin
  X := 0.1;
  Repeat
    X := 147 * X – Int(147 * X);
    showmessage(Floattostr(X * 10));
    X := X+ 0.1;
  until X > 100;
end;
Saludos,
X-Trader
Hola, X-Trader.



Es interesante este método que has compartido. Pero he preferido el congruencial (x(n) = (a * x(n - 1) + c) mod m) porque de este último se han hecho muchos estudios sobre las condiciones que deben cumplir los coeficientes y la semilla. En el sistema que compartes, no sé que condiciones se deben cumplir.

O sea, no lo he adoptado, no porque sea mal sistema (tal vez es buenísimo y sencillo) sino porque no conozco estudios sobre él.

Por lo que he visto, en algunos sistemas se usan la parte decimal de raíces de números primos, ya que las raíces de números primos son irracionales, o sea con infinitos dígitos y no periódicos. Los números irracionales pueden usarse para generar números pseudoaleatorios. Por ejemplo hay sistemas que generan números pseudoaleatorios a partir de los dígitos de Pi (3,141592653589793...).



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Indicadores”