[关闭]
@shuangtoa 2015-02-17T05:56:45.000000Z 字数 2968 阅读 482

结构化金融大作业已经完成的部分


Rawdata构建

变量名称 变量意义
HSclose HS300指数的每分钟收盘价
HSopen HS300指数的每分钟开盘价
option_close 股指期货的每分钟收盘价
option_open 股指期货的每分钟开盘价
Clsprc_d 股指期货每日收盘价
Indexpic_d HS300指数每日收盘价

数据来源与组成:
分钟数据是2010年4月17日9:30~2011年1月1日14:59,取指数和期货共同交易的时间;
日数据是从2010年4月16日~2014年6月18日;
分钟数据来源:淘宝 日数据来源:resset数据库
**这里需要强调的是,其实使用2010年的数据来进行回测是非常不准确的,2010年事股指期货刚刚推出的一年,价格波动非常大,基差率波动是2014年的4倍以上,故导致本文的验证结果看上去并不显著。但是由于淘宝上2010年以后的一年分钟数据太昂贵,已经买了最便宜的2010年数据之后我们才发现数据并不十分合适,就没有再买2014年一年的数据了。

用delta复制看涨期权

  1. load('rawdata.mat');
  2. T=120; %设立三种投资期限,60个交易日,120个交易日,252个交易日
  3. w=0.05;
  4. L=length(option_close);
  5. I=HS300close; %使用指数收盘价作为I
  6. F=option_close; %使用期货收盘价作为F
  7. swap=24; %每24分钟换仓一次
  8. day=L/240;
  9. sigma=0.2;
  10. position=zeros(1,floor(240/swap));
  11. hold=zeros(1,day);
  12. cash=zeros(1,day);
  13. earn60=zeros(1,day);
  14. HSplot=zeros(1,day);
  15. cost_per=option_open(1);
  16. hold(1)=cost_per*position(1);
  17. cash(1)=-hold(1);
  18. for j=1:day-T+1
  19. K=F(240*(j-1)+1)*(1-w*T/365); %每一天的开盘价计算60天期限的期权行权价
  20. for d=1:T
  21. flag=swap-1;
  22. for m=1:240
  23. flag=flag+1;
  24. i=(j-1)*240+(d-1)*240+m;
  25. n=(d-1)*240+m;
  26. if flag==swap %到换仓时间
  27. position(n)=normcdf((log(I(i)/K)+0.5*sigma^2*(T-d))/(sigma*sqrt(T-d)));%计算应当持仓的数量
  28. flag=0;
  29. else
  30. position(n)=position(n-1);
  31. end
  32. end
  33. end
  34. for k=2:n %计算一天,一定期限下一只期权的收益,用于画图检验看涨期权复制
  35. i=(j-1)*240+k;
  36. if position(k)<position(k-1)
  37. deta=position(k-1)-position(k);
  38. hold(j)=hold(j)-1*deta*cost_per;%换仓若是卖,持仓金额的变化
  39. cash(j)=cash(j)+deta*(F(i)-cost_per);%现金金额的变化
  40. cost_per=hold(j)/position(k);%持仓单位成本的变化
  41. end
  42. if position(k)>position(k-1)
  43. deta=position(k)-position(k-1);
  44. hold(j)=hold(j)+deta*F(i);
  45. cash(j)=cash(j)-deta*F(i);
  46. cost_per=hold(j)/position(k);
  47. end
  48. end
  49. earn60(j)=(Fi)*positionk)+cash(j));
  50. HSplot(j)=(HS300close((j-1+T)*240)-HS300open((j-1)*240+1))/HS300open((j-1)*240+1);%指数每日收益
  51. end
  52. ttest_res=ttest(hold-HSplot);
  53. for j=2:day-T+1
  54. earnplot(j)=earn60(j)/earn60(j-1);
  55. end
  56. plot(HSplot(2:day-T+1),winsorize(earnplot(2:day-T+1)),'or');
  57. xlabel('指数收益');
  58. ylabel('产品净值');
  59. title('delta复制期权效果');

复制结果:
delta复制期权效果

基差确定

以上假设的是基差为w=5%(只是现期近似为5%,2010年的波动是较大的),实际上,期货和指数的基差只是可以近似为常数的:
期货价格和指数
而使用2010~2014年的期货和指数的数据进行验证计算60天基差率w

w=(rindrfut)×365.5Cal[60t,t]

  1. load('rawdata.mat');
  2. L=length(TRDDT);
  3. w=zeros(L,1);
  4. %展期
  5. Clsprc_d_fill=fillNAN(Clsprc_d);
  6. Indexpic_d_fill=fillNAN(Indexpic_d);
  7. for i=61:L
  8. if isnan(Indexpic_d(i))
  9. continue;
  10. end
  11. cal=0;
  12. for t=i-59:i
  13. if ~isnan(Indexpic_d(t))
  14. cal=cal+1;
  15. end
  16. end
  17. Rind=(Indexpic_d_fill(i)-Indexpic_d_fill(i-59))/Indexpic_d_fill(i-59);
  18. Rfut=(Clsprc_d_fill(i)-Clsprc_d_fill(i-59))/Clsprc_d_fill(i-59);
  19. w(i)=(Rind-Rfut)*365.25/cal;
  20. end
  21. hold on
  22. plot(TRDDT,Clsprc_d_fill);
  23. plot(TRDDT,Indexpic_d_fill);
  24. legend('期货价格','指数');

得到基差率w:
基差率w

avg(w)=0.0111

avg(abs(w))=0.0431

动态的基差率

所以,接下来我们采用动态的基差率代入策略,即使用前一天的60天年化基差率代入策略计算,(Naive策略)

  1. for j=1:day-59
  2. if j==1
  3. K=F(240*(j-1)+1)*(1-w(j)*T/365);
  4. else
  5. K=F(240*(j-1)+1)*(1-w(j-1)*T/365);
  6. %每一天的开盘价计算60天期限的期权行权价,用前一天的60天基差率作为当日的基差率
  7. end
  8. for d=1:T
  9. flag=swap-1;
  10. for m=1:240
  11. flag=flag+1;
  12. i=(j-1)*240+(d-1)*240+m;
  13. n=(d-1)*240+m;
  14. if flag==swap
  15. position(n)=normcdf((log(I(i))/log(K)+0.5*sigma^2*(T-d))/(sigma*sqrt(T-d)));
  16. flag=0;
  17. else
  18. position(n)=position(n-1);
  19. end
  20. end
  21. end

动态和常数基差率

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注