《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)

时间:2022-04-11 05:44:20
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');
运行结果
《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)
                      图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');

《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)

(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
运行结果
《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)
                        图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');
运行结果
《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)
                           图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 文档、代码、数据下载地址
         《量化投资:以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