#定义变量
#初始股票价格S0 换股价k 期限长度T 债券价格W 无风险利率r 债券利率R 股票波动率sigma 行权期数d
LSM2 <- function(d,S0,K,sigma,r,R,T,RDPrate,redemption,PUTrate,put)
{
#对债券每一期赋值
debt<-vector(mode="numeric",d)
debt[d]<-100
for (k in (d-1):1)
{ debt[k]=(debt[k+1]+exp(R*T/d))*exp(-r*T/d)}
#设置路径,计算期权价格
S<-matrix(,50,1000)
f<-matrix(,50,1000)
p<-matrix(,50,1000)
pv<-matrix(,50,1000)
price<-matrix(,1,1000)
#设置最后一期状态
z<-rnorm(1000,0,1)
S[d,1:1000]=S0*exp((r-sigma^2/2)*k*T/t+sigma*sqrt(k*T/d)*z)
for ( u in 1:1000)
{ if (S[d,u]>=K) {P[d,1:1000]=100/K*S[d,u]} else {P[d,u]=debt[d]} }
#生成标准正态分布随机数1000个,生成股票价格路径
for(k in d-1:1)
{
z<-rnorm(1000,0,1)
S[k,1:1000]=S0*exp((r-sigma^2/2)*k*T/t+sigma*sqrt(k*T/d)*z)
#继续持有的债券在下一期的期望价值
parameter <- lm(S[k+1,] ~ S[k,] + S[k,]^2 + S[k.]^3)$coefficients
estimated<-parameter[1]+parameter[2]*S[k,]+parameter[3]*S[k,]^2+parameter[4]*S[k,]^3
for(u in 1:1000)
{ #处理回售、赎回条件后的下一期期望债券价值f
if (estimated[u]>=RDPrate*K) {f[k+1,u]<-redemption}
else if (estimated[u]>K & estimated[u]<RDPrate*K) {f[k+1,u]<-100/K*estimated[u]}
else if (estimated[u]<K & estimated[u]>PUTrate*K) {f[k+1,u]<-debt[k]}
else {f[k+1,u]<-put}
#比较转股和继续持有得到当期最优价值p
if (S[k,u]>=K) {p[k,u]=max ( 100/K*S[k,u], f[k+1,u]*exp(-r*T/d) )
if (S[k,u]< K) {p[k,u]=max ( debt[k], f[k+1,u]*exp(-r*T/d) ) }
#求得所有路径下各个状态的平均期望现值
pv[k,]<-p[k,]*exp(-r*T/d*k) }
price<-apply(pv,2,max)
EBprice<-mean(price)
error<- 1.96 * sd(price)/sqrt(1000)
data.frame(EBprice, error)}