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