2013-10-12 85 views
0

我一直在研究並嘗試了很多不同的東西,並且在嘗試使此函數爲程序的X,td,D0獲取向量輸入方面一直未能成功。最終我想知道當罷工,除息和派息金額各不相同時,期權的價值如何變化,而不是同一時間,而是一次一個。這是對於離散股利我不考慮收益率。這是我的第一個真正的程序,並且一直只使用r作爲計算器,所以我不僅僅是在耳朵後面溼透,而是從頭到腳滴水。我真的很感激任何幫助。向量輸入輸出r

DivADJBSM<-function(S, X, rf, T,td, sigma,D0) { 
values <- matrix(,3,2) 
Dd<-(D0*exp(-rf*T)) #discounted dividend# 
Sd<-(S-Dd)  #Stock adjusted for present value of dividends# 
Xd1=(X-D0)  #Strike adjusted after dividend paid# 
K=td/T  #dividend payment to terminal date impact# 
SigA=(sigma*S)/(Sd)  #adjusted volatility full# 
    WSig=(sigma*S)/(S-(Dd*K)) #volatility adjustment impact of payment date# 

    d1 <- (log(Sd/Xd1)+(rf*T))/(SigA*sqrt(T)) +((SigA*sqrt(T))/2) 
    d2 <- d1 - (SigA * sqrt(T)) 
    d3 <- (log(Sd/Xd1)+(rf*T))/(WSig*sqrt(T)) +((WSig*sqrt(T))/2) 
    d4 <- d3 - (WSig * sqrt(T)) 
    d5 <- (log(S/X)+(rf*T))/(sigma*sqrt(T)) +((sigma*sqrt(T))/2) 
    d6 <- d5 - (sigma * sqrt(T)) 

    values[1] <- (Sd)*pnorm(d1) - (Xd1)*exp(-rf*T)*pnorm(d2) 
    values[4] <- (Xd1)*exp(-rf*T)*pnorm(-d2)-(Sd)*pnorm(-d1) 
    values[2] <- (Sd)*pnorm(d3) - (Xd1)*exp(-rf*T)*pnorm(d4) 
    values[5] <- (Xd1)*exp(-rf*T)*pnorm(-d4)-(Sd)*pnorm(-d3) 
    values[3] <- (S)*pnorm(d5) - (X)*exp(-rf*T)*pnorm(d6) 
    values[6] <- (X)*exp(-rf*T)*pnorm(-d6)-(S)*pnorm(-d5)   

print("Calls COL=1, Puts COL=2, Full Vol ADJ ROW=1, Weighted Vol ROW=2, Std BSM ROW=3") 
    values 
} 
+0

請使用'dput'發佈樣本數據,以便可以測試代碼 – Metrics

+1

我懷疑這個問題與向量化*輸入*沒有太大關係,與矢量化*輸出*一樣。你的'[j]'值不能對每個元素取多個項目。你可以使'values'成爲一個列表變量,但是所有的mrip解決方案都比較容易。 –

回答

1

你可以用lapply完成你想要的。這裏有一個簡單的例子:

> fun<-function(x) x^2 
> lapply(1:3,fun) 
[[1]] 
[1] 1 

[[2]] 
[1] 4 

[[3]] 
[1] 9 

如果你有多個參數,則默認情況下它遍歷第一個參數,但你可以通過在lapply結束命名的剩餘參數指定哪些人會遍歷撥打:

> fun<-function(x,y,z) c(x,y^2,z^3) 
> lapply(1:3,fun,2,3) 
[[1]] 
[1] 1 4 27 

[[2]] 
[1] 2 4 27 

[[3]] 
[1] 3 4 27 

> lapply(1:3,fun,x=2,z=3) 
[[1]] 
[1] 2 1 27 

[[2]] 
[1] 2 4 27 

[[3]] 
[1] 2 9 27 

> lapply(1:3,fun,x=2,y=3) 
[[1]] 
[1] 2 9 1 

[[2]] 
[1] 2 9 8 

[[3]] 
[1] 2 9 27 

爲了與你的函數中使用此,你將不得不重新命名X說法,因爲X也是一個參數來lapply,這會搞亂了。

+0

感謝它的工作,我只需要改變一些名字。在編寫程序時我應該做些什麼,以便我可以命名向量並將它們作爲輸入? – Mike

+0

那麼,沒有一個具體的事情。在編寫函數時,您必須確保所使用的操作將向量用作輸入。在這種情況下,你還必須決定你想要輸出的樣子,如果有多個向量被傳入,會發生什麼,等等。 – mrip