代码拉取完成,页面将自动刷新
同步操作将从 jack/缠论程序化交易系统 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。