%% yafcoTest1
% 脚本程序
% Last Modified by LiYang @ yafco 2011/12/07
% farutoliyang@gmail.com
% 程序实现测试所使用的MATLAB版本:MATLAB R2011b(7.13)
% 如果程序在您本机运行不了,请首先检查您MATLAB的版本号,推荐使用较新版本的MATLAB。
%% a little clean work
tic;
clear;
clc;
close all;
format compact;
%% Load Data
load IFdata;
%% Initialization
IF = data;
len = length(IF);
[Short5, Long20] = movavg(IF, 5, 20);
IF = data(20:end);
MA5 = Short5(20:end);
MA20 = Long20(20:end);
EquityDay = zeros(len,1);
EquityDay = EquityDay(20:end);
EquityDay(1) = 50e4;
%% plot
figure;
plot(IF);
hold on;
grid on;
plot(MA5,'k');
plot(MA20,'r');
legend('IF1112','MA5','MA20');
title('策略展示图');
%% 策略过程
% 开多标签 1 多一手 0 无
LongFlag = 0;
% 开工表桥 1 空一手 0 无
ShortFlag = 0;
% 记录多头序列
LongS = zeros(len,1);
LongSlen = 1;
% 记录空头序列
ShortS = zeros(len,1);
ShortSlen = 1;
for i = 1:length(IF)
if i >=2
EquityDay(i) = EquityDay(i-1);
end
% 计算当天资金流
if i>1 && LongFlag == 1 && ShortFlag == 0
EquityDay(i) = EquityDay(i-1) + (IF(i)-IF(i-1))*300;
end
if i>1 && ShortFlag == 1 && LongFlag == 0
EquityDay(i) = EquityDay(i-1) + (IF(i-1)-IF(i))*300;
end
% MA5上穿MA20平空并开多1手
% 上穿定义:MA5当天大于MA20,前一天MA5位于MA20之下
if LongFlag == 0 && i>2 && MA5(i-1)<=MA20(i-1) && MA5(i)>MA20(i)
if ShortFlag == 1
ShortFlag = 0;
EquityDay(i) = EquityDay(i) + (ShortS(ShortSlen-1)-IF(i))*300;
ShortS(ShortSlen) = IF(i);
ShortSlen = ShortSlen + 1;
text(i,IF(i),' \leftarrow 平空1手&开多1手','FontSize',10);
else
text(i,IF(i),' \leftarrow 开多1手','FontSize',10);
end
LongFlag = 1;
LongS(LongSlen) = IF(i);
LongSlen = LongSlen + 1;
plot(i,IF(i),'ro','markersize',8);
end
% MA5下穿MA20平多并开空1手
% 下穿定义:MA5当天小于于MA20,前一天MA5位于MA20之上
if ShortFlag == 0 && i>2 && MA5(i-1)>=MA20(i-1) && MA5(i)
if LongFlag == 1
LongFlag = 0;
EquityDay(i) = EquityDay(i) + (IF(i)-LongS(LongSlen-1))*300;
LongSlen = LongSlen + 1;
text(i,IF(i),' \leftarrow 平多1手&开空1手','FontSize',10);
else
text(i,IF(i),' \leftarrow 开空1手','FontSize',10);
end
ShortFlag = 1;
ShortS(ShortSlen) = IF(i);
ShortSlen = ShortSlen + 1;
plot(i,IF(i),'rd','markersize',8);
end
% 最后一天如果还有持仓,进行平仓
if i == length(IF)
if LongFlag == 1
LongFlag = 0;
EquityDay(i) = EquityDay(i) + (IF(i)-LongS(LongSlen-1))*300;
end
if ShortFlag == 1;
ShortFlag = 0;
EquityDay(i) = EquityDay(i) + (ShortS(ShortSlen-1)-IF(i))*300;
end
end
end
%% 计算回撤比例
BackRatio = zeros(length(EquityDay),1);
BackRatio(1:19) = 0;
for i = 20:length(BackRatio)
[C,ind] = max(EquityDay(20:i));
ind = ind + 19;
if C == EquityDay(i)
BackRatio(i) = 0;
else
BackRatio(i) = (EquityDay(i)-C)/EquityDay(ind);
end
end
%% 画出资金流图
figure;
subplot(2,1,1);
plot(EquityDay)
grid on;
title('资金权益');
subplot(2,1,2);
plot(BackRatio);
title('最大回撤比例');
grid on;
axis([0 150 -0.2 0.2]);
%% Record time
toc;