熱線電話:13121318867

登錄
首頁精彩閱讀因子模型舉例:主成分分析
因子模型舉例:主成分分析
2018-08-26
收藏

因子模型舉例:主成分分析

我之前提到的因子風險主要包括經濟的(知利率)、基本面的(如賬面市值比率)和技術的(如前期收益率)。獲得一個包含大童股票的投資組合因子風險的歷史數據,并用于對因子模型進行回測,對于獨立交易員來說是非常昂貴且不切實際的。不過,有一種因子模型,其構建只依核于歷史收益率。這個方法叫做主成分分析(PCA)。

用主成分分析構建因子風險和因子收益率,必須假設因子風險在估計的時間段內是不變的(時間獨立)。(這排除了表示均值回歸或慣性的因子,因為這些因子風險都與前期收益率有關)。更重要的是,如果假設因子收益率之間“不相關”,協方差矩陣bbT就是對角矩陣。如果用協方差矩陣RRT的特征向量作為APT方程R=Xb+u中矩陣X的列向量,可知bbT的確是對角矩陣,并且矩陣RRT的特征值正好擾是因子收益率b的方差。但是,如果因子數量與股票數量相等,我們就不需要使用因子分析了,因為只要選取幾個具有較大特征位的特征向黃就能構成矩陣X。特征向量的個數是一個需要優化的交易模型參數。


下面的MATLAB程序展示了一個對S&P60。小盤股使用主成分分析的可能交易策略。這一策略僅設因于收益率具有慣性,即從本期到下期。因于收益率的值保持不變。因此,可以買入基于這些因子的期望收益率最高的股票,賣出期望收益率最低的股票。如果發現這一策略的平均收益率為負,表明對收益率具有慣性的假設是不合適的,或者策略的特有收益率太大了以至于策略失效。

clear;

%使用回望交易日作為佑計區間(訓練集),以此來決定因子風險

%回望期交易日為252天,因子5個

%交易策略為:購買下一個交易日期望收益率最高的50只股票topN = 50;

%選用SP600小盤股做測試(此MATLAB二進制輯入丈件包含交易日,股票,開盤價,最高價,最低價,收盤價)

load('IJR 20080114');

mycls=fillMissingData(cl);

positionsTable=zeros (size(cl));

寫dailyret的行是在不同時間段上的觀察值

dailyret=(mycls一lagl(mycls))/lagl(mycls);


for t=lookback+1:length(tday)

% R的列是不同的觀刻對象

R=dailyret(t-lookback+一:t.:)’;

%不考慮所有收益率缺失的股票

hasData=find(all(isfinite(R),2));

R=R(hasData,:);

avgR=smartmean(R,2);

%移去均值

R=R-repmat(avgR,[1 size(R,2)]);

%計算不同股票收益率的協方差拒陣

covR= smartcov(R');

% X是因子風險矩陣,B是因子收益率的方差

%用covR的特征值作為X的列向量

[X,B]=eig(covR);

%保留的因子數為numFactors

X(:,1:size(X,2)-numFactors) =[];

% b是從時間t-1到t的因子收益率

results=ols(R(:,end),X);b= results.beta;

% Rexp是假設因子收益率保持常數時。下一個時間段的期望收益率

Rexp=avgR+X*b;

[foo idxSort]=sort(Rexp,'ascend');

%做空期望收益率最低的50只股票

positionsTable(t,hasData(idxSort(1:topN)))=-1;

%做多期望收益率最高的50只股票

positionsTable(t,. ..

hasData(idxSort(end-opN+1:end)))=1;

end

%計算交易策略的每日收益率

ret=...

smartsum(backshift(1,positionsTable).*dailyret,2);

%計算交易策略的年化收益率

avgret=smartmean(ret)*252%收益率很低

%avgret=

%

%-1.8099

程序中使用了smartcov函數來計算多只股票日收益平向量的協方差矩陣。與MATLAB內置的cov函數不同,smartcov函數忽略了收益率缺失的交易日(包括NaN值)。

function y=smartcov(x)

% n個有限元素的協方差

% 行為觀測值,列為變量

% 用N標準化,而非N-1

y= NaN (size(x,2) , size(x, 2 ));

xc= NaN(size(x));

goodstk=find(~all(isnan(x),1));

xc(:,goodstk)=...

x(:,goodstk)-repmat(smartmean(x(:,goodstk),1),...

[size(x,1)1];%移去均值

for m=1:length(goodstk)

for n=m:length(goodstk)

y(goodstk(m),goodstk(n))=...

smartmean(xc(:,goodstk(m)).

*..xc(:,goodstk(n)));

     y(goodstk(n),goodstk(m))=y(goodstk(m) ,goodstk(n));

end

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