基於Markovitz統計套利策略
這個博庫居然不能上圖,需要看圖的看pdf吧。
|
摘要
Markovitz是基於風險組合的套利策略,其核心是對資產組合進行最優化組合配置。
1Markovitz的原理
馬柯維茨(Markovitz)的均值方差投資組合理論第一次用均值、方差等數學理論和工具探討了以何種投資方式使投資人收益E(Rp)可能最大,其中E(Ri)是投資品Ri, wi 是權重或者說資金使用百分比.
E(Rp) = w1E(R1) + w2(R2) + … + wi(Ri) = ∑wiRi | (1) |
該投資組合收益的方差(推導略):
σ2 | (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%
圖 1. 有效前沿 |
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統計套利策略