全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 金融工程(数量金融)与金融衍生品
6256 8
2010-02-18
悬赏 100 个论坛币 未解决
急求关于Monte CArlo 模拟 Path-dependent option(look back option)的资料 最好有VBA程序  谢谢
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2010-2-18 08:54:55
你可以参见
http://www.pinggu.org/bbs/thread-524522-1-1.html
最全的期权定价VBA模板
里面会有另一种Path-dependent option---Look-barrier options
另外向你推荐malab的look back optons代码
=========== Matlab Code ============================

function price = fltStrikeLookback(callPut, S, S_max_min, T, D, r, sigma) % Floating Strike Lookback Options % price = fltStrikeLookback(callPut, S, S_max_min, T, D, r, sigma) % % Input Parameters:
% ================
%   callPut   = 1 (call option) or 0 (put option)
%   S         = current asset price
%   S_max_min = if callPut is 1, then S_max_min is the minimum asset price
%               else S_max_min is the maximum asset price
%   r         = risk free rate
%   D         = dividend yield
%   sigma     = volatility
%   T         = time to maturity
%
% Output Parameter:
% =================
%   price = call option price if callPut is 1 or put option price if callPut
%           is 0
%
%
% Example from Matlab Prompt:
% ==========================
%  >> call = fltStrikeLookback(1, 100, 98, 0.501, 0.03, 0.1, 0.3) %
%     call = 17.18954547977881
%
%  >> put = fltStrikeLookback(0, 100, 98, 0.501, 0.03, 0.1, 0.3) %
%     put = 14.04526346904223
% Code adapted by Sione @ sionep@xtra.co.nz
% http://www.global-derivatives.com
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


