Random

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

Re: Random

Mensaje por Rafa7 »

mascara escribió:
19 Abr 2018 11:49
Por si te sirve. He hecho un programa basándome en el código de una función que existe en el sistema con el que trabajo que da un número aleatorio.
Gracias, mascara.



Sí, me sirve y confirma la sugerencia de Rango Starr de usar en el tiempo también años, meses y dias, además de horas. minutos y segundos.

Si no he ente4ndido mal tu código, lo que haces es aplicar el siguinte algoritmo:
X(n + 1) = (67301 * X(n) + 1) mod (2^32).
Y tomando como semilla la fecha-tiempo en segundos.

¿He entendido bien?

Bien, he descubierto que en ProRealTime hay una función Dates, que devuelve los días transcurridos desde 1900.
Entonces, en ProRealTime podríamos tomar como semilla los segundos desde 1900: 86400 * Dates + 3600 * CurrentHour + 60 * CurrentMinute + CurrentSecond.

Y, se podría hacer con un poco de habilidad, darle la vuelta a los dígitos de la semilla para añadir más "aletoriedad". Por ejempo, supongamos que days = 43098 y time = 17:06:51. Entonces 86400 * 43098 + 3600 * 17 + 60 * 6 + 51 = 3723728811. Y si le damos la vuelta a los dígitos tenemos la siguiente semilla:
1188273273

Aquí tengo algunas preguntas:
¿Por qué 2^32? Si nos conformásemos con obtener números aleatorios de 8 dígitos, ¿podríamos usar 2^n, con n menor que 32?
¿Por qué 67301? ¿Es porque cada M = 2^n, tiene un número óptimo, y el de n = 32, tiene número óptimo 67301?



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

Avatar de Usuario
mascara
Mensajes: 338
Registrado: 18 Oct 2007 23:15

Re: Random

Mensaje por mascara »

Rafa7 escribió:
19 Abr 2018 17:17
mascara escribió:
19 Abr 2018 11:49
Por si te sirve. He hecho un programa basándome en el código de una función que existe en el sistema con el que trabajo que da un número aleatorio.
Gracias, mascara.



Sí, me sirve y confirma la idea de Rango Starr de usar en el tiempo también años , meses y dias, además de horas. minutos y segundos.

Si no he ente4ndido mal tu código, lo que haces es aplicar el siguinte algoritmo:
X(n + 1) = (67301 * X(n) + 1) mod (2^32).
Y tomando como semilla los segundos.

¿He entendido bien?

Bien, he descubierto que en ProRealTime hay una función Dates, que devuelve los días transcurridos desde 1900.
Entonces, en ProRealTime podríamos tomar como semilla los segundos desde 1900: 86400 * Dates + 3600 * CurrentHour + 60 * CurrentMinute + CurrentSecond.

Y, se podría hacer con un poco de habilidad, darle la vuelta a los dígitos de la semilla para añadir más "aletoriedad". Por ejempo, supongamos que days = 43098 y time = 17:06:51. Entonces 86400 * 43098 + 3600 * 17 + 60 * 6 + 51 = 3723728811. Y si le damos la vuelta a los dígitos tenemos la siguiente semilla:
1188273273

Aquí tengo algunas preguntas:
¿Por qué 2^32? Si nos conformásemos con obtener números aleatorios de 8 dígitos, ¿podríamos usar 2^n, con n menor que 32?
¿Por qué 67301? ¿Es porque cada M = 2^n, tiene un número óptimo, y el de n = 32, tiene número óptimo 67301?



