S_simu = Sexp((r-0.5*sigma^2)t + sigmaW这个公式和BlackScholes公式有什么关联吗
时间: 2023-06-27 10:05:01 浏览: 139
这个公式和Black-Scholes公式是有关联的。实际上,Black-Scholes模型假设股票价格遵循几何布朗运动,即:
dS = rSdt + σSdW
其中,S是股票价格,r是无风险利率,σ是波动率,t是时间,W是布朗运动。
通过解这个随机微分方程,可以得到Black-Scholes公式:
C = S*N(d1) - X*exp(-rT)*N(d2)
其中,C是欧式看涨期权的价格,S是股票价格,X是期权行权价格,r是无风险利率,T是期权到期时间,N是标准正态分布的累积分布函数,d1和d2是由下面的公式计算得到的:
d1 = (ln(S/X) + (r+0.5*σ^2)*T) / (σ*sqrt(T))
d2 = d1 - σ*sqrt(T)
而S_simu = Sexp((r-0.5*sigma^2)t + sigmaW也可以看作是股票价格的随机演化过程。这个公式中,exp表示指数函数,W是布朗运动,r是无风险利率,σ是波动率,t是时间。如果我们对这个公式进行离散化处理,就可以用蒙特卡罗模拟方法来模拟股票价格的随机演化过程。因此,S_simu = Sexp((r-0.5*sigma^2)t + sigmaW和Black-Scholes公式都是描述股票价格随机演化过程的公式,只是表达方式不同而已。
相关问题
W = [0, cumsum(sqrt(dt)*randn(1,N))]; % 随机游走 S_simu = S*exp((r-0.5*sigma^2)*t + sigma*W); % 股价模拟数据 这段代码中随机游走的作用是什么
这段代码实现了股价的几何布朗运动模型。其中,随机游走部分是通过生成符合正态分布的随机数来模拟股价的波动情况。具体地,第一行代码中,dt是时间间隔,randn(1,N)生成了一个1行N列的标准正态分布随机数向量,cumsum函数对这个向量进行累加,得到一个1行N列的累加随机游走向量W。第二行代码中,根据股票的几何布朗运动模型,利用股票当前价格S、无风险利率r、波动率sigma、时间t和随机游走向量W,计算出了未来一段时间内股票的价格模拟数据S_simu。
SNRindB1=0:2:15; SNRindB2=0:0.1:15; for i=1:length(SNRindB1) simu_err_prb(i)=snr2pb(SNRindB1(i)); end for i=1:length(SNRindB2) SNR=exp(SNRindB2(i)*log(10)/10); theo_err_prb(i)=(1/2)*exp(-SNR/2); end semilogy(SNRindB1,simu_err_prb,'*'); hold semilogy(SNRindB2,theo_err_prb) ylabel('误码率') xlabel('Eb/N0(dB)') legend('仿真比特误码率''理论比特误码率') function [p]= snr2pb (snr_in_dB) N=10000; Eb=1; snr=10^(snr_in_dB/10); sgma=sqrt(Eb/(2*snr)); phi=0; for i=1:N temp=rand; if (temp<0.5) dsource(i)=0; else dsource(i)=1; end end numoferr=0; for i=1:N if (dsource(i)==0) r0c=sqrt(Eb)*cos(phi)+bmgauss(sgma); r1c=bmgauss(sgma); r0s=sqrt(Eb)*sin(phi)+bmgauss(sgma); r1s=bmgauss(sgma); else r1c=sqrt(Eb)*cos(phi)+bmgauss(sgma); r0c=bmgauss(sgma); r1s=sqrt(Eb)*sin(phi)+bmgauss(sgma); r0s=bmgauss(sgma); end r0=r0c^2+r0s^2; r1=r1c^2+r1s^2; if (r0>r1) decis=0; else decis=1; end if (decis~=dsource(i)) numoferr=numoferr+1; end end p=numoferr/N; end的错误
这段代码存在一些错误,我来帮你指出:
1. 第9行的 `hold` 命令缺少参数,应该是 `hold on`。
2. 第12行的 `legend` 函数缺少参数,应该是 `legend('仿真比特误码率','理论比特误码率')`。
3. 第15行的 `function` 命令后面没有指定函数名,应该是 `function [p]= snr2pb (snr_in_dB)`。
4. 第20行的 `sgma` 应该是 `sigma`,即标准差。
5. 第27行的 `bmgauss` 函数不存在,应该是 `randn` 函数。同时,在计算误码率时,应该使用比特误码率而不是符号误码率,因此在计算 `r0` 和 `r1` 时要除以 2。
修正后的代码如下:
```matlab
SNRindB1=0:2:15;
SNRindB2=0:0.1:15;
for i=1:length(SNRindB1)
simu_err_prb(i)=snr2pb(SNRindB1(i));
end
for i=1:length(SNRindB2)
SNR=exp(SNRindB2(i)*log(10)/10);
theo_err_prb(i)=(1/2)*exp(-SNR/2);
end
semilogy(SNRindB1,simu_err_prb,'*');
hold on
semilogy(SNRindB2,theo_err_prb)
ylabel('误码率')
xlabel('Eb/N0(dB)')
legend('仿真比特误码率','理论比特误码率')
function [p]= snr2pb (snr_in_dB)
N=10000;
Eb=1;
snr=10^(snr_in_dB/10);
sigma=sqrt(Eb/(2*snr));
phi=0;
for i=1:N
temp=rand;
if (temp<0.5)
dsource(i)=0;
else
dsource(i)=1;
end
end
numoferr=0;
for i=1:N
if (dsource(i)==0)
r0c=sqrt(Eb)*cos(phi)+sigma*randn;
r1c=sigma*randn;
r0s=sqrt(Eb)*sin(phi)+sigma*randn;
r1s=sigma*randn;
else
r1c=sqrt(Eb)*cos(phi)+sigma*randn;
r0c=sigma*randn;
r1s=sqrt(Eb)*sin(phi)+sigma*randn;
r0s=sigma*randn;
end
r0=(r0c^2+r0s^2)/2;
r1=(r1c^2+r1s^2)/2;
if (r0>r1)
decis=0;
else
decis=1;
end
if (decis~=dsource(i))
numoferr=numoferr+1;
end
end
p=numoferr/N;
end
```
阅读全文