加载中…

加载中...

个人资料
faruto
faruto 新浪个人认证
  • 博客等级:
  • 博客积分:0
  • 博客访问:1,143,192
  • 关注人气:2,115
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统(中)

(2014-10-20 10:08:51)
标签:

matlab

quant

交易系统

量化投资

分类: 量化投资:以MATLAB为工具

《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统()

《量化投资:以MATLAB为工具》简介

         《量化投资:以MATLAB为工具》是由电子工业出版社(PHEI)下属旗舰级子公司——北京博文视点资讯有限公司出版的《量化投资与对冲基金丛书》之一,丛书主编为丁鹏博士,《量化投资:以MATLAB为工具》由李洋(faruto)、郑志勇(ArisZheng)编著,主要介绍MATLAB在量化投资中的具体应用。该书预计201410月上市,欢迎大家多多支持。在书籍上市之前,会在中国量化投资学会的各种网络平台进行系列连载介绍,方便读者提前一窥书籍概要。

 

 

《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统()

 

一个简单均线系统的MATLAB实现展示

这里给出一个简单的均线系统使用MATLAB进行回测的展示,一窥使用MATALB进行回测的大体步骤。

交易策略:5日均线上穿20日均线做多(即买入,若有空头仓位先平掉空头再建多头),5日均线下破20日均线做空(即卖出,若有多头仓位先平掉多头再建空头),上穿定义如下:

《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统(中)

其中 《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统(中) 表示5日均线, 《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统(中) 表示20日均线, 《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统(中) 表示5日均线在拉升, 《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统(中) 表示5日均线已经位于20日均线之上并且得到确认, 《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统(中) 表示5日上穿20日均线是一个动作,5日均线由20日均线下面拉升到20日均线上面。类似可以得到下破定义如下:

《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统(中)

《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统(中)

该策略暂没考虑交易成本、冲击成本等影响。

测试数据:股指主力连续数据IF8882011年全年日收盘数据。

MATLAB代码(MatlabTradingDemo.m):

function MatlabTradingDemo

% MATLAB开发交易策略范例:一个简单均线交易系统

% by LiYang 2014/05/01 farutliyang@foxmail.com

 

%% 清空工作空间、命令窗口

clc;clear;

close all;

format compact;

%% 载入测试数据 : 股指连续IF888 2011年全年数据

load IF888-2011.mat

IFdata = IF888(:,2);

%% 选择短期5日均线、长期20日均线

ShortLen = 5;

LongLen = 20;

[MA5, MA20] = movavg(IFdata, ShortLen, LongLen);

MA5(1:ShortLen-1) = IFdata(1:ShortLen-1);

MA20(1:LongLen-1) = IFdata(1:LongLen-1);

 

scrsz = get(0,'ScreenSize');

figure('Position',[scrsz(3)*1/4 scrsz(4)*1/6 scrsz(3)*4/5 scrsz(4)]*3/4);

plot([IFdata,MA5,MA20]);

grid on;

legend('IF888','MA5','MA20','Location','Best');

title('交易策略回测过程','FontWeight', 'Bold');

hold on;

%% 交易过程仿真

 

% 仓位 Pos = 1 多头1; Pos = 0 空仓; Pos = -1 空头一手

Pos = zeros(length(IFdata),1);

% 初始资金

InitialE = 50e4;

% 日收益记录

ReturnD = zeros(length(IFdata),1);

% 股指乘数

scale = 300;

 

