Witam,
poniżej podaję kod w VBA.
jest to wersja mocno ogólna - liczy tylko wartość call.
w body funkcji są "wykomentowane" linijki liczące pozostałe wartości: put, greki.
Funkcja zwraca tylko jedną wartości (może zwracać tablicę ale to utrudnia jej wykorzystanie). Proszę pamiętać aby dla pozostałych wartości napisać kod w osobnych funkcjach na podstawie kody z komentarzami np dla delty call:
Function deltac(p, x, v, t, r)
d1 = (Log(p / (x / (1 + r) ^ t)) / (v * (t ^ 0.5))) + (v * (t ^ 0.5)) / 2
d2 = d1 - (v * (t ^ 0.5))
CallValue = Application.NormSDist(d1) * p - Application.NormSDist(d2) * (x / (1 + r) ^ t)
deltacall = Application.NormSDist(d1)
deltac = deltacall
End Function
mając kod można napisać dowolny arkusz.
Też na początku korzystałem z arkusza bossy. jednak jest dość toporny i mocno obciążający system.
Obecnie korzystam z własnych arkuszy liczących online zmienność implikowaną na seriach opcji, rysujące tzw uśmiechy zmienności, wychwytującą dobre wyceny spreadów i ratio spreadów.
kolejny arkusz graficznie prezentuje portfel oczywiście wraz z możliwością testowania zmienności implikowanej oraz wartości portfela w czasie.
tak naprawdę tylko potrzeby są ograniczeniem :)
Pozdrawiam i zapraszam do pytań.
KOD
Function bs(p, x, v, t, r)
'p = wartość obecna instrumentu bazowego
'x = cena wykonania
'v = implikowana zmienność
't = czas do wygaśnięcia (w wywołaniu funkcji wpisujemy na 30/365)
'r = stopa wolna od ryzyka
d1 = (Log(p / (x / (1 + r) ^ t)) / (v * (t ^ 0.5))) + (v * (t ^ 0.5)) / 2
d2 = d1 - (v * (t ^ 0.5))
'wartość call
CallValue = Application.NormSDist(d1) * p - Application.NormSDist(d2) * (x / (1 + r) ^ t)
'-----------------------
'BankDeposit = (x / (1 + r) ^ t)
'PutValue = CallValue + BankDeposit - p
'DeltaCall = Application.NormSDist(d1)
'DeltaPut = -Application.NormSDist(-d1)
'vega = p * t ^ 0.5 * norm(d1)
'ThetaCall = -(p * v * norm(d1) / (2 * t ^ 0.5)) - (r * (x / ((1 + r) ^ t)) * Application.NormSDist(d2))
'ThetaPut = -(p * v * norm(d1) / 2 * t ^ 0.5) + (r * (x / (1 + r) ^ t) * Application.NormSDist(-d2))
'RhoCall = t * (x / (1 + r) ^ t) * Application.NormSDist(d2)
'RhoPut = -t * (x / (1 + r) ^ t) * Application.NormSDist(-d2)
'LambdaCall = DeltaCall * p / CallValue
'LambdaPut = DeltaPut * p / PutValue
'Gamma = norm(d1) / (p * v * (t ^ 0.5))
'
bs = CallValue
End Function
------------------------------------------------
"This is ten percent luck, twenty percent skill
Fifteen percent concentrated power of will
Five percent pleasure, fifty percent pain
And a hundred percent reason to remember the name!"
Fort Minor
Remember The Name