楼主: 01261416
3815 4

[资产定价] 给指导一下,期权动态复制的程序哪里有错误? [推广有奖]

  • 4关注
  • 4粉丝

教授

43%

还不是VIP/贵宾

-

威望
0
论坛币
2858 个
通用积分
8.8431
学术水平
36 点
热心指数
48 点
信用等级
23 点
经验
16279 点
帖子
538
精华
0
在线时间
2010 小时
注册时间
2008-5-13
最后登录
2024-8-8

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我要复制一个铜的看跌期权,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;



二维码

扫码加我 拉你入群

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

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

关键词:哪里有 denden zeros Delta Sigma 程序 动态

回帖推荐

Chemist_MZ 发表于4楼  查看完整内容

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(:, ...

本帖被以下文库推荐

沙发
chen_nezo 发表于 2015-2-4 15:56:32 |只看作者 |坛友微信交流群
  1. s0 = 41350;
  2. npath = 10000;
  3. nstep = 252;
  4. sigma = 0.2;
  5. r = 0.05;
  6. sk = 35000;
  7. f = 0.0001;
  8. t = 1;
  9. rx = randn(npath,nstep);
  10. deltat = t/nstep;
  11. s = [s0*ones(npath,1) zeros(npath,nstep-1)];
  12. for i=1:nstep-1
  13.     s(:,i+1) = s(:,i) + s(:,i)*r*deltat+sigma*deltat^0.5*(s(:,i).*rx(:,i));
  14. end

  15. for m = 1:nstep
  16.     [cdelt(:,m),pdelt(:,m)]=blsdelta(s(:,m),sk,r,1-(m-1)*deltat,sigma,0);
  17. end;

  18. % 总吨数以及合约乘数
  19. TonNumber = 6000;
  20. LotSize = 5;

  21. % Pos : 每个时点应该持有的手数
  22. Pos = round(TonNumber / LotSize * pdelt);
  23. % PosChange : 每个点应该交易的手数
  24. PosChange = [Pos(:,1), diff(Pos,1,2)];

  25. % HedgeProfit : 每个时点的对冲盈亏 = 上一个时点持有的手数 * 价格变化 * 合约乘数
  26. HedgeProfit = zeros(size(s));
  27. HedgeProfit(:,2:end) = Pos(:,1:end-1) .* diff(s,1,2) * LotSize;

  28. % CommissionFee : 交易费用 = 价格 * 交易手数 * 手续费比例 * 合约乘数
  29. CommissionFee = abs(s) .* abs(PosChange) .* f .* LotSize;

  30. % ProfitPerTon : 最后总盈亏 = (对冲盈亏 - 手续费)/总吨数
  31. ProfitPerTon = (sum(HedgeProfit,2) - sum(CommissionFee,2))/TonNumber;

  32. % ProfitTheory :每吨理论盈亏 = 到期日期权内含价值 - 权利金
  33. [CP,PP] = blsprice(s0,sk,r,t,sigma,r);
  34. ProfitTheory = max(0,sk - s(:,end)) - PP;

  35. %%%%%%%%%% 结果检验
  36. % 实际对冲结果和理论结果的差别
  37. D = ProfitPerTon - ProfitTheory;
  38. [min(D), prctile(D,10), mean(D), prctile(D,90), max(D)]

  39. % 画图检验
  40. SMin = min(s(:,end));
  41. SMax = max(s(:,end));
  42. plot([SMin:10:SMax], max(0,sk-[SMin:10:SMax])-PP);
  43. hold on;
  44. scatter(s(:,end),ProfitPerTon,'r');
  45. hold off;
复制代码
楼主代码可读性有点问题啊,
后面对冲的部分用几句代码重写验证了下,
这个简略模型无非就是计算每步对冲盈亏和手续费,
结果和理论价格相差不大,不存在楼主说的问题,应该是代码哪里错了,建议仔细检查。

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

模拟对冲效果图:
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Chemist_MZ + 50 + 50 + 1 + 1 + 1 热心帮助其他会员

总评分: 经验 + 50  论坛币 + 50  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

藤椅
Chemist_MZ 在职认证  发表于 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.
已有 1 人评分经验 论坛币 收起 理由
见路不走 + 5 + 5 精彩帖子

总评分: 经验 + 5  论坛币 + 5   查看全部评分

使用道具

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

使用道具

报纸
chen_nezo 发表于 2015-7-20 14:16:37 |只看作者 |坛友微信交流群
easibay 发表于 2015-7-2 14:25
17行blsdelta 和40行blsprice函数,最后一个参数,为什么blsdelta取 0,blsprice取r ?
是我的疏忽,应都是r,感谢指正。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-11-5 07:59