for t = LongLen:length(IFdata)

   

    % 买入信号 : 5日均线上穿20日均线

    SignalBuy = MA5(t)>MA5(t-1) && MA5(t)>MA20(t) && MA5(t-1)>MA20(t-1) && MA5(t-2)<=MA20(t-2);

    % 卖出信号 : 5日均线下破20日均线

    SignalSell = MA5(t)=MA20(t-2);

   

    % 买入条件

    if SignalBuy == 1

        % 空仓开多头1

        if Pos(t-1) == 0

            Pos(t) = 1;

            text(t,IFdata(t),' \leftarrow开多1','FontSize',8);

            plot(t,IFdata(t),'ro','markersize',8);

            continue;

        end

        % 平空头开多头1

        if Pos(t-1) == -1

            Pos(t) = 1;

            ReturnD(t) = (IFdata(t-1)-IFdata(t))*scale;

            text(t,IFdata(t),' \leftarrow平空开多1','FontSize',8);

            plot(t,IFdata(t),'ro','markersize',8);          

            continue;

        end

    end

   

    % 卖出条件

    if SignalSell == 1

        % 空仓开空头1

        if Pos(t-1) == 0

            Pos(t) = -1;

            text(t,IFdata(t),' \leftarrow开空1','FontSize',8);

            plot(t,IFdata(t),'rd','markersize',8);

            continue;

        end

        % 平多头开空头1

        if Pos(t-1) == 1

            Pos(t) = -1;

            ReturnD(t) = (IFdata(t)-IFdata(t-1))*scale;

            text(t,IFdata(t),' \leftarrow平多开空1','FontSize',8);

            plot(t,IFdata(t),'rd','markersize',8);

            continue;

        end

    end

   

    % 每日盈亏计算

    if Pos(t-1) == 1

        Pos(t) = 1;

        ReturnD(t) = (IFdata(t)-IFdata(t-1))*scale;

    end

    if Pos(t-1) == -1

        Pos(t) = -1;

        ReturnD(t) = (IFdata(t-1)-IFdata(t))*scale;

    end

    if Pos(t-1) == 0

        Pos(t) = 0;

        ReturnD(t) = 0;

    end   

   

    % 最后一个交易日如果还有持仓,进行平仓

    if t == length(IFdata) && Pos(t-1) ~= 0

        if Pos(t-1) == 1

            Pos(t) = 0;

            ReturnD(t) = (IFdata(t)-IFdata(t-1))*scale;

            text(t,IFdata(t),' \leftarrow平多1','FontSize',8);

            plot(t,IFdata(t),'rd','markersize',8);

        end

        if Pos(t-1) == -1

            Pos(t) = 0;

            ReturnD(t) = (IFdata(t-1)-IFdata(t))*scale;

            text(t,IFdata(t),' \leftarrow平空1','FontSize',8);

            plot(t,IFdata(t),'ro','markersize',8);

        end

    end

   

end

%% 累计收益

ReturnCum = cumsum(ReturnD);

ReturnCum = ReturnCum + InitialE;

%% 计算最大回撤

MaxDrawD = zeros(length(IFdata),1);

for t = LongLen:length(IFdata)

    C = max( ReturnCum(1:t) );

    if C == ReturnCum(t)

        MaxDrawD(t) = 0;

    else

        MaxDrawD(t) = (ReturnCum(t)-C)/C;

    end

end

MaxDrawD = abs(MaxDrawD);

%% 图形展示

scrsz = get(0,'ScreenSize');

figure('Position',[scrsz(3)*1/4 scrsz(4)*1/6 scrsz(3)*4/5 scrsz(4)]*3/4);

subplot(3,1,1);

plot(ReturnCum);

grid on;

axis tight;

title('收益曲线','FontWeight', 'Bold');

 

subplot(3,1,2);

plot(Pos,'LineWidth',1.8);

grid on;

axis tight;

title('仓位','FontWeight', 'Bold');

 

subplot(3,1,3);

plot(MaxDrawD);

grid on;

axis tight;

title(['最大回撤(初始资金',num2str(InitialE/1e4),'万)'],'FontWeight', 'Bold');

最终回测结果如下图所示。

《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统(中)

15- 2:交易策略回测信号

《量化投资:以MATLAB为工具》连载(18)如何构建基于MATLAB的回测系统(中)

15- 3:收益曲线、仓位、最大回测展示

从上面简单均线系统的MATLAB回测展示可以看出,一个完整的交易系统回测需要生成相应的交易信号,进而计算相应的资金流和仓位记录,最后给出相应的图形展示。

 

 

 

更多内容参见《量化投资:以MATLAB为工具》。

         该书预计201410月上市。

书籍交流论坛:MATLAB技术论坛读书频道《量化投资:以MATLAB为工具》专版,地址:http://www.matlabsky.com/forum-112-1.html

 

作者简介

李洋(faruto),中国量化投资学会专家委员会成员,MATLAB技术论坛(www.matlabsky.com)联合创始人,北京师范大学应用数学硕士,先后就职于私募、期货公司、保险公司,从事量化投资相关工作。十年MATLAB编程经验,对机器学习、量化投资等相关领域有深入研究,已出版《MATLAB神经网络30个案例分析》和《MATLAB神经网络43个案例分析》等书籍。

邮箱:farutoliyang@foxmail.com

微博:http://weibo.com/faruto

郑志勇(Ariszheng),中国量化投资学会专家委员会成员,方正富邦基金产品总监,北京理工大学运筹学与控制论硕士,先后就职于中国银河证券、银华基金、方正富邦基金,从事金融产品研究与设计工作。十余年MATLAB编程经验,专注于产品设计、量化投资等相关领域的研究,尤其对于各种结构化产品、分级基金产品有着深入的研究,已出版《运筹学与最优化MATLAB编程》和《金融数量分析:基于MATLAB编程》等书籍。

邮箱:ariszheng@gmail.com

微博:http://weibo.com/ariszheng

 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有