全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 金融工程(数量金融)与金融衍生品
3959 4
2015-02-02
我要复制一个铜的看跌期权,s=41350,执行价格35000,波动率假设0.2,利率0.05,时间1年。卖出6000吨的铜,对应1200手期货。我写了个复制的程序,不知道哪里错了,复制的成本只有BS公式计算的一般左右,希望有高人指点一下。

s0=41350;

npath=10000;

nstep=252;

sigma=0.2;

r=0.05;

sk=35000;

f=0.0001;

t=1;

rx=randn(npath,nstep);

deltat=t/nstep;

s=[s0*ones(npath,1) zeros(npath,nstep-1)];

for i=1:nstep-1

s(:,i+1)=s(:,i)+s(:,i)*r*deltat+sigma*deltat^0.5*(s(:,i).*rx(:,i));

end;

for m=1:nstep

[cdelt(:,m),pdelt(:,m)]=blsdelta(s(:,m),sk,r,1-(m-1)*deltat,sigma,0);

end;

% 产生现货持仓头寸

tc=ones(npath,nstep);

tcc(:,k)=1200*tc(:,k);

%每天需对冲头寸

dc=round(tcc.*pdelt);

%期货合约的价值

hyjz=(dc.*s*5);

bzj= hyjz*0.05*-1;

bzjMax = max(bzj')';

%头寸变化

dcb=[0*ones(npath,1) zeros(npath,nstep-1)];

for i=1:nstep-1

dcb(:,i+1)=(dc(:,i+1)-dc(:,i));

end

%手续费

zx=zeros(npath,nstep);

for m=1:nstep

zx(:,m)=exp(-r*(m-1)*deltat);

end

sxf=[abs(hyjz(:,1))*fzeros(npath,nstep-1)];

for i=1:nstep-1

sxf(:,i+1)=abs(dcb(:,i+1)).*s(:,i+1)*5*f.*zx(:,i+1);

end

zsxf=[sxf(:,1), zeros(npath,nstep-1)];

for i=1:nstep-1

zsxf(:,i+1)=zsxf(:,i)+sxf(:,i+1);

end

%平仓盈亏

pc=zeros(npath,nstep);

for i=1:npath

for j=1:nstep

if (dcb(i,j)>0 )

pc(i,j)=dcb(i,j)*(-1);

else

pc(i,j)=0;

end

end

end

%平仓盈亏的价格变化

jgbh=zeros(npath,nstep);

for i=1:nstep-1

jgbh(:,i+1)=s(:,i+1)-s(:,i);

end

pcyk=pc.*jgbh.*zx*5;

zpcyk=[pcyk(:,1), zeros(npath,nstep-1)];

for i=1:nstep-1

zpcyk(:,i+1)=zpcyk(:,i)+pcyk(:,i+1);

end

%持仓收益

cc=zeros(npath,nstep);

for m=1:npath

for j=1:nstep

if (dcb(m,j)<0 )

cc(m,j)=dc(m,j)-dcb(m,j);

else

cc(m,j)=dc(m,j);

end

end

end

ccyk=cc.*jgbh.*zx*5;

>> zccyk=[ccyk(:,1), zeros(npath,nstep-1)];

for i=1:nstep-1

zccyk(:,i+1)=zccyk(:,i)+ccyk(:,i+1);

end

%所有盈亏

zyk1=zeros(npath,5);

zyk1(:,1)=zsxf(:,nstep)*-1;

zyk1(:,2)=zpcyk(:,nstep);

zyk1(:,3)=zccyk(:,nstep);

zyk1(:,4)=zyk1(:,1)+zyk1(:,2)+zyk1(:,3);

zyk1(:,5)= bzjMax;

%期权复制平均成本

fzcb=mean(zyk1(:,4));

sig=std(zyk1(:,4))/npath^0.5;



二维码

扫码加我 拉你入群

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

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

全部回复
2015-2-4 15:56:32
复制代码
楼主代码可读性有点问题啊,
后面对冲的部分用几句代码重写验证了下,
这个简略模型无非就是计算每步对冲盈亏和手续费,
结果和理论价格相差不大,不存在楼主说的问题,应该是代码哪里错了,建议仔细检查。

如果还需要更进一步,应该再算上资金成本,还有冲击成本(滑点、买卖价差的差别等统归于此)。

模拟对冲效果图:
二维码

扫码加我 拉你入群

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

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

2015-2-7 02:40:52
ok, from chen_nezo's code I know what you are going to do. Just ignore my previous comment (I don't know what you want to do at that time).

The first problem I detect is on these line:
%平仓盈亏
pc=zeros(npath,nstep);
for i=1:npath
for j=1:nstep
if (dcb(i,j)>0 )
pc(i,j)=dcb(i,j)*(-1);
else
pc(i,j)=0;
end
end
end
%平仓盈亏的价格变化
jgbh=zeros(npath,nstep);
for i=1:nstep-1
jgbh(:,i+1)=s(:,i+1)-s(:,i);
end
pcyk=pc.*jgbh.*zx*5;
zpcyk=[pcyk(:,1), zeros(npath,nstep-1)];
for i=1:nstep-1
zpcyk(:,i+1)=zpcyk(:,i)+pcyk(:,i+1);
end

The PnL is not caused by your position adjustment. It is caused by holding the same position and the price change: dc(i,j)(s(i,j+1)-s(i,j)). not dcb(i,j)*(s(i,j+1)-s(i,j))

Your code is messed up. It is too hard to read. Sorry. You can refer to chen_nezo's code.
二维码

扫码加我 拉你入群

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

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

2015-7-2 14:25:20
chen_nezo 发表于 2015-2-4 15:56
楼主代码可读性有点问题啊,
后面对冲的部分用几句代码重写验证了下,
这个简略模型无非就是计算每步对冲 ...
17行blsdelta 和40行blsprice函数,最后一个参数,为什么blsdelta取 0,blsprice取r ?
二维码

扫码加我 拉你入群

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

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

2015-7-20 14:16:37
easibay 发表于 2015-7-2 14:25
17行blsdelta 和40行blsprice函数,最后一个参数,为什么blsdelta取 0,blsprice取r ?
是我的疏忽,应都是r,感谢指正。
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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