if(callPut~=0)
  if(callPut~=1)
   error('callPut - must be a logical value of either 1 (call option) or
0 (put option).');
  end
elseif(S_max_min<0)
  error('S_max_min - must be positive.');
elseif(S<0)
  error('S - must be positive.');
elseif(T<=0)
  error('T must be a positive number.');
elseif(r<=0)
  error('r must be a positive number.');
elseif(D<=0)
  error('D must be a positive number.');
elseif(sigma<=0)
  error('sigma must be a positive number.');
elseif(r==D)
  error('D must not be equal to  r.');
end

price      = NaN;
term1      = NaN;
term2      = NaN;
brackCoeff = S*exp(-r*T)*(sigma*sigma)/(2*(r - D));
brack      = NaN;
brack2     = NaN;
temp       = NaN;
dt         = sigma*sqrt(T);


if(callPut)
   a1 = ( log(S/S_max_min) + (r - D + 0.5*sigma*sigma)*T ) / dt;
   a2 = a1 - dt;
   term1 = S*exp(-D*T)*normcdf(a1);
   term2 = S_max_min*exp(-r*T)*normcdf(a2);  
   temp = -a1 + 2*(r - D)*sqrt(T)/sigma;
   brack = (S/S_max_min)^(-2*(r - D)/(sigma*sigma))*normcdf(temp);
   brack2 = exp((r-D)*T)*normcdf(-a1);
   price = term1 - term2 + brackCoeff*(brack - brack2);
else
   b1 = (log(S_max_min/S) + (D + r + 0.5*sigma*sigma)*T)/dt;
   b2 = b1 - dt;
   term1 = S_max_min*exp(-r*T)*normcdf(-b2);
   term2 = S*exp(-D*T)*normcdf(-b1);  
   temp = b1 - 2*(r - D)*sqrt(T)/sigma;
   brack = (S/S_max_min)^(2*(r - D)/(sigma*sigma))*normcdf(temp);
   brack2 = exp((r-D)*T)*normcdf(b1);
   price = term1 - term2 + brackCoeff*(-brack + brack2);
end

=========== End Matlab Code ===============
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-2-18 09:03:54
1# hantb4510
Option pricing with excel
A nice paper on step-by-step option pricing with excel, VBA codes are included in the paper as well. The authors first briefly review the principles of pricing by no arbitrage in a binomial tree, and show how this can be implemented in Excel; then move to continuous-time model - Black scholes pricing model; after a short discussion on the parameter estimation issues, they turn to two numerical methods for pricing, which are Monte Carlo simulation and Finite difference for Partial differential equation (PDE); at last, option hedging is introduced, advantages and disadvantages of spreadsheets in general and Excel in particular are analyzed shortly.
附件列表

REV.excelpaper.pdf

大小:524.61 KB

 马上下载

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-2-18 22:26:00
2# yhongl12
谢谢你的信息,不过我刚刚打开了那个EXCEL的VBA,看不到关于look back option定价的程序
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-2-18 23:03:27
'// Floating strike lookback options
Function FloatingStrikeLookback(CallPutFlag As String, S As Double, SMin As Double, SMax As Double, T As Double, _
            r As Double, b As Double, v As Double) As Double

    Dim a1 As Double, a2 As Double, m As Double
   
    If CallPutFlag = "c" Then
        m = SMin
    ElseIf CallPutFlag = "p" Then
        m = SMax
    End If
   
     a1 = (Log(S / m) + (b + v ^ 2 / 2) * T) / (v * Sqr(T))
     a2 = a1 - v * Sqr(T)

    If CallPutFlag = "c" Then
        FloatingStrikeLookback = S * Exp((b - r) * T) * CND(a1) - m * Exp(-r * T) * CND(a2) + _
        Exp(-r * T) * v ^ 2 / (2 * b) * S * ((S / m) ^ (-2 * b / v ^ 2) * CND(-a1 + 2 * b / v * Sqr(T)) - Exp(b * T) * CND(-a1))
    ElseIf CallPutFlag = "p" Then
        FloatingStrikeLookback = m * Exp(-r * T) * CND(-a2) - S * Exp((b - r) * T) * CND(-a1) + _
        Exp(-r * T) * v ^ 2 / (2 * b) * S * (-(S / m) ^ (-2 * b / v ^ 2) * CND(a1 - 2 * b / v * Sqr(T)) + Exp(b * T) * CND(a1))
    End If
End Function


'// Fixed strike lookback options
Public Function FixedStrikeLookback(CallPutFlag As String, S As Double, SMin As Double, SMax As Double, X As Double, _
                 T As Double, r As Double, b As Double, v As Double) As Double
   
    Dim d1 As Double, d2 As Double
    Dim e1 As Double, e2 As Double, m As Double
   
    If CallPutFlag = "c" Then
        m = SMax
    ElseIf CallPutFlag = "p" Then
        m = SMin
    End If
   
    d1 = (Log(S / X) + (b + v ^ 2 / 2) * T) / (v * Sqr(T))
    d2 = d1 - v * Sqr(T)
    e1 = (Log(S / m) + (b + v ^ 2 / 2) * T) / (v * Sqr(T))
    e2 = e1 - v * Sqr(T)
   
    If CallPutFlag = "c" And X > m Then
        FixedStrikeLookback = S * Exp((b - r) * T) * CND(d1) - X * Exp(-r * T) * CND(d2) _
        + S * Exp(-r * T) * v ^ 2 / (2 * b) * (-(S / X) ^ (-2 * b / v ^ 2) * CND(d1 - 2 * b / v * Sqr(T)) + Exp(b * T) * CND(d1))
    ElseIf CallPutFlag = "c" And X <= m Then
        FixedStrikeLookback = Exp(-r * T) * (m - X) + S * Exp((b - r) * T) * CND(e1) - Exp(-r * T) * m * CND(e2) _
        + S * Exp(-r * T) * v ^ 2 / (2 * b) * (-(S / m) ^ (-2 * b / v ^ 2) * CND(e1 - 2 * b / v * Sqr(T)) + Exp(b * T) * CND(e1))
    ElseIf CallPutFlag = "p" And X < m Then
        FixedStrikeLookback = -S * Exp((b - r) * T) * CND(-d1) + X * Exp(-r * T) * CND(-d1 + v * Sqr(T)) _
        + S * Exp(-r * T) * v ^ 2 / (2 * b) * ((S / X) ^ (-2 * b / v ^ 2) * CND(-d1 + 2 * b / v * Sqr(T)) - Exp(b * T) * CND(-d1))
    ElseIf CallPutFlag = "p" And X >= m Then
        FixedStrikeLookback = Exp(-r * T) * (X - m) - S * Exp((b - r) * T) * CND(-e1) + Exp(-r * T) * m * CND(-e1 + v * Sqr(T)) _
        + Exp(-r * T) * v ^ 2 / (2 * b) * S * ((S / m) ^ (-2 * b / v ^ 2) * CND(-e1 + 2 * b / v * Sqr(T)) - Exp(b * T) * CND(-e1))
    End If
End Function


'// Partial-time floating strike lookback options
Public Function PartialFloatLB(CallPutFlag As String, S As Double, SMin As Double, SMax As Double, t1 As Double, _
                T2 As Double, r As Double, b As Double, v As Double, lambda As Double)
   
    Dim d1 As Double, d2 As Double
    Dim e1 As Double, e2 As Double
    Dim f1 As Double, f2 As Double
    Dim g1 As Double, g2 As Double, m As Double
    Dim part1 As Double, part2 As Double, part3 As Double
   
    If CallPutFlag = "c" Then
        m = SMin
    ElseIf CallPutFlag = "p" Then
        m = SMax
    End If
   
    d1 = (Log(S / m) + (b + v ^ 2 / 2) * T2) / (v * Sqr(T2))
    d2 = d1 - v * Sqr(T2)
    e1 = (b + v ^ 2 / 2) * (T2 - t1) / (v * Sqr(T2 - t1))
    e2 = e1 - v * Sqr(T2 - t1)
    f1 = (Log(S / m) + (b + v ^ 2 / 2) * t1) / (v * Sqr(t1))
    f2 = f1 - v * Sqr(t1)
    g1 = Log(lambda) / (v * Sqr(T2))
    g2 = Log(lambda) / (v * Sqr(T2 - t1))

    If CallPutFlag = "c" Then
        part1 = S * Exp((b - r) * T2) * CND(d1 - g1) - lambda * m * Exp(-r * T2) * CND(d2 - g1)
        part2 = Exp(-r * T2) * v ^ 2 / (2 * b) * lambda * S * ((S / m) ^ (-2 * b / v ^ 2) * CBND(-f1 + 2 * b * Sqr(t1) / v, -d1 + 2 * b * Sqr(T2) / v - g1, Sqr(t1 / T2)) _
        - Exp(b * T2) * lambda ^ (2 * b / v ^ 2) * CBND(-d1 - g1, e1 + g2, -Sqr(1 - t1 / T2))) _
        + S * Exp((b - r) * T2) * CBND(-d1 + g1, e1 - g2, -Sqr(1 - t1 / T2))
        part3 = Exp(-r * T2) * lambda * m * CBND(-f2, d2 - g1, -Sqr(t1 / T2)) _
        - Exp(-b * (T2 - t1)) * Exp((b - r) * T2) * (1 + v ^ 2 / (2 * b)) * lambda * S * CND(e2 - g2) * CND(-f1)
   
    ElseIf CallPutFlag = "p" Then
        part1 = lambda * m * Exp(-r * T2) * CND(-d2 + g1) - S * Exp((b - r) * T2) * CND(-d1 + g1)
        part2 = -Exp(-r * T2) * v ^ 2 / (2 * b) * lambda * S * ((S / m) ^ (-2 * b / v ^ 2) * CBND(f1 - 2 * b * Sqr(t1) / v, d1 - 2 * b * Sqr(T2) / v + g1, Sqr(t1 / T2)) _
        - Exp(b * T2) * lambda ^ (2 * b / v ^ 2) * CBND(d1 + g1, -e1 - g2, -Sqr(1 - t1 / T2))) _
        - S * Exp((b - r) * T2) * CBND(d1 - g1, -e1 + g2, -Sqr(1 - t1 / T2))
        part3 = -Exp(-r * T2) * lambda * m * CBND(f2, -d2 + g1, -Sqr(t1 / T2)) _
        + Exp(-b * (T2 - t1)) * Exp((b - r) * T2) * (1 + v ^ 2 / (2 * b)) * lambda * S * CND(-e2 + g2) * CND(f1)
  End If
  PartialFloatLB = part1 + part2 + part3
End Function


'// Partial-time fixed strike lookback options
Public Function PartialFixedLB(CallPutFlag As String, S As Double, X As Double, t1 As Double, _
                T2 As Double, r As Double, b As Double, v As Double) As Double

    Dim d1 As Double, d2 As Double
    Dim e1 As Double, e2 As Double
    Dim f1 As Double, f2 As Double

    d1 = (Log(S / X) + (b + v ^ 2 / 2) * T2) / (v * Sqr(T2))
    d2 = d1 - v * Sqr(T2)
    e1 = ((b + v ^ 2 / 2) * (T2 - t1)) / (v * Sqr(T2 - t1))
    e2 = e1 - v * Sqr(T2 - t1)
    f1 = (Log(S / X) + (b + v ^ 2 / 2) * t1) / (v * Sqr(t1))
    f2 = f1 - v * Sqr(t1)
    If CallPutFlag = "c" Then
        PartialFixedLB = S * Exp((b - r) * T2) * CND(d1) - Exp(-r * T2) * X * CND(d2) + S * Exp(-r * T2) * v ^ 2 / (2 * b) * (-(S / X) ^ (-2 * b / v ^ 2) * CBND(d1 - 2 * b * Sqr(T2) / v, -f1 + 2 * b * Sqr(t1) / v, -Sqr(t1 / T2)) + Exp(b * T2) * CBND(e1, d1, Sqr(1 - t1 / T2))) - S * Exp((b - r) * T2) * CBND(-e1, d1, -Sqr(1 - t1 / T2)) - X * Exp(-r * T2) * CBND(f2, -d2, -Sqr(t1 / T2)) + Exp(-b * (T2 - t1)) * (1 - v ^ 2 / (2 * b)) * S * Exp((b - r) * T2) * CND(f1) * CND(-e2)
    ElseIf CallPutFlag = "p" Then
        PartialFixedLB = X * Exp(-r * T2) * CND(-d2) - S * Exp((b - r) * T2) * CND(-d1) + S * Exp(-r * T2) * v ^ 2 / (2 * b) * ((S / X) ^ (-2 * b / v ^ 2) * CBND(-d1 + 2 * b * Sqr(T2) / v, f1 - 2 * b * Sqr(t1) / v, -Sqr(t1 / T2)) - Exp(b * T2) * CBND(-e1, -d1, Sqr(1 - t1 / T2))) + S * Exp((b - r) * T2) * CBND(e1, -d1, -Sqr(1 - t1 / T2)) + X * Exp(-r * T2) * CBND(-f2, d2, -Sqr(t1 / T2)) - Exp(-b * (T2 - t1)) * (1 - v ^ 2 / (2 * b)) * S * Exp((b - r) * T2) * CND(-f1) * CND(e2)
    End If
End Function
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-2-18 23:05:07
4# hantb4510
在模块里找
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群