加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
仓位净值计算模块 5.46 KB
一键复制 编辑 原始数据 按行查看 历史
jack 提交于 2021-07-14 02:38 . add 仓位净值计算模块.
function [net_value, return_value, turnoverNum] = SingleTimeStandard(asset, assetFull, signal, weight2, weight3, tc)
%3. standard 二+三类,不同权重测试
%第三类卖点 13
%第二类卖点 12
%第三类买点 3
%第二类买点 2
backtest = transpose(signal);
backtest(:, 2) = 1 : length(signal); %保留原始位置
%标记买卖点
%for loop 中只需要知道当前买卖点类型,下一个买卖点类型只是用来确认区间
backtest(backtest(:, 1) == 13 | backtest(:, 1) == 12, 3) = -1; %标记买卖
backtest(backtest(:, 1) == 3 | backtest(:, 1) == 2, 3) = 1;
backtest(backtest(:, 1) == 0, :) = [];
%记录原始数据时间
%计算净值时按照原始时间
FullTime = datenum(assetFull.Date);
backtest(:, 2) = asset(backtest(:, 2), 1); %将信号位置换成时间
backtest(:, 2) = find(ismember(FullTime, backtest(:, 2))); %找到信号时间在原始数据中的位置
%计算仓位变动位置
change_value = [true; diff(backtest(:, 1)) ~= 0; true];
change_value(1) = [];
num_rep = diff(find(change_value));
%设定初始仓位
if backtest(1, 1) == 2
backtest(1, 4) = weight2;
elseif backtest(1, 1) == 3
backtest(1, 4) = weight3;
elseif backtest(1, 1) == 12 || backtest(1, 1) == 13
backtest(1, 4) = 0;
end
%backtest
%column 1 signal
%column 2 original signal position
%column 3 long short signal 1 -1
%column 4 position percentage
YOLO = 0;
for i = 2:size(backtest, 1)
if backtest(i, 3) == 1 %买入
if backtest(i, 1) == 2
backtest(i, 4) = backtest(i - 1, 4) + weight2; %加仓 weight2 成仓位
else
backtest(i, 4) = backtest(i - 1, 4) + weight3;
end
else %卖出
if backtest(i, 1) == 12
backtest(i, 4) = backtest(i - 1, 4) - weight2; %减仓 weight2 成仓位
else
backtest(i, 4) = backtest(i - 1, 4) - weight3;
end
end
if backtest(i, 4) > 1 + YOLO
backtest(i, 4) = 1 + YOLO;
elseif backtest(i, 4) < 0 - YOLO
backtest(i, 4) = 0 - YOLO;
end
end
return_value = [];
return_value(1) = 1;
%调仓收益单独计算,替换
%二类三类不同权重
change_value = [true; diff(backtest(:, 4)) ~= 0; true];
change_value(end) = []; %从第i-1个位置到第i个位置是否有变动
adjustPos = backtest(change_value == 1, 2); %调仓位置
if backtest(1, 2) ~= 1 %如果不是第一天调仓的话
return_value(2: backtest(1, 2)) = 1; %设定初始仓位为0
end
for i = 1:size(backtest, 1) - 1
if backtest(i, 3) == 1 && backtest(i + 1, 3) == -1
for j = backtest(i, 2) + 1 : backtest(i + 1, 2)
if j == backtest(i, 2) + 1 || j == backtest(i + 1, 2) %调仓当日按照均价计算
return_value(j) = (assetFull.Average(j) ./ assetFull.Close(j - 1) - 1) * backtest(i, 4) + 1;
else
return_value(j) = (assetFull.Close(j) ./ assetFull.Close(j - 1) - 1) * backtest(i, 4) + 1;
end
end
elseif backtest(i, 3) == -1 && backtest(i + 1, 3) == 1
for j = backtest(i, 2) + 1 : backtest(i + 1, 2)
if j == backtest(i, 2) + 1 || j == backtest(i + 1, 2) %调仓当日按照均价计算
return_value(j) = (assetFull.Average(j) ./ assetFull.Close(j - 1) - 1) * backtest(i, 4) + 1;
else
return_value(j) = (assetFull.Close(j) ./ assetFull.Close(j - 1) - 1) * backtest(i, 4) + 1;
end
end
elseif backtest(i, 3) == 1 && backtest(i + 1, 3) == 1
for j = backtest(i, 2) + 1 : backtest(i + 1, 2)
if j == backtest(i, 2) + 1 || j == backtest(i + 1, 2) %调仓当日按照均价计算
return_value(j) = (assetFull.Average(j) ./ assetFull.Close(j - 1) - 1) * backtest(i, 4) + 1;
else
return_value(j) = (assetFull.Close(j) ./ assetFull.Close(j - 1) - 1) * backtest(i, 4) + 1;
end
end
else
for j = backtest(i, 2) + 1 : backtest(i + 1, 2)
if j == backtest(i, 2) + 1 || j == backtest(i + 1, 2) %调仓当日按照均价计算
return_value(j) = (assetFull.Average(j) ./ assetFull.Close(j - 1) - 1) * backtest(i, 4) + 1;
else
return_value(j) = (assetFull.Close(j) ./ assetFull.Close(j - 1) - 1) * backtest(i, 4) + 1;
end
end
end
end
subTail = length(return_value) + 1;
if backtest(end, 2) ~= size(assetFull, 1) %如果最后一天不调仓的话
for j = subTail : size(assetFull, 1)
return_value(j) = (assetFull.Close(j) ./ assetFull.Close(j - 1) - 1) * backtest(end, 4) + 1;
end
end
net_value = [];
net_value(1) = 1;
for i = 2:length(return_value)
if any(adjustPos == i) %如果调仓
net_value(i) = net_value(i - 1) * return_value(i) * (1 - tc);
else
net_value(i) = net_value(i - 1) * return_value(i);
end
end
turnoverNum = length(adjustPos); %调仓频率
end
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化