量化投资:以MATLAB为工具(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-24 16:09:49

点击下载

作者:李洋(Faruto),郑志勇(Ariszheng)

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

量化投资:以MATLAB为工具

量化投资:以MATLAB为工具试读:

前言

写在前面的话

光阴荏苒,岁月如梭,距离《量化投资:以MATLAB为工具》第1版的出版已经有近两年的时间了,期间通过各大电商的评论及邮件,我收到读者各式各样的反馈和评论,深知该书无法满足所有层次读者的需求,也有诸多需要完善和精细化的地方,仅希望能够对在量化投资道路上探索的读者有些许启发和帮助。

相比于第1版,第2版除了修正个别错误和不严谨之处,还增加了更多量化投资的实际案例,包括但不限于基于MATLAB的多因子选股模型、基于MATLAB和Wind的量化交易终端、基于MATLAB的BP模型、基于MATLAB的广义极值分布模型、基于MATLAB的正则表达式简介。本书最后详细介绍了笔者在2015年开发的一个开源工具箱——FQuantToolBox股票期货数据获取&量化回测工具箱,通过该工具箱可以免费获取股票和期货数据,方便读者构建自己的回测数据库,进行相关策略的研发和测试。

本书内容框架

本书分为基础篇和高级篇两大部分。

基础篇采用了Q&A的写作方式,目的是让刚刚接触MATLAB的读者能快速有效地了解MATLAB。基础篇内容来源多样,既有来自MATLAB的官方帮助文档,也有笔者个人的一些总结,还有若干来自 MATLAB技术论坛(http://www.matlabsky.com)的讨论问题。

高级篇介绍了MATLAB结合具体量化投资的相关案例,涉及的内容主要有:基于MATLAB的优化问题、MATLAB与Excel的数据交互、MATLAB与数据库的数据交互、K线图及常用技术指标的MATLAB实现、基于MATLAB的行情软件、基于MATLAB的随机模拟、基于MATLAB的风险管理、期权定价模型的MATLAB实现、基于MATLAB的支持向量机(SVM)在量化投资中的应用、MATLAB与其他金融平台终端的通信、基于MATLAB的交易品种选择和相关性分析、基于MATLAB的国内期货证券交易解决方案、构建基于MATLAB的回测系统、基于MATLAB的多因子选股模型的实现、基于MATLAB和Wind的量化交易终端AsTradePlatform介绍与使用、基于MATLAB的BP神经网络在量化投资中的应用、基于MATLAB的广义极值分布在量化投资中的策略挖掘与回测、基于MATLAB的正则表达式基础教程、FQuantToolBox股票期货数据获取&量化回测工具箱的介绍与使用。高级篇可以帮助读者通过具体的量化投资案例掌握MATLAB的相关应用。

本书既有复杂模型(支持向量机相关模型)的介绍,也有简单模型(品种简单波动性模型)的分析,其实无论模型复杂与否,量化投资本身更像一门艺术,并不是复杂的模型才是“好”模型,简单的模型就是“差”模型。所有的回测仅仅是检测模型的历史表现,所有的模型也有其生命周期和适用条件,终极意义上的模型检验只能是“实战”。

使用MATLAB可以更加精细、自由地测试交易模型。作为一个投资工具,MATLAB的目的是帮助投资者快速构建模型进行测试来检查某一模型的历史表现,工具本身并不能帮我们赚钱,量化投资的核心还是策略模型背后的交易逻辑。

阅读本书时,建议读者按照“先通读章节内容,后调试程序,再精读章节内容”的顺序进行。本书程序建议在MATLAB R2012a及以上版本的环境下运行。本书的章节之间没有特别的顺序要求,读者可以选择任何感兴趣的章节开始阅读。如果您是一名MATLAB和量化投资的初学者,则建议按照章节顺序通读全书。

面向读者对象

● 经济金融机构的研究人员和从业人员。

● 进行量化投资的交易员。

● 具有统计背景的科研工作者。

● 高等院校理工科、经济金融学科等相关专业的本科生、研究生及教师。

● 对量化投资和MATLAB感兴趣的人士。

勘误和交流

由于笔者水平有限,书中难免会出现一些错误或不严谨之处,恳请读者批评指正。本书在 MATLAB技术论坛的“MATLAB读书频道”有专门的交流板块(http://www. matlabsky.com/forum-112-1.html),方便与读者进行沟通。如果您在阅读过程中有任何疑问,可以在上述书籍交流板块发帖留言,笔者会尽力为您提供最满意的解答。本书的全部源代码和测试数据也可以在上述书籍交流板块进行下载。本书为黑白印刷,对于书中的测试和展示图片,读者可以运行源代码得到彩色图片进行查看。

如果您有什么宝贵意见,欢迎发邮件进行交流,期待得到您真挚的反馈。

笔者邮箱:farutoliyang@foxmail.com

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

笔者博客:http://blog.sina.com.cn/faruto

笔者微信公众号:FQuantStudio

致谢?

本书得到了笔者朋友和同事的帮助,借本书出版之际,一并向他们表示真诚的感谢。

感谢丁鹏博士邀请我撰写此书,没有他的邀请就不会有该书的问世;感谢博文视点李冰等编辑的支持和合作。

感谢我之前待过的两支量化团队成员:张冰博士、钱文博士、陈星、宋腾;周剑博士、赵婉西、陈雪莹。感谢我现在所在的量化团队成员:刘文希、伍侃、刘霁。Quant Never Sleeps!在量化之路上我们要一直前行。

感谢 MATLAB技术论坛的兄弟们:詹福宇(dynamic)博士、王小川(yaksa)博士、郁磊(yangzijiang)、吴鹏(rocwoods)、谢中华(xiezhh)和史峰(matsuper)。怀念自2008年开始一起走过的MATLAB岁月。

感谢吴云峰(MATLAB技术论坛ID:fantuanxiaot)、连祥斌(MATLAB技术论坛ID:lianzhang)、伍侃(MATLAB技术论坛ID:wukan)、彭安迅(MATLAB技术论坛ID:ansunckj)、张宇霖(MATLAB技术论坛ID:章鱼鳞)。该书部分章节段落由笔者邀请他们撰写,最后修改完善而成,在此对他们的相关工作表示由衷的感谢。

感谢我的家人,尤其是我的妻子吕哲伦女士,感谢她对我工作上的支持和生活上的照顾!

谨以此书献给我最爱的家人、众多MATLAB语言爱好者和中国的宽客!李洋2016年8月8日于北京基础篇第0章N分钟学会MATLAB(60

之所以采用下文这种Q&A的形式来作为本书的基础篇,是想让刚刚接触MATLAB的读者能快速有效地了解 MATLAB,毕竟在一个注重时间效率的年代,大家更喜欢速成的东西。

本篇形式上参考了刘思喆老师的《153分钟学会R》,当然内容方面结合了MATLAB本身的特色。本篇的内容来源多样,既有来自MATLAB的官方帮助文档,也有来自作者个人的一些总结,还有若干来自 MATLAB技术论坛(http://www.matlabsky.com)的讨论问题。

MATLAB是一个非常庞大的体系,其官方工具箱就有数十种,内部函数有数百个,可以说学习MATLAB是一件没有尽头的事情。希望本篇能成为读者认识、学习MATLAB的好助手。0.2 基础知识(1)MATLAB是做什么的?为什么MATLAB叫作MATLAB?

MATLAB是美国MathWorks公司出品的商业数学软件,是用于算法开发、数据可视化、数据分析及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。

MATLAB是Matrix和Laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。之所以叫作矩阵工厂(矩阵实验室),是因为MATLAB的基本数据单位是矩阵。(2)MathWorks公司的创始人是谁?

Cleve Moler和 Jack Little是 MathWorks公司的创始人。其中,Cleve Moler是MATLAB首个版本的开发者,Jack Little是信号处理工具箱和控制系统工具箱早期版本的共同开发者和首席架构师。(3)新手如何开始学习MATLAB?

如果你的英文阅读水平还算可以,那么MATLAB官方的帮助文档将是最好且最全面的学习材料,你可以通过在MATLAB的命令窗口(Command Window)中输入“doc”来调出 MATLAB官方的帮助文档,也可以在 MathWorks公司官方网站的文档中心(http://www.mathworks.cn/cn/help/documentation-center.html)查看在线的MATLAB官方帮助文档。

另外,MathWorks公司官方网站的用户中心(http://www.mathworks.cn/matlabcentral/)中有一些MATLAB相关问题的讨论及一些MATLAB高手的博客,其中包括Cleve Moler的博客——Cleve's Corner(http://blogs.mathworks.com/cleve),你可以在其中学习MATLAB。

MATLAB技术论坛(http://www.matlabsky.com)是一个不错的学习MATLAB的中文网站,本书的作者之一李洋(Faruto)是MATLAB技术论坛核心管理团队的成员之一,在这个论坛里你可以找到大量的学习资料(代码、数据、视频等)或直接提出问题同大家讨论。

当然,你也可以购买一些MATLAB相关的中外文书籍进行学习。(4)使用MATLAB需要很强的编程能力吗?

大多数时候并不需要,因为MATLAB有很多的函数和工具箱,官方的工具箱还有数十种,第三方的工具箱不计其数且每天都在增加,你用到的一般方法和函数都可以在MATLAB的工具箱中找到。(5)能否简单举一个MATLAB的例子?

生成100个高斯(正态)分布随机数,并对这100个数进行特征描述。MATLAB代码如下:

运行结果(由于是生成随机数,所以多次运行结果可能不同)如下:(6)如何查看使用的MATLAB的版本信息及内存信息?

在MATLAB的命令窗口(Command Window)中输入“version”和“memory”来查看所使用的MATLAB版本信息和内存信息。运行结果(由于MATLAB版本的不同及电脑配置的不同,所以运行结果可能不同)如下:(7)MATLAB支持中文吗?

支持!但在MATLAB中,有相当一部分工具箱的作者都是以英文为母语的,所以建议熟练全英文环境。(8)MATLAB支持自动补全(Tab Completion)吗?

支持!在较新版本中,MATLAB引入了命令自动补全功能,使用Tab键能自动补全MATLAB命令或给出所有可能的补全命令列表。(9)MATLAB有哪些常用的热键?

MATLAB除了支持常见的 Windows热键(复制:Ctrl+C;剪切:Ctrl+X;粘贴:Ctrl+V等)外,在MATLAB文件编辑器(Editor)中,还有如下一些常见的热键。

· F5:运行当前的M文件。

· F9:运行选中的代码段。

· Ctrl+R:注释选中的代码段。

· Ctrl+T:反注释选中的代码段。

· Ctrl+I:将选中的代码段智能缩进调整。(10)如何清除变量?

使用clear命令可以清除工作空间(Workspace)中的所有变量。清除工作空间中名字为name的变量,使用clear name命令。(11)如何清空命令窗口(Command Window)?

使用clc命令可以清空命令窗口(Command Window)。(12)MATLAB常用的数据类型有哪些?

MATLAB支持的基本数据类型有基本数值类型、字符串、元胞数组、结构、函数句柄、Java对象、逻辑类型等。其中基本数值类型包括双精度类型、单精度类型、整数类型等。(13)如何查看函数的代码?

在MATLAB文件编辑器(Editor)菜单栏中可以使用File→Open命令直接打开相关M文件查看源码,也可以只用edit函数打开,如“edit mean”会直接打开求均值函数mean查看源码:(14)MATLAB里面可以使用科学计数法吗?

可以,如下例:(15)什么叫作MATLAB的当前路径(目录)、工作搜索路径(目录)?“当前路径(目录)(Current Folder)”是指MATLAB当前所在的路径。MATLAB菜单栏下面有一个Current Folder,可以在这里进行当前所在目录的更改,如图0-1所示。图0-1 MATLAB当前路径(目录)(Current Folder)更改位置“工作搜索路径(目录)”是指在使用某一个函数的时候,MATLAB可以搜索该函数的所有目录集合。在MATLAB菜单栏File→Set Path中可以查看所有的工作搜索路径(目录)集合,如图0-2所示。图0-2 MATLAB工作搜索路径(目录)设置

在使用某一个函数的时候,MATLAB首先会从当前目录搜索调用该函数;如果当前目录没有该函数,MATLAB就会在工作搜索目录按照从上到下的顺序搜索调用该函数;如果工作搜索目录中也没有该函数,则会给出如下的报错:

??? Undefined function or variable 'XXX'(16)在MATLAB中如何安装第三方的工具箱?

如果待安装的第三方的工具箱使用纯 M语言编写,这种情况比较简单,工具箱下载后,只需将第三方的工具箱所在目录添加到MATLAB工作搜索目录即可。具体操作就是在MATLAB菜单栏中选择File→Set Path→Add with Subfolders命令,然后选择之前存放第三方工具箱的文件夹,单击“保存(Save)”按钮就可以了。

如果待安装的第三方的工具箱并不是单纯用M语言编写的,比如LIBSVM工具箱中的MATLAB版本核心是使用C++代码编写的,安装这样的第三方工具箱的步骤就稍微复杂一些。下面以安装LIBSVM工具箱为例简要介绍一下。

安装LIBSVM工具箱是在MATLAB平台下使用LIBSVM的前提。在MATLAB平台下安装LIBSVM工具箱的本质其实就是将LIBSVM工具箱的MATLAB版本文件svmtrain.c 和svmpredict.c在MATLAB中进行编译生成.mex文件(依操作系统不同,32位操作系统编译后生成 svmtrain.mexw32和 svmpredict.mexw32,64位操作系统编译后生成svmtrain.mexw64和svmpredict.mexw64),之后就能在MATLAB中使用了。安装LIBSVM工具箱主要有以下几个步骤:

Step 01 下载LIBSVM工具箱并将其所在目录添加到MATLAB工作搜索目录。

可在http://www.csie.ntu.edu.tw/~cjlin/libsvm/下载最新版本的LIBSVM工具箱,然后在MATLAB菜单栏中选择File→Set Path→Add with Subfolders命令,并选择之前存放LIBSVM工具箱的文件夹,最后单击“保存”按钮即可。

Step 02 选择编译器。

由于 LIBSVM的原始版本是用 C++写的,所以需要用编译器编译一下,生成一个*.mexw32或*.mexw64文件,这样就可以在MATLAB平台下使用LIBSVM了。

如果编译器没有选择好,那么下一步进行make编译的时候就会出现如下报错:

Unable to complete successfully.

表示你没有选择好编译器。

这里需要本机事先安装一个 C++编译器,然后才能进行选择。推荐使用 Microsoft Visual C++ 6.0编译器或者更高版本的 Visual Studio。一般 MATLAB会自带一个编译器Lcc-win32 C,但这个在这里无法使用,因为LIBSVM源代码是用C++写的,而Lcc-win32 C是一个C编译器,无法编译C++源代码。

下面看一下选择编译器的具体操作。

首先在MATLAB命令窗口(Commond Window)中输入:

mex -setup

注意mex后面要敲一个空格,然后才是-setup。接着会出现如下类似内容:

这里询问是否选择本机已安装的编译器,正规地选择“y”然后指定编译器即可。根据本机安装的编译器,会出现如下类似内容:

然后选择相应的编译器并确认即可:

这样就表示编译器选择成功了(此步骤中可能会出现警告,这是正常现象)。

MATLAB支持的编译器列表可以在如下网址查看:

http://www.mathworks.com/support/compilers/current_release/。

如果输入“mex -setup”,则会出现:

选择y后,可选择的编译器里没有已经安装的编译器,表示MATLAB可能没有识别、记录安装的编译器的名字和目录(有时候会发生这种情况),此时应该重新输入“mex -setup”,选择“n”手动进行编译器的设置:

这样的话就可以手动选择你想要的编译器了:

这是确认步骤,如果你的编译器确实安装在MATLAB给出的这个目录里(这里是D:\Microsoft Visual Studio),选择“y”确认即可;如果不是,则说明MATLAB没有识别出安装的地方,选择“n”手动指定目录。选择n后的结果如下:

此时输入安装的编译器的完整目录即可。

Step 03 编译文件。

这一步的具体操作就是运行LIBSVM工具箱MATLAB版本文件夹中的make.m文件。首先需要把MATLAB的当前目录(Current Folder)调整到LIBSVM工具箱所在的文件夹,然后在MATLAB命令窗口(Commond Window)中输入“make”。

如果成功运行并没有报错,到此就说明LIBSVM工具箱安装成功了。LIBSVM工具箱中有自带的heart_scale.mat测试数据集,可以运行以下代码来检查是否安装成功:

出现如下结果,则说明安装成功了:

Accuracy=86.6667% (234/270) (classification)

在使用某一函数时,MATLAB首先会从当前目录搜索调用该函数。为了防止其他位置也有类似名字的 make.m函数进而运行错误,这一步要把 MATLAB的当前目录(Current Folder)调整到LIBSVM所在的文件夹,优先运行LIBSVM文件夹下的make.m文件。

make.m(LIBSVM版本3.14)的文件内容如下:

安装完LIBSVM工具箱后,可能会有人要用help svmtain和help svmpredict来查看这两个函数的帮助文件,但结果会是运行help svmtain在较新版本下得到的是MATLAB自带的svmtrain函数的帮助文件,而运行help svmpredict会有如下报错:

svmpredict not found.

因为svmtrain和svmpredict的源代码是svmtrain.c和svmpredict.c,其源代码是用C++写的,编译后生成的文件是 svmtrain.mexw32和 svmpredict.mexw32(或 svmtrain. mexw64和svmpredict.mexw64)。编译后的*.mexw32(或*.mexw64)文件是加密过的,打开是乱码,没有帮助文件说明注释,想要查看svmtrain和svmpredict的源代码可以直接查看svmtrain.c和svmpredict.c。

由于较新版本的MATLAB有自带的SVM实现,其函数名也为svmtrain,文件位置在MATLAB根目录下\toolbox\bioinfo\biolearning\svmtrain.m。为避免MATLAB自带的svmtrain函数与 LIBSVM 工具箱 svmtrain函数调用错误,可以将 MATLAB自带的svmtrain.m函数备份后改名,比如改成svmtrain_matlab.m或svmtrain.m_backup。(17)如何恢复MATLAB的文件关联?

有时候重装系统或者其他错误操作会导致MATLAB文件关联失效,运行如下代码可以恢复MATLAB的文件关联:0.3 输入/输出(18)如何输入一个矩阵并求其转置和逆?

有以下几种方式可以输入一个矩阵。

① 直接输入矩阵。

比如在命令窗口(Command Window)中输入:

>> A=[1 2 3 4; 0 1 0 0; 1  1 2 4]

可以定义矩阵。

如果矩阵中的元素间隔是等步长的,则可以使用如下方式输入矩阵:

>> A=1:0.1:5

表示从1~5,按照0.1步长生成行向量。

② 使用函数生成矩阵。

linspace函数可以批量生成向量,其用法有两种:

· linspace(a,b)表示将a~b等分成100份形成向量。

· linspace(a,b,n)表示将a~b等分成n份形成向量。

ones函数和zeros函数可以分别生成指定维数全为1和全为0的矩阵,eye函数可以生成单位矩阵,magic函数可以生成魔方矩阵,vander函数可以生成范得蒙(Vandermonde)矩阵,hilb函数可以生成希尔伯特(Hilbert)矩阵,Toeplitz函数可以生成托普利兹(Toeplitz)矩阵,company函数可以生成伴随矩阵,pascal函数可以生成帕斯卡(Pascal)矩阵。

单引号的作用是求矩阵的转置,inv函数可以求矩阵的逆,见下例:(19)MATLAB可以读取Excel的数据吗?

可以。MATLAB不但可以直接读取Excel文件,还可以向Excel文件中写入数据。使用xlsread和xlswrite函数可以达到MATLAB与Excel通信的目的,见下例:

运行的结果是通过xlswrite函数建立了eg_Mat2Excel.xlsx文件,其内容为:

通过xlsread函数可以读取eg_Mat2Excel.xlsx的内容:(20)可以将MATLAB命令窗口(Commond Window)中显示的结果输出到文件吗?

可以。使用diary函数可以将命令窗口(Commond Window)中显示的结果输出到文件。(21)MATLAB可以从系统剪切板(Clipboard)中读取数据吗?

可以。使用clipboard函数可以从系统剪切板中读取数据,使用方法如下:(22)MATLAB可以直接从数据库读取数据吗?

可以。MATLAB专门有一个数据库工具箱(Database Toolbox),可以通过ODBC/ JDBC接口访问具体的数据库。以MATLAB通过ODBC建立到Oracle数据库的连接为例进行介绍。

① 在Windows下选择“开始”→“控制面板”→“性能和维护”→“管理工具”,单击“数据源(ODBC)”。

② 选择“系统DSN”→“添加”→选择“Oracle in OraClient11g_home1”,单击“完成”。

③ 配置Oracle ODBC驱动。

④ 单击“确定”。

⑤ 在MATLAB中建立到Oracle的JDBC连接测试。

>> conn=database(instance,username,password);0.4 数据处理(23)如何删掉缺失值?

在MATLAB中使用NaN(Not-a-Number)表示缺失值,如:

A=[1 NaN 3]

判断矩阵(向量)某一元素是否为NaN时不能使用如下方式:

A(2) == NaN

需要使用isnan函数。使用如下方式可以删除缺失值:

A( isnan(A) )=[]

运行结果为:

可以看到缺失值已经被删除了。(24)如何将字符串转变为命令执行?

使用eval函数可以将字符串转变为命令执行,参考下例:

运行结果为:

有时候巧妙地使用eval函数会使某些程序实现起来更加方便灵活。(25)如何向一个向量追加元素?

这在MATLAB中实现非常容易,见下例:

运行结果为:(26)如何移除矩阵的某行(列)数据?

这涉及MATLAB中矩阵的一些操作,见下例:

运行结果为:(27)如何比较两个矩阵是否相同?

比较每个元素是否相同,如果每个元素都相同,那么这两个矩阵也相同。可以使用循环来达到这一目的,但使用all函数可以更方便地实现这一目的。all函数会检查一个矩阵的每一列是否都为非零或者逻辑真,见下例:

运行结果为:(28)如何去掉数据中的重复元素?

参考unique函数,unique函数可以去掉矩阵中的重复元素,见下例:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载