Saludos.
Pues justo esas preguntas son las que decía que no iba a saber contestar... Como te digo, ese código lo he hecho copiando el código de una función estandard del sistema y adaptándolo para construir un programa que me permitiera simular un número de ejecuciones y ver si realmente el resultado daba la impresión de ser aleatorio... Por ejemplo, antes de ese código hice lo mismo usando el código de otra función distinta también del sistema y me daba que el 0 y el 10 siempre salían la mitad de las veces aprox. que el resto. El resto parecía que se repartía bien, pero justo en los extremos siempre salían más o menos la mitad... Así que busqué otra función de la que copiar y esa me pareció que daba resultados mejores...
Pero claro, el por qué esa fórmula y no otra, o por qué esas constantes, pues no sé decirte :(

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

Re: Random

Mensaje por Rafa7 »

mascara escribió:
19 Abr 2018 17:27
ese código lo he hecho copiando el código de una función estandard del sistema
Gracias, mascara.



¿Podrías aportar la fuente de donde copiaste ese código?

Supongo que si tomamos m = 2^32 y c = 1, en el algoritmo X(n +1) = (a * X(n) + 1) mod (2^32), se podrían probar diversas "a", a ver cual de ellas cuple lo siguiente:
1.- Qué el periodo del ciclo sea 2^32 (el máximo). (Para ellos hay unos teoremas que indican condiciones exigibles ...).
2.- De las "a" que cuplen 1.-, elegir la que tinen una distribución más homogénea.

Tal vez alguien ha hecho tal estudio y ha publicado la "a" óptima.



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

Avatar de Usuario
mascara
Mensajes: 338
Registrado: 18 Oct 2007 23:15

Re: Random

Mensaje por mascara »

Fuente como tal, es el propio sistema, te pongo unos pantallazos de la función que he copiado, con la documentación que tiene. Verás que es una función que se llama QF05_RANDOM_INTEGER, esa hace uso dentro de otra que se llama QF05_RANDOM y esa tiene dentro una rutina de inicialización que se llama ranini. Son los tres pantallazos que pego... Mi código es una copia de esos tres componentes quitando cosas como algunas comprobaciones que hace al principio o cosas en la inicialización, que haciendo pruebas yo, veía que no tenían efecto porque parecía funcionar bien sin eso, y así he intentado dejar el ejemplo con lo mínimo para que funcione... Por ejemplo en la inicialización verás una instrucción "get parameter" que en mi caso devolvía siempre cero porque ese parámetro estará así aquí con lo que al ser cero al final era como si la incialización sólo necesitase de la línea "ran_seed = l_datum * lc_faktor + sy-uzeit." que es lo que mentuve yo en mi versión...
funcion_random1.PNG
funcion_random2.PNG
rutina_inicializacion_random.PNG
No sé si esa documentación te ayudará...

Saludos,

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

Re: Random

Mensaje por Rafa7 »

Gracias, mascara.



Yo creo que lo m = 2^n (en tu ejemplo n = 32), es para que la función sea más rápida desde el punto de vista computacional. Pero desde el punto de vista de obtener series con distribución más uniforme, no creo que tenga sentido.

En el algoritmo X(n +1) = (A * X(n) + C) mod M, A, C y M tiene que cumplir una serie de propiedades, que me tengo que mirar con calma, que haga que la serie tenga el máximo periodo posible, o sea, M.
Y por el tema de la precisión, supongo que si quiero números de 8 dígitos, necesitaría M >= 10^8. Luego habría que ver si conviene que M sea primo, o no necesariamente, y si conviene que M sea de la serie de Fibonacci. Estaría bien que además de las propiedades exigibles según la teoría, M, A y C, sean de la serie de Fibonacci. Lo digo desde un punto de vista intuitivo y sin ningún rigor académico.



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

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

Re: Random

Mensaje por Rafa7 »

Malas noticias. las funciones current* no funcionan si el mercado está cerrado.
Y Days no lo entiendo. Según el manual de PRT, Days son los días desde 1900.
Days debería retornar, aproximadamente (2018 - 1900) * 365,24 = 118 * 365,24 == 43098
dias. Sin embargo está retornado ahora 17640.
¡Qué horror!
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com

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

Re: Random

Mensaje por Rafa7 »

Sres. foristas,



Tiro la toalla.

Yo lo que necesito es:
1. Un buen algoritmo, sencillo de implementar, para generar números pseudoaleatorios entre 0 y 1, con distribución uniforme.
2. Una semilla aleatoria.

Lo del algoritmo, solucionado. Ya tengo varios a elegir, de los cuales hemos hablado en este hilo. Muchas gracias a todos.

Pero, lamentablemente, no es posible, con ProRealTime, fuera de mercado, obtener ninguna semilla aleatoria, ya que las que pensaba usar, las funciones current*(CurrentHour, CurrentMinute, CurrentSecond), fuera de mercado retornan siempre cero.

ES IMPOSIBLE OBTENER EN PROREALTIME UNA SEMILLA ALEATORIA.



Saludos.
Última edición por Rafa7 el 20 Abr 2018 11:02, editado 1 vez en total.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com

Rango Starr
Mensajes: 3614
Registrado: 22 Dic 2014 10:49

Re: Random

Mensaje por Rango Starr »

Rafa7 escribió:
20 Abr 2018 10:15
Sres. foristas,


Tiro la toalla.

Yo lo que necesito es:
1. Un buen algoritmo, sencillo de implementar, para generar números pseudoaleatorios entre 0 y 1, con distribución uniforma.
2. Una semilla aleatoria.

Lo del algoritmo, solucionado. Ya tengo varios a elegir, de los cuales hemos hablado en este hilo. Muchas gracias a todos.

Pero, lamentablemente, no es posible, con ProRealTime, fuera de mercado, obtener ninguna semilla aleatoria, ya que las que pensaba usar, las funciones current*, fuera de mercado retornan siempre cero.

ES IMPOSIBLE OBTENER EN PROREALTIME UNA SEMILLA ALEATORIA.



Saludos.
utiliza las raices cuadradas de los cierres de los dias anteriores... quitales la parte entera, y "maquealos" a tu gusto. Si es por la semilla tendras multiples de ellas, con un comportamiento bastante erratico, para generar psuedoaleatorios.

EDITO.-(Estoy empinando el codo que estoy de entierro.... que "se-ma" muerto el DAX..... vaya dos dias de birria que esta teniendo jajaja)

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

Re: Random

Mensaje por Rafa7 »

Rango Starr escribió:
20 Abr 2018 10:59
utiliza las raices cuadradas de los cierres de los dias anteriores... quitales la parte entera, y "maquealos" a tu gusto. Si es por la semilla tendras multiples de ellas, con un comportamiento bastante erratico, para generar psuedoaleatorios.
Gracias, Rango Starr.



El problema es que si hago lo que tu dices, por la noche, fuera de mercado, obtendré una semilla, por ejemplo 08523411. Pero si al cabo de unos minutos o segundos, vuelvo a repetir el proceso, obtendré la misma semilla 08523411. O sea que si hago varios backtestings, los resultados serán clavados porque la serie de números pseudoaleatorios serán siempre los mismos porque la semilla será siempre la misma.

Por eso tiro la toalla, porque no hay manera de conseguir una semilla diferente cada vez que haga un backtesting (salvo que lo haga dentro de las horas de mercado).

No sé si me consigo explicar ...



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

Rango Starr
Mensajes: 3614
Registrado: 22 Dic 2014 10:49

Re: Random

Mensaje por Rango Starr »

Rafa7 escribió:
20 Abr 2018 11:19
Rango Starr escribió:
20 Abr 2018 10:59
utiliza las raices cuadradas de los cierres de los dias anteriores... quitales la parte entera, y "maquealos" a tu gusto. Si es por la semilla tendras multiples de ellas, con un comportamiento bastante erratico, para generar psuedoaleatorios.
Gracias, Rango Starr.



El problema es que si hago lo que tu dices, por la noche, fuera de mercado, obtendré una semilla, por ejemplo 08523411. Pero si al cabo de unos minutos o segundos, vuelvo a repetir el proceso, obtendré la misma semilla 08523411. O sea que si hago varios backtestings, los resultados serán clavados porque la serie de números pseudoaleatorios serán siempre los mismos porque la semilla será siempre la misma.

Por eso tiro la toalla, porque no hay manera de conseguir una semilla diferente cada vez que haga un backtesting (salvo que lo haga dentro de las horas de mercado).

No sé si me consigo explicar ...



Saludos.

si.. pero te puedes hacer un algoritmo para que vaya hacia atras buscando el cierre de n dias anteriores....
si quieres ese numero hasta se lo puedes dar manualmente por si no quieres hacer series de montecarlo, que creo que es lo que estas pensando

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

Re: Random

Mensaje por Rafa7 »

Rango Starr escribió:
20 Abr 2018 11:22
si.. pero te puedes hacer un algoritmo para que vaya hacia atras buscando el cierre de n dias anteriores....
si quieres ese numero hasta se lo puedes dar manualmente por si no quieres hacer series de montecarlo, que creo que es lo que estas pensando
Gracias, Rango Starr.



Con el cierre de n días anteriores, obtendría una semilla que si la consulto al cabo de 2 minutos, sería lo mismo, y al cabo de 3 horas, sería lo mismo, ....Porque el cierre de n días anteriores no cambia hasta que pasen 24 horas. ¿Me estoy explicando bien?

A ver, podría usar como algoritmo cualquiera de los que hemos hablado en un indicador personal de PRT que podría llamar Random, por ejemplo. Y que tenga un parametro que se llame Seed (Semilla en inglés). Entonces, abro un Excel, ejecuto Aleatorio() en el Excel y con copy/paste paso los primeros 8 dígitos al valor por defecto del parámetro Seed de la función personal Random. Y hacer esto cada vez que repita un Backtesting.

Entonces sería una semilla entrada manualmente. De manera automática ni por chiste se puede conseguir.

La única manera de tener una semilla aleatoria es entrarla manualmente.



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

Avatar de Usuario
mascara
Mensajes: 338
Registrado: 18 Oct 2007 23:15

Re: Random

Mensaje por mascara »

¿Las funciones Time y Today tampoco te sirven?

Time Time[N] Ofrece la hora en formato HHMMSS

Today Today Fecha actual en formato YYYYMMDD

Rango Starr
Mensajes: 3614
Registrado: 22 Dic 2014 10:49

Re: Random

Mensaje por Rango Starr »

Rafa7 escribió:
20 Abr 2018 11:39
Rango Starr escribió:
20 Abr 2018 11:22
si.. pero te puedes hacer un algoritmo para que vaya hacia atras buscando el cierre de n dias anteriores....
si quieres ese numero hasta se lo puedes dar manualmente por si no quieres hacer series de montecarlo, que creo que es lo que estas pensando
Gracias, Rango Starr.



Con el cierre de n días anteriores, obtendría una semilla que si la consulto al cabo de 2 minutos, sería lo mismo, y al cabo de 3 horas, sería lo mismo, ....Porque el cierre de n días anteriores no cambia hasta que pasen 24 horas. ¿Me estoy explicando bien?

A ver, podría usar como algoritmo cualquiera de los que hemos hablado en un indicador personal de PRT que podría llamar Random, por ejemplo. Y que tenga un parametro que se llame Seed (Semilla en inglés). Entonces, abro un Excel, ejecuto Aleatorio() en el Excel y con copy/paste paso los primeros 8 dígitos al valor por defecto del parámetro Seed de la función personal Random. Y hacer esto cada vez que repita un Backtesting.

Entonces sería una semilla entrada manualmente. De manera automática ni por chiste se puede conseguir.

La única manera de tener una semilla aleatoria es entrarla manualmente.



Saludos.

no eso no es lo que te habia dicho. te habia dicho un algoritmo... no que le dijeras directamente 5 velas atras y solo 5 ..... no obstante prorealtime no esta diseñado para dar mas de si. Asi que o con mercado abierto, o manualmente.. tu decides...

Rango Starr
Mensajes: 3614
Registrado: 22 Dic 2014 10:49

Re: Random

Mensaje por Rango Starr »

mascara escribió:
20 Abr 2018 11:53
¿Las funciones Time y Today tampoco te sirven?

Time Time[N] Ofrece la hora en formato HHMMSS

Today Today Fecha actual en formato YYYYMMDD

yo pienso que si que le serviria, pero vamos...

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

Re: Random

Mensaje por Rafa7 »

mascara escribió:
20 Abr 2018 11:53
¿Las funciones Time y Today tampoco te sirven?
No, porque esas funciones se refieren a la última vela. Si el mercado está cerrado, la semilla que obtenga no será aleatoria sino que será siempre la misma (hasta que pasen 24 horas).
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com


Responder

Volver a “Indicadores”