您的位置: 零点财经>股票知识>量化投资> 因子模型举例:主成分分析

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

2017-11-20 05:56:09  来源:量化投资  本篇文章有字,看完大约需要11分钟的时间

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

时间:2017-11-20 05:56:09  来源:量化投资

学会这个方法,抓10倍大牛股的概率提升10倍>>

我之前提到的因子风险主要包括经济的(知利率)、基本面的(如账面市值比率)和技术的(如前期收益率)。获得一个包含大童股票的投资组合因子风险的历史数据,并用于对因子模型进行回测,对于独立交易员来说是非常昂贵且不切实际的。不过,有一种因子模型,其构建只依核于历史收益率。这个方法叫做主成分分析(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

end


来源:量化投资 编辑:零点财经

阅读了该文章的用户还阅读了

热门关键词

相关阅读

为您推荐

移动平均线
股票知识
MACD
老丁说股
热点题材
KDJ指标
读懂上市公司
成交量
股票技术指标
股票大盘
分时图
股市名家
概念股
缠中说禅
强势股
波段操作
股票盘口
短线炒股
股票趋势
涨停板
股票投资
长线炒股
股票问答
股票术语
财务分析
炒股软件
上证早知道
经济学术语
期货
股票黑马
股票震荡市场
理财
炒股知识
散户炒股
外汇
炒股战术
港股
基金
黄金








































































































































































































































































































































































































































































































































































































































































相关栏目推荐

栏目导航

友情链接

网站首页
股票问答
股票术语
网站地图

copyright 2016-2024 零点财经保留所有权 免责声明:网站部分内容转载至网络,如有侵权请告知删除 友链,商务链接,投稿,广告请联系qq:253161086

零点财经保留所有权

免责声明:网站部分内容转载至网络,如有侵权请告知删除