学生,遇到不太会的一道题目,题目如下。
在给定的股票池中选择合适的股票构建投资组合,并使用双均线策略进行投资,报告投资收益并进行分析。
要求:
步骤一、选股。在股票池(为了计算方便可以任选其中100只股票)中根据其在训练期(如过去N年)的表现 (如夏普比率),选择5只相对最好的。
步骤二、构成投资组合。根据投资组合理论,构建一个效用函数,根据该效用函数构建一个投资组合。
步骤三、择时。5个成分股各自按照双均线策略在一个给定的测试期(注意测试期必须在训练期后,测试期长度应该小于训练期)内进行择时,并记录收益,计算相应的Alpha,Beta,夏普比率,累积收益,最大回撤等指标。
步骤四、改变双均线的参数,重新完成步骤三。
训练数据和测试数据的长度由自己设定,需要通过作图来表达累积收益,使用上证综指作为对比。
关于双均线策略:通过建立m天移动平均线,n天移动平均线,则两条均线必有交点。若m>n,n天平均线“上穿越”m天均线则为买入点(金叉),反之为卖出点(死叉)。该策略基于不同天数均线的交叉点,抓住股票的强势和弱势时刻,进行交易。
5日均线与20日均线组合比较流行,本题步骤四还可以使用5日均线与10日均线,也可以改为其他参数进行多次测试比较策略效果。
步骤一二目前会,代码写成了这个样子
addpath('C:\Users\tx\Desktop\matlab');
load('stkClose.mat');
load('StockListNew.mat');
load('indexClose.mat');
total_date_range =cellstr(datestr(busdays('28-Jan-2003','1-Dec-2018','Daily')));
dateBegin=datestr(busdate(input('输入回测开始日期(e.g."01-Jan-2006"):'),1));
dateEnd = datestr(busdate(input('输入回测结束日期(e.g."31-Dec-2008"):'),-1));
range=find(ismember(total_date_range,dateBegin)==1):find(ismember(total_date_range,dateEnd)==1);
[ind aim_stock] =get_top_sharpe_stock(stkClose,range);
weights =cal_optimal_weights(aim_stock);
步骤一
function [ind aim_stock] =get_top_sharpe_stock(stkClose,range)
x=stkClose(:,randperm(size(stkClose,2)));
nan_ind = find(sum(isnan(x))>0.3*size(stkClose,1));
x(:,[nan_ind]) = [];
x=x(range,:);
y=x(:,1:200);
ret = price2ret(y);
find_max_sharpe =nanmean(ret)./nanstd(ret);
[B I] = sort(find_max_sharpe,'descend');
aim_stock = y(:,I(1:5));
ind = I;
end
步骤二
function optimal_weights =cal_optimal_weights(aim_stock)
mean_ret = nanmean(aim_stock);
std_ret = nanstd(aim_stock);
covariance = nancov(aim_stock);
weights = rand(1000,5);
total = sum(weights,2);
for i=1:size(weights,2)
weights(:,i) = weights(:,i)./total;
end
[prisk, pret]=portstats(mean_ret,covariance, weights);
rf = 0.0006;
sharpe_ratio = (pret-rf)./prisk;
[max_ratio ind] = max(sharpe_ratio);
optimal_weights = weights(ind,:);
end
目前是有数据:
TradingDate.mat:2000.01.04~2016.07.01的交易日
indexClose.mat:不同大盘指数收盘价
stkClose.mat:不同个股收盘价
stkVolume.mat:不同个股交易量
StockListNew.mat:不同个股的交易代码
请教一下步骤三四对于双均线应该怎么处理呢