《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)
http://www.matlabsky.com/thread-43937-1-1.html
《量化投资:以MATLAB为工具》连载(3)基础篇-N分钟学会MATLAB(下)
《量化投资:以MATLAB为工具》简介
《量化投资:以MATLAB为工具》是由电子工业出版社(PHEI)下属旗舰级子公司——北京博文视点资讯有限公司出版的《量化投资与对冲基金丛书》之一,丛书主编为丁鹏博士,《量化投资:以MATLAB为工具》由李洋(faruto)、郑志勇(ArisZheng)编著,主要介绍MATLAB在量化投资中的具体应用。该书预计2014年10月上市,欢迎大家多多支持。在书籍上市之前,会在中国量化投资学会的各种网络平台进行系列连载介绍,方便读者提前一窥书籍概要。
《量化投资:以MATLAB为工具》连载(3)基础篇-N分钟学会MATLAB(下)
引言
之所以采用下文这种Q&A的形式来作为《量化投资:以MATLAB为工具》的基础篇,是想让刚刚接触MATLAB的读者能快速有效地了解MATLAB,毕竟在一个注重时间效率的年代大家更喜欢速成的东西。
本篇形式上参考了刘思喆老师的《153分钟学会R》,当然内容方面结合了MATLAB本身的特色,本篇的内容来源多样,既有来自于MATLAB的官方帮助文档,也有来自我个人的一些总结,还有若干来自MATLAB技术论坛(http://www.matlabsky.com)的讨论问题。
MATLAB是一个非常庞大的体系,其官方工具箱就有数十种,内部函数有数百个,可以说学习MATLAB是一件没有尽头的事情。
想来自己接触MATLAB已经有快10年的时间了,在学习MATLAB的道路上接触很多志同道合的朋友,希望这篇简单的“N分钟学会MATLAB(60<N<180)”能成为你认识、学习MATLAB的好助手。
李洋(faruto)
数学运算
(1) 如何模拟高斯(正态)分布数据?
使用random('Normal',Mean_Value, STD_Value, N, M)可以产生N*M个来自于均值为Mean_Value,标准差为STD_Value的高斯(正态)分布数据。
其中'Normal'是个参数选项,改变这个参数也可以生成其他的分布数据(相应地后面的分布的参数也需要修改),主要的分布有
表0- 1:主要分布及其参数名字
参数
|
分布名称
|
'beta' or 'Beta'
|
Beta Distribution
|
'bino' or 'Binomial'
|
Binomial Distribution
|
'chi2' or 'Chisquare'
|
Chi-Square Distribution
|
'exp' or 'Exponential'
|
Exponential Distribution
|
'ev' or 'Extreme Value'
|
Extreme Value Distribution
|
'f' or 'F'
|
F Distribution
|
'gam' or 'Gamma'
|
Gamma Distribution
|
'gev' or 'Generalized Extreme Value'
|
Generalized Extreme Value Distribution
|
'gp' or 'Generalized Pareto'
|
Generalized Pareto Distribution
|
'geo' or 'Geometric'
|
Geometric Distribution
|
'hyge' or 'Hypergeometric'
|
Hypergeometric Distribution
|
'logn' or 'Lognormal'
|
Lognormal Distribution
|
'nbin' or 'Negative Binomial'
|
Negative Binomial Distribution
|
'ncf' or 'Noncentral F'
|
Noncentral F Distribution
|
'nct' or 'Noncentral t'
|
Noncentral t Distribution
|
'ncx2' or 'Noncentral Chi-square'
|
Noncentral Chi-Square Distribution
|
'norm' or 'Normal'
|
Normal Distribution
|
'poiss' or 'Poisson'
|
Poisson Distribution
|
'rayl' or 'Rayleigh'
|
Rayleigh Distribution
|
't' or 'T'
|
Student's t Distribution
|
'unif' or 'Uniform'
|
Uniform Distribution (Continuous)
|
'unid' or 'Discrete Uniform'
|
Uniform Distribution (Discrete)
|
'wbl' or 'Weibull'
|
Weibull Distribution
|
字符操作
(2) MATLAB对大小写敏感吗?
MATLAB对大小写是敏感的,可以使用lower、upper等函数对字符进行转化。
(3) 如何在MATLAB中定义带引号的字符串?
在MATLAB编程中,如果想得到的带有引号的字符串(字符串中本身带有引号),怎么实现?输入str = 'string' 得到的是
>> str = 'string'
str =
string
其中str里没有单引号,如果像下面这样
>> str = ''string' '
str = ' 'string' '
Error: Unexpected MATLABexpression.
又会出现报错,原因是MATLAB在进行匹配是一个单引号' 对一个单引号 '。如果字符串中有单引号,还按照一般的方式进行输入就会造成匹配的错误,就上面那个错误提示了。正确的解决方式是:
>> str ='''string'''
str =
'string'
输入三个单引号就可以实现了。如果你想要双引号,比如 str = "string"此时就直接输入双引号就行了。
>> str = '"string" '
str =
"string"
注意:此时不是三个单引号,是一对单引号和一对双引号,放到MATLAB中能很容易的看清楚的。
绘图相关
(4) 如何在同一画面画出多张图?
使用subplot函数可以在同一个画面画出多张图,见下例
figure;
income =[3.2,4.1,5.0,5.6];
outgo =[2.5,4.0,3.35,4.9];
subplot(2,1,1);
plot(income);
title('Income');
subplot(2,1,2);
plot(outgo);
title('Outgo');
运行结果
图0- 3:subplot函数运行样例
(5) 如何加图例?
使用legend函数可以增加图例。
figure;
income =[3.2,4.1,5.0,5.6];
outgo =[2.5,4.0,3.35,4.9];
subplot(2,1,1);
plot(income);
legend('sin1(x)','cos(x)')
title('Income');
subplot(2,1,2);
plot(income);
legend('sin(x)','cos(x)','Location','northwest')
title('Outcome');
(6) 怎么做饼图?
pie函数可以制作二维的饼图,pie3函数可以制作三维的饼图,见下例
x = [1 3 0.5 2.5 2];
explode = [0 1 0 0 0];
figure;
subplot(2,1,1);
pie(x,explode);
title('二维饼图');
colormap jet
subplot(2,1,2);
pie3(x,explode);
title('三维饼图');
colormap hsv
运行结果
图0- 4:pie函数、pie3运行样例
数学、金融、统计相关
(7) 有没有直接计算峰度和偏度的函数?
使用skewness和kurtosis函数可以直接计算峰度和偏度。
(8) 如何利用MATLAB获取免费的金融数据?
MATLAB有一个数据获取工具箱(DatafeedToolbox),Datafeed Toolbox提供从主要的金融数据提供商出获取当前的、当天的、历史的和实时市场数据的工具。将金融数据域MATLAB集成起来,用户可开发实时模型反应当前金融市场行为。这个工具箱也提供导出MATLAB数据到数据服务提供商的函数。用户可建立从MATLAB到数据服务提供商提供的历史数据或者预定实时数据流的连接。证券查找对话框可以使工程师在 MATLAB 环境中查找指定证券的代码(仅针对Bloomberg)。工程师可以使用证券的简要缩写码和代码来表示一个证券。
DatabaseToolbox支持如下的金融数据服务提供商:
Bloomberg®
eSignal
Factset®
Federal Reserve Economic Data (FRED)
Haver Analytics
Interactive Data
Kx Systems®
Reuters® Market Data System
Thomson® Datastream
Yahoo!® Finance
其中雅虎财经(YahooFinance)的数据接口是完全免费的,你可以免费从雅虎财经下载全球的股票与期货数据进行建模测试,比如下载中国股市的数据,你只需知道相应股票的代码(在Yahoo Finance中上海证券交易所股票代码后需要加一个“.SS”,深圳证券交易所股票代码后需要加一个“.SZ”),见下例,获取三友化工(600409.SS 三友化工 Sanyou Chemical)在某一时段的股票日收盘数据数据,
conn = yahoo;
test =fetch(conn,{'600409.SS'},{'Close'},'08/01/13','08/08/13','d');
d = fints(test(:,1),test(:,2), 'Close', 'D', '600409.SS_Close')
close(yahoo)
运行结果
d =
desc: 600409.SS_Close
freq: Daily (1)
'dates: (6)' 'Close: (6)'
'01-Aug-2013' [ 4.2100]
'02-Aug-2013' [ 4.2100]
'05-Aug-2013' [ 4.3200]
'06-Aug-2013' [ 4.3900]
'07-Aug-2013' [ 4.3500]
'08-Aug-2013' [ 4.3600]
上述操作也可以使用在DatafeedToolbox GUI界面上完成,在MATLAB命令窗口(Commond Window)键入dftool可以调出Datafeed Toolbox GUI界面,
file:///C:/Users/faruto/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
图0- 17:Datafeed Toolbox GUI界面
(9) 利用MATLAB可以实现支持向量机(SVM)模型吗?
较新版本的MATLAB中有svmtrain、svmclassfity等函数可以实现SVM,但笔者更推荐使用LIBSVM工具箱,这个工具箱是个第三方工具箱,由台湾大学林智仁(Lin Chih-Jen)教授等开发设计,该工具箱用于实现SVM模型更加方便自由。
更多关于SVM的理论和应用方面的知识可以查看下面的免费视频链接进行学习:
支持向量机(SVM)相关免费学习视频集锦
http://www.matlabsky.com/thread-36823-1-1.html
(10) 如何计算一个资金流的最大回撤?
根据最大回撤的定义:
设Equity为资金流,在索引(下标)Index处,可以找出之前的资金流的最大值,设该最大值为Max,如果Index处的资金流就为这个最大值,则Index处的最大回撤为0,否则Index处的最大回撤( Equtity(Index)-Max )/Max。
下面的RetraceRatio.m函数可以实现最大回撤的计算。
function[DrawDownPercent,DrawDownAbs] = RetraceRatio(Equity)
% 计算最大回撤比例
% by liyang 2012/5/25
%% 初始化
len = numel(Equity);
DrawDownPercent =zeros(len, 1);
DrawDownAbs = zeros(len,1);
%% 计算最大回撤比例
C = Equity(1);
for i = 2:len
C = max(Equity(i),C);
if C == Equity(i)
DrawDownPercent(i) = 0;
else
DrawDownPercent(i) = (Equity(i)-C)/C;
end
end
%% 计算最大回撤绝对数值
C = Equity(1);
for i = 2:len
C = max(Equity(i),C);
if C == Equity(i)
DrawDownAbs(i) = 0;
else
DrawDownAbs(i) = (Equity(i)-C);
end
end
下面使用该函数计算一下某一资金流(权益)的最大回撤,见下例
load FundMarketCash
fund = TestData(:,1);
[DrawDownPercent,DrawDownAbs]= RetraceRatio(fund);
figure;
subplot(3,1,1:2);
plot(fund);
xlim([1 length(fund)]);
title('Fund','FontWeight', 'Bold');
subplot(313);
plot( DrawDownPercent );
xlim([1 length(fund)]);
title('最大回撤比例', 'FontWeight','Bold');
运行结果
图0- 18:最大回撤图形展示
其他
(11) Cell编程模式(CellMode)是什么?
在MATLAB文件编辑器(Editor)中,开启Cell编程模式(CellMode)后,可以使用两个分号“%%”将代码分块展示,也可以直接插入HTML代码和Latex代码等进行代码注释和讲解。
(12) MATLAB可以用网页显示结果么?
可以。在MATLAB文件编辑器(Editor)中,选择File->Publish可以直接生成代码以及测试结果的网页,结合Cell编程模式(Cell Mode)可以直接生成精美的网页方便代码以及测试结果的交流分享,下图为本文档的相应代码和测试结果生成的网页截图。
file:///C:/Users/faruto/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
图0- 19:Publish网页截图
更多内容参见《量化投资:以MATLAB为工具》。
该书预计2014年10月上市。
书籍交流论坛:MATLAB技术论坛读书频道《量化投资:以MATLAB为工具》专版,地址:http://www.matlabsky.com/forum-112-1.html
《量化投资:以MATLAB为工具》基础篇部分(N分钟学会MATLAB)的相关文档、代码、数据已经完全免费开源共享,欢迎下载。
百度网盘下载地址:
作者简介
李洋(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