1. 程式人生 > >基於Markovitz統計套利策略

基於Markovitz統計套利策略

markovitz matlab 統計套利

這個博庫居然不能上圖,需要看圖的看pdf吧。

基於Markovitz統計套利策略


by lwglucky




電子郵件: [email protected]





摘要


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) + ijwiwjσ(Ri,Rj)
(2)


為了使Eq.1達到期望收益的同時,冒的風險最小,即:

min:σ2(Rp) = w2iσ2(Ri) + wiwjσ(Ri,Rj)
s.t. wi = 1
(3)


為了達到風險最小的目的,需要考察投資股票間的相關性:協方差和相關系數

σAB = cov(RA,RB) = E(RA - E(RA))(RB - E(RB))(4)
ρAB =
σAB
σAσB
[ - 1,1]
(5)

求解上公式,得到wi的最佳組合。求解這個公式,用計算機吧, matlab和python,R語言為這個公式求解已經做好了。

舉例如下:搜索找出兩個金融產品其收益與風險如下特征:A:收益率12%,風險(方差)24%;B:收益率6%,風險(方差)24%;相關系數為:-1。構建兩組組合方式:

  1. A與B的權重均等都為50%:組合收益率:50%*12%+50%*6%=9%;組合的風險:(50%*24%)^2+ (50%*24%)^2+2*(-1)*50%*50%*24%*24%=0

  2. 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統計套利策略