3 votos

Mark Joshi Finanzas cuantitativas técnicas numéricas, escribir un algoritmo que produce una variable aleatoria

Antecedentes:

Me estoy preparando para unas entrevistas y me han dicho que intente responder al mayor número posible de problemas del libro de Mark Joshi.

Pregunta:

Supongamos que un activo toma valores de un conjunto discreto $v_j$ y las probabilidades de $v_j$ es $p_j$ . Escriba un algoritmo que produzca la variable aleatoria para este activo a partir de una variable aleatoria uniformemente distribuida

No estoy seguro de entender la pregunta que se plantea aquí. Cualquier sugerencia o aclaración es muy apreciada.

3 votos

Me pregunto si @MarkJoshi intervendrá...

0 votos

Además, calcula la probabilidad de que tu futuro empleador esté leyendo este post. ;)

0 votos

@vanguard2k jaja no me asustes así

5voto

Thomas Stets Puntos 128

Sí. El libro de Mark Joshi es una buena preparación.

Para esta pregunta se le da una función aleatorio() produciendo un número aleatorio uniforme y lo que queremos es una función next() que produce realizaciones de un $X$ variable con valores $v_j$ tal que $P(X=v_j)=p_j$ .

De los libros de texto estándar conocemos la siguiente transformación: Si $u_i$ son números aleatorios uniformes y $g$ la inversa de una función de distribución acumulativa $F$ entonces $g(u_i)$ son realizaciones de una variable aleatoria con f.d.c. $F$ .

En nuestro caso lo mejor es almacenar los valores en un vector $v[]$ así que sólo tenemos que manejar el índice aleatorio $Y$ con $P(Y=j)=p_j$ . La f.d.c. viene dada por $$ F[k] = P(Y\le k) = \sum_{j \le k} p_j $$ y se puede almacenar en otra matriz, Ahora la inversa es fácil de implementar:

int g(double x)
{
    for (int k = 0; k < F.Length; k++)
    {
        if (x <= F[k])
        return k;
    }
    return F.Length - 1; // you're not getting here
}

y

double next()
{
    return v[g[random()]];
}

Hecho. La transformada también puede usarse para generar números aleatorios normales, exponenciales...

0 votos

Según tengo entendido primero creo un vector de números aleatorios uniformes de tamaño $n-1$ entonces creo una función cdf $F$ (He utilizado CDF normal). Luego creo una función $g$ que calcula la inversa de $F$ ?

0 votos

Puede crear un vector o llamar a la función repetidamente como se ha implementado anteriormente. La mejor manera es implementar directamente $g$ (la inversa de $F$ ). Para la distribución normal existe un código para la f.d.c. inversa (p.ej. Numerical Recipees) y para la exponencial es fácil de escribir analíticamente.

3voto

Corey Goldberg Puntos 15625

Estoy seguro de que ha visto el $n=2$ caso:

Escriba un programa que devuelva "Sí" con probabilidad p y "No" en caso contrario. Se le da una función runif(), que devuelve un número aleatorio entre 0 y 1.

Solución:

r = runif(); si $r<p$ entonces devuelve "SÍ"; en caso contrario devuelve "NO".

A partir de este ejemplo bien conocido hay que generalizar a más de 2 resultados posibles. Imagina que tienes que simular una rueda giratoria de lotería con sectores desiguales. de anchura $p_1,p_2,\cdots$ con $r$ que representa la distancia (fracción de círculo) que ha girado la rueda.

Solución:

Después de extraer un número aleatorio uniforme r=runif(), se comprueba su valor. Si $r<p_1$ vuelves $v_1$ si no $r<p1+p2$ vuelves $v_2$ si no $r<p_1+p_2+p_3$ vuelves $v_3$ ,... El caso general, para $n$ es un simple bucle que comprueba si $r$ está en el rango correcto y devolviendo el valor correspondiente a ese sector. (¿Crees que puedes escribir el código?).

0 votos

Es $p_1,p_2,\ldots$ números aleatorios uniformes de $0$ a $1$ ¿también?

0 votos

$p_1,p_2,\cdots$ son las probabilidades dadas.

2voto

keno Puntos 1682

Las respuestas anteriores, que sugieren simular $U\sim(0,1)$ y devolviendo $J$ tal que $\sum_{i=1}^{J-1} p_i \le U < \sum_{i=1}^{J} p_i$ estará bien para la entrevista. Sin embargo, como esto no es sólo un sitio de preguntas y respuestas sobre entrevistas de trabajo, me gustaría señalar que para grandes espacios muestrales, o si haces muchas muestras incluso de espacios muestrales de tamaño modesto, esto es extremadamente ineficiente. Me horrorizaría ver que esto se utilizara en código de producción en el siglo XXI para estos casos-. Muestreo de alias Walker por ejemplo, es una alternativa mucho mejor.

1 votos

Si te dan el pdf (como en la pregunta), ¿por qué no utilizar el método de la transformada inversa?

0 votos

@will - como ya he mencionado, es ineficiente en general. Si el $p_j$ tiene una forma especial que le permite invertir el CDF entonces, claro, impresionante - hacer eso. O, como alude su respuesta, usted podría aproximadamente invertir la FCD, por ejemplo, ajustando splines... siempre y cuando esté conforme con aproximado simulación (a menudo lo somos, pero eso es no la cuestión aquí). Todo lo que digo es que sumar repetidamente un montón de números no es tan inteligente.

0 votos

No estoy de acuerdo en que sea ineficaz. Tal vez menos preciso, pero la eficiencia no es ni remotamente una preocupación-que es todo dentro de su código spline, que usted puede conseguir extremadamente eficiente ...

1voto

La pregunta te pide que produzcas un algoritmo para generar números aleatorios con una distribución de probabilidad dada, habiendo recibido números aleatorios distribuidos uniformemente.

esencialmente, necesita proporcionar alguna función, $f(\phi(\ldots)): \tilde{X}\sim U(0,1) \to \tilde{Y} \sim \phi(\ldots)$ . Es decir, una función de una pdf, que convertirá números aleatorios uniformemente distribuidos en números aleatorios distribuidos según la pdf proporcionada.

Hay varias formas de hacerlo descritas en wikipedia en el caso de esta pregunta concreta, la que usted desea es muestreo por transformada inversa . Sólo tienes que integrar el pdf para obtener un cdf a utilizar. A continuación, puede crear una spline de interpolación para él, en alguna cuadrícula, y luego intercambiar x e y para invertirlo.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X