Estoy tratando de usar el generador de números aleatorios de baja discrepancia Sobol RNG para generar números aleatorios distribuidos normalmente y llenar una matriz Eigen con esos números aleatorios. La matriz representa una canasta de 5 activos (filas), cada uno con 5000 ensayos (columnas). Después de revisar la documentación de QuantLib, he llegado al siguiente código. Sin embargo, los números aleatorios generados son todos iguales para cada columna en la matriz.
MoroInverseCumulativeNormal invGauss;
MatrixXd quasi = MatrixXd::Zero(num_credits,num_trials);
double current_sobol_num{}, current_normal_number{};
for (int c{0}; c< num_credits;++c){
SobolRsg sobolEngine(1);
for (int t{0}; t < num_trials;++t){
current_sobol_num = (sobolEngine.nextSequence().value)[0];
current_normal_number = invGauss(current_sobol_num);
quasi(c,t) = current_normal_number;
};
}
La matriz después de ejecutar el código anterior es :
Activo
t0
t1
t2
t3
t4
Primero
0
0.6745
-0.6745
-0.3186
1.1503
Segundo
0
0.6745
-0.6745
-0.3186
1.1503
Tercero
0
0.6745
-0.6745
-0.3186
1.1503
Cuarto
0
0.6745
-0.6745
-0.3186
1.1503
Quinto
0
0.6745
-0.6745
-0.3186
1.1503
¿Alguna idea de qué estoy haciendo mal? ¿Hay alguna manera de obtener los 5000 aleatorios de una vez en lugar de sacar uno a la vez?
Estoy usando QuantLib solo para las funciones de SobolRng e Inverse Gaussian. Estoy abierto a usar cualquier otra biblioteca de código abierto si se sugiere.
Muchas gracias por su tiempo.
0 votos
Para cada
c
, reinicias el rsg con la semilla predeterminada en 0. ¿Has intentado mover la instanciación de SobolRsg sobolEngine fuera del bucle for?0 votos
Sí, he intentado moverlo fuera del bucle. No estoy seguro de cuál debería ser el parámetro "dimensión" para el RNG. Si uso 5000 como "SobolRsg sobolEngine(5000)", obtengo una matriz que parece "aleatoria" pero los resultados de mi simulación cuasi son muy diferentes a la simulación pseudo.