基于Markovitz统计套利策略
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Markovitz统计套利策略相关的知识,希望对你有一定的参考价值。
这个博库居然不能上图,需要看图的看pdf吧。
|
摘要
Markovitz是基于风险组合的套利策略,其核心是对资产组合进行最优化组合配置。
1Markovitz的原理
马柯维茨(Markovitz)的均值方差投资组合理论第一次用均值、方差等数学理论和工具探讨了以何种投资方式使投资人收益E(Rp)可能最大,其中E(Ri)是投资品Ri, wi 是权重或者说资金使用百分比.
E(Rp) = w1E(R1) + w2(R2) + … + wi(Ri) = ∑wiRi | (1) |
该投资组合收益的方差(推导略):
σ2(Rp) = σ2(∑wiRi) = ∑w2iσ2(Ri) + ∑i≠jwiwjσ(Ri,Rj) | (2) |
为了使Eq.1达到期望收益的同时,冒的风险最小,即:
| (3) |
为了达到风险最小的目的,需要考察投资股票间的相关性:协方差和相关系数
σAB = cov(RA,RB) = E(RA - E(RA))(RB - E(RB)) | (4) |
ρAB =
| (5) |
求解上公式,得到wi的最佳组合。求解这个公式,用计算机吧, matlab和python,R语言为这个公式求解已经做好了。
举例如下:搜索找出两个金融产品其收益与风险如下特征:A:收益率12%,风险(方差)24%;B:收益率6%,风险(方差)24%;相关系数为:-1。构建两组组合方式:
A与B的权重均等都为50%:组合收益率:50%*12%+50%*6%=9%;组合的风险:(50%*24%)^2+ (50%*24%)^2+2*(-1)*50%*50%*24%*24%=0
A与B的权重均等都为30%,70%:组合收益率:30%*12%+70%*6%=7.8%;组合的风险:(30%*24%)^2+ (70%*24%)^2+2*(-1)*30%*70%*24%*24%=0.9%
2算法
算法 1
allstock[][nday] < N 天的股票数据;
数据清洗,清洗掉那些停牌还有新股。 candidate_stock[][nday] < 过滤掉波动率小于一定阈值的股票 . 计算每一个品种的收益 算出股票收益的协方差,和相关系数矩阵。 确定要股票组合的数量 n。以及此组合股票间的相关系数。 代入公式Eq.3 ,使用计算机不同股票组合求解.
3Matlab实现Markovitz策略
下载数据,方法如下:https://wenku.baidu.com/view/b6c22030cd7931b765ce0508763231126edb778d。
clear all;
load ‘D:\workspace\stock\STOCK\2017年10月10日_SHD.mat‘; %%上海 load ‘D:\workspace\stock\STOCK\2017年10月10日_SZD.mat‘; %%深圳 all_var = who; sz999999 = sh999999; %%大盘数据作为标准数据 rou_theshold = -0.5; %% 相关系数阈值 [stockvars , ~] = GetStockVars(who);%%%%%%去除非股票数据 % eval( [‘clear‘ clearvars]); %%%%%%去除非股票数据 nDays = 30; %%%分析多少天数据 nGroup = 8; %%8只股票组合一组 days = GetNdayStock(sz999999,nDays); %%%从大盘数据获得最近 nDays 开盘 日期 varthreshold_low = 0.02; %%选择波动率至少大于2。5%的 varthreshold_up = 1; %%选择波动率至少小于6%的 clearvars = []; stocks = zeros( nDays+1 , length(sz999999(1,:)) , 1); stock_ret_cell = {}; stocknames = []; idx = 1; for k=1:length(stockvars) stock = stockvars(k,:); eval([ ‘validatedays=‘ ‘length(‘ stock ‘);‘]); if validatedays<nDays+1 continue; end eval([‘listdays = ‘ stock ‘(end-nDays:end,1);‘ ]) ; if sum(days-listdays)~=0 %~isequal(days,listdays) %%时间不匹配的股票不要 continue; end eval([‘stockdata = ‘ stock ‘(end-nDays:end,:);‘ ]) ; stocknames = [stocknames ; stock]; stocks(:,:,idx) = stockdata; %%%日期匹配的留下来,放进 stocks idx = idx + 1; end varstr = ‘‘; for k=1:length(all_var) varstr = [varstr all_var{k} ‘ ‘]; end eval([ ‘clear ‘ varstr]); %%清除变量,释放内存 varstr = []; %%%%上面清理完毕数据 %% 计算收益率 TMP = (stocks(2:end,5,:) - stocks(1:end-1,2,:))./stocks(1:end-1,2,:); TMP = reshape(TMP,size(TMP,1),size(TMP,3)); avgvar = sum(abs(TMP))/nDays; %% 只组合那些平均波动率介于 varthreshold_low ~ varthreshold_up 的投资组合 stockvars = stocknames; idx = find(avgvar>varthreshold_low ); TMP = TMP(:,idx); stockvars = stockvars(idx,:); stocks = stocks(:,:,idx); avgvar = avgvar(idx); idx = find(avgvar<varthreshold_up ); TMP = TMP(:,idx); stockvars = stockvars(idx,:); stocks = stocks(:,:,idx); avgvar = avgvar(idx); ExpReturn =zeros(1,size(TMP,2)); for i=1:size(TMP,2) %% 计算投资收益 ExpReturn(1,i)=sum(TMP(:,i))/size(TMP,1); end ExpCovariance = corrcoef(TMP); %% 求协相关矩阵 ExpCovariance = triu(ExpCovariance); %%取上三角 ExpCovariance((ExpCovariance>=rou_theshold))=0; %%% 只取相关系数小于 rou_theshold 的组合 reserverTMP = TMP; u = 1; colname = zeros(1,length(‘A‘:‘Z‘)); temp = ‘A‘:‘Z‘; for n=1:length(‘A‘:‘Z‘) colname(n) = temp(n); end RetRisk = []; for c=nGroup:size(ExpCovariance,2) %%检查每一个v投资 组合。 r = find(ExpCovariance(:,c)<0 ); if size(r,1)<nGroup %% 组合数量小了,就丢掉 continue; end %%%找到一组和,计算这个组合资产的有效前沿Markovitiz配比 r = r‘; rs = [c , r]; for kk=2:size(rs,2)-nGroup sidx = [ c , r(kk:kk+nGroup-2)]; TMP = reserverTMP(:,sidx); names = stockvars(sidx,:); ExpReturn =zeros(1,size(TMP,2)); for i=1:size(TMP,2) ExpReturn(1,i)=sum(TMP(:,i))/size(TMP,1); end ExpCov =cov(TMP); NumPorts = 18; %%绘图精度 %% matlab来算吧, p = Portfolio; p = setAssetMoments(p, ExpReturn, ExpCov); p = setDefaultConstraints(p); %%%算吧。。。 plotFrontier(p, NumPorts); [PortRisk,PortReturn,PortWts]=portopt(ExpReturn,ExpCov,NumPorts); %% 保存下来,后面还要筛选 stock_ret_cell{u}.name = names; %%组合投资品种名称 stock_ret_cell{u}.PortRisk = PortRisk;%%风险 stock_ret_cell{u}.PortReturn = PortReturn; %%收益 stock_ret_cell{u}.PortWts = PortWts; %% 权重 stock_ret_cell{u}.RetRisk = PortReturn(1)/PortRisk(1); %% 收益风险比 RetRisk = [RetRisk stock_ret_cell{u}.RetRisk]; u = u + 1 end end %%存到excel中 [sA index]=sort(RetRisk,‘descend‘); %按收益风险比排序 %只考察前5名的组合 k = length(index); if k>=5 k= 5; end %%存到excel中 for i=1:k u = index(i); names = stock_ret_cell{u}.name; for s=1:nGroup xlswrite(‘stock_ret_cell.xls‘,{names(s,:)} , [‘Sheet‘ num2str(u)],[colname(s+2) ‘1‘]); end xlswrite(‘stock_ret_cell.xls‘,stock_ret_cell{u}.RetRisk , [‘Sheet‘ num2str(u)],[colname(s+4) ‘1‘]); xlswrite(‘stock_ret_cell.xls‘,{‘风险‘} , [‘Sheet‘ num2str(u)], ‘A1‘ ); xlswrite(‘stock_ret_cell.xls‘,{‘回报‘} , [‘Sheet‘ num2str(u)], ‘B1‘ ); xlswrite(‘stock_ret_cell.xls‘,stock_ret_cell{u}.PortRisk , [‘Sheet‘ num2str(u)],‘A2‘); xlswrite(‘stock_ret_cell.xls‘,stock_ret_cell{u}.PortReturn ,[‘Sheet‘ num2str(u)],‘B2‘); xlswrite(‘stock_ret_cell.xls‘,stock_ret_cell{u}.PortWts , [‘Sheet‘ num2str(u)],‘C2‘);
end
计算 9月1日到10月一日
组合1:
后面组合太多了,就不一一贴图。
本文出自 “坐坐吧” 博客,请务必保留此出处http://lwglucky.blog.51cto.com/1228348/1972291
以上是关于基于Markovitz统计套利策略的主要内容,如果未能解决你的问题,请参考以下文章