Bonjour,
Me remettant au VBA après un long arret, je me suis lance dans quelques exercices habituellement assez simples, mais qui, finalement, posent des soucis qui ont l'air lies au language lui-meme. Voila le bout de code concerne :
Code :
- Function vanillaCallCRR(spot As Double, strike As Double, RFIR As Double, vol As Double, maturity As Double, nbSteps As Integer) As Double
- Dim size As Long
- size = (nbSteps + 1) * (nbSteps + 2) / 2
- Dim step, up, down, upProb As Double
- step = maturity / nbSteps
- up = Exp((RFIR + vol) * Sqr(step))
- down = Exp((RFIR - vol) * Sqr(step))
- upProb = (1 - Exp(-vol * Sqr(step))) / (Exp(vol * Sqr(step)) - Exp(-vol * Sqr(step)))
- Dim assetPriceTree() As Double
- ReDim assetPriceTree(nbSteps + 1)
- assetPriceTree(1) = spot * up ^ nbSteps
- For i = 2 To nbSteps + 1
- assetPriceTree(i) = assetPriceTree(i - 1) * down / up
- Next i
-
- Dim optionPriceTree() As Double
- ReDim optionPriceTree(size)
- For i = 1 To nbSteps + 1
- optionPriceTree(nbSteps * (nbSteps + 1) / 2 + i) = Max(assetPriceTree(i) - strike, 0)
- Next i
- For i = nbSteps - 1 To 0 Step -1
- For j = 1 To i + 1
- optionPriceTree(i * (i + 1) / 2 + j) = (upProb * optionPriceTree((i + 1) * (i + 2) / 2 + j) + (1 - upProb) * optionPriceTree((i + 1) * (i + 2) / 2 + (j + 1))) * Exp(-RFIR * Sqr(step))
- Next j
- Next i
-
- vanillaCallCRR = optionPriceTree(1)
- End Function
|
Premier test sur un set de parametre simple : (100, 100, 0, 0.2, 1, 10). Cela semble fonctionner, donc je fais varier le dernier parametre pour tester, et il semblerait qu'au dela d'une certaine limite, le code ne fonctionne plus : pour nbSteps <=179, la fonction affiche une valeur, mais pour nbSteps>179, je me retrouve avec #Value. En utilisant le debugeur, il s'avere que le code s'arrete sans raison et sans alerte a la ligne 4. En remplacant ladite ligne par les lignes suivantes :
Code :
- size = nbSteps + 1
- size = size * (nbSteps + 2)
- size = size / 2
|
autrement dit, exactement la meme operation, mais decompose en plusieurs lignes, le code se poursuit... jusque le premier appel de la ligne 21... qui realise effectivement une operation du meme type, mais qui est plus compliquee a changer, et, surtout, rendra le code bien plus lourd a executer.
Dernier point : en transformant cette fonction en macro, le code s'execute sans souci, meme avec un paramètre nbSteps bien supérieure. Bref, on dirait que les fonctions appelables sous Excel sous soumises à des contraintes supplémentaires par rapport aux macros. Est-ce le cas? Si oui, est-ce contournable? Si non, quelqu'un aurait-il une idée sur l'origine du problème?
D'avance, merci
Viserion