pythonplot绘图xrd_一种简化的截面动量组合测试[PythonMATLAB]

下面的例子来源书籍

策略比较简单,使用N只股票构建投资组合,计算每只股票的过去LookBack(参数)日的动量,并作标准化处理作为股票权重,持有Holding(参数)日,其中权重允许为负数,即允许做空股票。简要说来就是做过过去表现强势的股票,做空过去表现弱势的股票。

虽然策略比较简单,但整体的测试流程和框架很明了清晰,对类似策略的回测实现具有参考意义,整体的流程框架为:

数据获取(基于付费或者免费的数据源)——》

数据的时间轴对齐以及缺失数据填充——》

子函数编写:特定回顾期的动量计算并作标准化——》

子函数编写:给定回顾期和持有期,组合的夏普比例计算——》

计算不同回顾期和持有期下组合的夏普比例值——》

进行策略参数分布图形展示

一、Python下的实现测试。

(1)主要用到numpy、pandas、matplotlib等几个包

# -*- coding: utf-8 -*-

"""

SimpleMomentumPortfolioTest

Created on 2015/05/01

@author: LiYang(faruto)

@group : FQuantStudio

@contact:

farutoliyang@foxmail.com

"""

#%% import

import numpy as np

import pandas as pd

import pandas.io.data as

web

import matplotlib.pylab

as plt

from pandas import

Series,DataFrame

from collections import

defaultdict

(2)数据的获取基于pandas包

#%% GetData

names = ['AAPL',

'GOOGL', 'MSFT', 'IBM', 'GS', 'MS', 'BAC', 'C']

def get_px(stock, start,

end):

return web.get_data_yahoo(stock, start,

end)['Adj Close']

px = DataFrame({n:

get_px(n, '1/1/2005', '1/1/2015') for n in names})

px.plot()

(3)数据的时间轴对齐以及缺失数据填充

#%% plot

px =

px.asfreq('B').fillna(method='pad')

rets = px.pct_change()

retcum =

(1+rets).cumprod()-1

retcum.plot()

(4)子函数编写:特定回顾期的动量计算并作标准化

#%% calc_mom

def calc_mom(price,

lookback, lag):

mom_ret =

price.shift(lag).pct_change(lookback)

ranks = mom_ret.rank(axis=1,

ascending=False)

demeaned =

ranks.subtract(ranks.mean(axis=1), axis=0)

return

demeaned.divide(demeaned.std(axis=1), axis=0)

当然这里是做了排序后把排序变量做标准化后返回。

(5)子函数编写:给定回顾期和持有期,组合的夏普比例计算

#%% strat_sr

compound = lambda x : (1

+ x).prod() - 1

daily_sr = lambda x:

x.mean() / x.std()

def strat_sr(prices, lb,

hold):

# Compute portfolio weights

freq = '%dB' % hold

port = calc_mom(prices, lb, lag=1)

daily_rets = prices.pct_change()

# Compute portfolio returns

port = port.shift(1).resample(freq,

how='first')

returns = daily_rets.resample(freq,

how=compound)

port_rets = (port * returns).sum(axis=1)

return daily_sr(port_rets) * np.sqrt(252 /

hold)

strat_sr(px, 70, 30)

(6)计算不同回顾期和持有期下组合的夏普比例值

#%% calc with diff

lookbacks and holdings

lookbacks = range(20,

90, 5)

holdings = range(20, 90,

5)

dd = defaultdict(dict)

for lb in lookbacks:

for hold in holdings:

dd[lb][hold] = strat_sr(px, lb, hold)

ddf = DataFrame(dd)

ddf.index.name =

'Holding Period'

ddf.columns.name =

'Lookback Period'

(7)进行策略参数分布图形展示

#%% heatmap

def heatmap(df, cmap=plt.cm.gray_r):

fig = plt.figure()

ax = fig.add_subplot(111)

axim = ax.imshow(df.values, cmap=cmap,

interpolation='nearest')

ax.set_xlabel(df.columns.name)

ax.set_xticks(np.arange(len(df.columns)))

ax.set_xticklabels(list(df.columns))

ax.set_ylabel(df.index.name)

ax.set_yticks(np.arange(len(df.index)))

ax.set_yticklabels(list(df.index))

plt.colorbar(axim)

heatmap(ddf)

通过上图可以看到在此例下,大概回顾期为55-60日,持有期为35-40日,会获取较高的夏普比率。

总结:可以看到在Python下使用pandas包整体的实现测试过程很简单明了。Pandas是个进行数据分析处理很赞的包。

二、MATLAB下的实现测试。

下面在来看下在MATLAB下的实现测试过程,不同的语言各有利弊,并无本质上哪个好,那个坏之说,本例中,由于Python下的pandas包的帮助,在Python下的代码更加简洁明了,MATLAB下代码稍显臃肿,当然也可以仿照Python下的pandas包,实现一个MATLAB下的pandas包,让相关的数据处理更加简洁方便。虽然MATLAB下的金融工具箱有fints(financial time series类)、timeseries类,但相关的实现和处理在效率和使用上并不是特别好,所以时序相关的处理我还是自己实现的,并没有全部使用MATLAB自带的一些包。

注:MATLAB的实现测试使用的A股的数据,数据的获取基于FQuantToolBox

(1)函数说明

function

SimpleMomentumPortfolioTest

% by LiYang_faruto

%

Email:farutoliyang@foxmail.com

% 2015/01/01

%% A Little Clean Work

% clear;

% clc;

% close all;

format compact;

(2)数据的获取基于FQuantToolBox

%% GetDataFromWeb

tic;

StockCodeCell =

{'600588sh','sh600030','600446','300024sz','sz000001','600570sh'};

StockNameCell = {'用友网络','中信证券','金证股份','机器人','平安银行','恒生电子'};

BeginDate = '20100101';

EndDate = '20150101';

Len =

length(StockCodeCell);

StockDataCell =

cell(length(StockCodeCell),1);

for i =

1:length(StockCodeCell)

StockCode = StockCodeCell{i};

[StockDataCell{i}] =

GetStockTSDay_Web(StockCode,BeginDate,EndDate);

end

toc;

%% 前复权数据生成

StockDataCellXRD =

StockDataCell;

for i = 1:Len

StockData = StockDataCell{i};

AdjFlag = 1;

[StockDataCell{i}] =

CalculateStockXRD(StockData, [], AdjFlag);

end

(3)数据的时间轴对齐以及缺失数据填充

tic;

sdate =

datenum(BeginDate,'yyyymmdd');

edate =

datenum(EndDate,'yyyymmdd');

bdates = busdays(sdate,

edate, 'Daily');

Bdates = str2num(

datestr(bdates,'yyyymmdd') );

StockDataCell_pre =

StockDataCell;

for i = 1:Len

tMat = zeros(length(Bdates),8);

tMat(:,1) = Bdates;

tMat_pre = StockDataCell{i};

for j = 1:length(Bdates)

tD = Bdates(j);

ind = find(tMat_pre(:,1)<=tD,

1,'last');

tMat(j,2:end) = tMat_pre(ind,2:end);

end

StockDataCell{i} = tMat;

end

toc;

%% 每只股票累计收益

StockMat = zeros(length(Bdates),

Len+1);

StockMat(:,1) = Bdates;

for i = 1:Len

StockMat(:,i+1) = StockDataCell{i}(:,5);

end

Ret =

tick2ret(StockMat(:,2:end));

CumRet =

cumprod((1+Ret))-1;

scrsz =

get(0,'ScreenSize');

figure('Position',[scrsz(3)*1/4

scrsz(4)*1/6 scrsz(3)*4/5 scrsz(4)]*3/4);

plot(CumRet,'LineWidth',1.5);

xlim([0,length(Bdates)+1]);

Dates =

StockMat(2:end,1);

LabelSet(gca, Dates, [],

[], 1);

M = StockNameCell;

H = legend(M);

H.Orientation =

'horizontal';

H.FontWeight = 'Bold';

H.FontSize = 12;

H.Location =

'northoutside';

str = '股票累计收益';

H = title(str);

H.FontWeight = 'Bold';

H.FontSize = 15;

(4)子函数编写:特定回顾期的动量计算并作标准化

%% sub fun calc_mom

%

---------------------------------------------------

% calc_mom

% ---------------------------------------------------

function weight =

calc_mom(price,lookback)

weight = zeros(size(price));

weight(:,1) = price(:,1);

[m,n] = size(price);

% weight(1:lookback,2:end) = nan;

weight(1:lookback,2:end) = 0;

for j = lookback+1:m

for i = 2:n

tData = price(:,i);

weight(j,i) =

(tData(j-1)-tData(j-lookback))/tData(j-lookback);

end

temp = weight(j,2:end);

weight(j,2:end) =

(temp-mean(temp))./std(temp);

end

weight(isnan(weight)) = 0;

end

当然这里与Python下稍有不同,就使用标准化后的动量值返回。

(5)子函数编写:给定回顾期和持有期,组合的夏普比例计算

%% sub fun strat_sr

%

---------------------------------------------------

% strat_sr

%

---------------------------------------------------

function SR =

strat_sr(prices, lb, hold)

SR = 0;

[m,n] = size(prices);

% 计算权重

port = calc_mom(prices,lb);

port(isnan(port)) = 0;

% 计算组合收益

PortResample = [];

Returns = [];

Ind = 1;

for i = hold:hold:m

PortResample(Ind,:) = port(i-hold+1,:);

Returns(Ind,:) = prices(i,:);

Returns(Ind,2:end) =

(prices(i,2:end)-prices(i-hold+1,2:end))./prices(i-hold+1,2:end);

Ind = Ind + 1;

end

port_rets = PortResample(:,2:end).*Returns(:,2:end);

port_rets = sum(port_rets,2);

% 计算年化Sharpe

Ratio

SR = mean(port_rets)/std(port_rets)*sqrt(

252/hold );

end

(6)计算不同回顾期和持有期下组合的夏普比例值

%% calc

tic;

lookbacks = 20:5:90;

holdings = 20:5:100;

DD =

zeros(length(lookbacks), length(holdings));

for i =

1:length(lookbacks)

for j = 1:length(holdings)

lb = lookbacks(i);

hold = holdings(j);

DD(i,j) = strat_sr(StockMat, lb, hold);

end

end

toc;

(7)进行策略参数分布图形展示

%% HeatPlot

temp =

num2cell(lookbacks);

temp =

cellfun(@num2str,temp,'UniformOutput',false);

YVarNames = temp;

temp =

num2cell(holdings);

temp =

cellfun(@num2str,temp,'UniformOutput',false);

XVarNames = temp;

XLabelString = 'Holding

Period';

YLabelString = 'Lookack

Period';

Fmatrixplot(DD,'ColorBar','On','XVarNames',XVarNames,'YVarNames',YVarNames,...

'XLabelString',XLabelString,'YLabelString',YLabelString);

通过上图可以看到在此例下,大概回顾期为25-35日,持有期为60日,会获取较高的夏普比率。

总结

本文给出了一个简化的截面动量组合测试,虽然策略比较简单,但整体的测试流程和框架很明了清晰,对类似策略的回测实现具有参考意义,整体的流程框架为:

数据获取(基于付费或者免费的数据源)——》

数据的时间轴对齐以及缺失数据填充——》

子函数编写:特定回顾期的动量计算并作标准化——》

子函数编写:给定回顾期和持有期,组合的夏普比例计算——》

计算不同回顾期和持有期下组合的夏普比例值——》

进行策略参数分布图形展示

在Python下pandas是个数据处理非常不错的一个包,另外在Python下免费的A股数据可以通过tushare 包(作者Jimmy)获取,tushare 包下载地址:TuShare -财经数据接口包。

在MATLAB下,虽然此例的实现测试稍显臃肿,但也不是非常复杂。在MATLAB下免费的A股数据可以通过FQuantToolBox(作者faruto)获取,FQuantToolBox下载地址:FQuantToolBoxHelpOnLine

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯自研分布式远程Shuffle服务Firestorm正式开源

11月4日&#xff0c;在2021腾讯数字生态大会上&#xff0c;腾讯宣布将开源自主研发的分布式远程Shuffle服务Firestorm。该服务的开源不但可以助推分布式计算的云原生部署&#xff0c;还能解决大数据分布式计算过程中的痛点&#xff0c;提升计算资源的利用率。 在分布式计算领域…

Flink 在有赞的实践和应用

简介&#xff1a; 本文介绍了Flink 在有赞的实践和应用&#xff0c;内容包括&#xff1a;Flink 的容器化改造和实践、Flink SQL 的实践和应用、未来规划。 作者&#xff1a;沈磊 一、Flink 的容器化改造和实践 1. 有赞的集群演进历史 2014 年 7 月&#xff0c;第一个 Storm…

用imspost制作catia后处理_这些有趣又精致的模型,都是用3D打印机打印出来的

3D打印已经出现在了生活的方方面面&#xff0c;有相当多别具一格又十分有趣的模型会让你惊艳。今天&#xff0c;小编搜集了一些有趣的3D打印模型&#xff0c;让我们一饱眼福。海边棕榈树来源&#xff1a;Curufin via Cults这个凉爽的棕榈树模型是由几个3D打印模型组合起来实现的…

java 黑窗运行_javaday1 如何使用黑窗口打出helloworld并且要学会使用和环境配置/eclipse...

java 第一天要学会如何使用黑窗口打出helloworld并且要学会使用和环境配置/eclipse其实我是一直都想早点儿写点儿学习笔记的&#xff0c;但是太懒了一直拖到了今天&#xff0c;好吧我已经学习了java一个月了&#xff0c;说一下自己的学习经历&#xff0c;当做一遍复习和巩固了&…

开课吧的python的证书_Python在生活中的几个实用场景,简直太厉害了

如今Python已经成为不少职场人心中的必备技能&#xff0c;他们掌握Python的一些使用方法后&#xff0c;在工作中不仅提高了效率&#xff0c;还获得了老板的嘉奖&#xff0c;可以说是两全其美。但有的人觉得学习Python只能为工作带来一些便捷&#xff0c;生活中Python也可以帮忙…

cdr 表格自动填充文字_做平面广告设计,AI和CDR如何选择?

关于CDR和AI两个软件&#xff0c;很多人都不知道它们有什么区别。今天我就给大家好好整理了一下。不知道两者区别&#xff0c;不知道该选用哪个软件的都来看看下面的AI和CAD教程吧。首先CorelDRAW是一款由世界顶尖软件公司之一的加拿大的Corel公司开发的图形图像软件。其非凡的…

麒麟信安:根植于openEuler,走操作系统自主创新之路

随着信息安全问题日益突出&#xff0c;行业内外也越来越深刻地认识到&#xff0c;核心技术受制于人是我们最大的隐患。而2020年12月8日&#xff0c;CentOS社区宣布CentOS8将于2021年底停止维护&#xff0c;CentOS7将于2024年6月30日停止维护&#xff0c;这一消息的发布&#xf…

Hologres如何支持超高基数UV计算(基于roaringbitmap实现)

简介&#xff1a; 本文将会介绍Hologres基于roaringbitmap实现超高基数的UV计算 RoaringBitmap是一种压缩位图索引&#xff0c;RoaringBitmap自身的数据压缩和去重特性十分适合对于大数据下uv计算。其主要原理如下&#xff1a; 对于32bit数, RoaringBitmap会构造2^16个桶&…

java 两个sql文_Java和SQL取两个字符间的值

JavaString str "abcdefg";String result str.substring(str.indexOf(">")1, str.lastIndexOf("StringUtils.substringBefore(“abcdec”, “c”); 结果是&#xff1a;ab 这里是以第一个”c”为标准。StringUtils.substringBeforeLast(“abcdec”…

阿里云贾扬清:大数据+AI工程化,让数据从「成本」变为「资产」

简介&#xff1a; 近年来&#xff0c;数字经济发展迅速&#xff0c;企业转型背后频频涌现「数字力量」的身影。云计算、大数据、人工智能的快速融合形成了数字经济的新基建&#xff0c;也为数字经济发展带来了新的机遇。 5 月 20 日&#xff0c;阿里巴巴副总裁、阿里云计算平台…

python如何改变数据类型_如何改变numpy数组的数据类型和形状?

数据类型的混合使得这种转换比通常更复杂。最后的答案是&#xff0c;将字段复制到目标数组具有速度和通用性的结合。在让我们构造一个示例&#xff1a;In [850]: dtOut[850]: dtype([(cycle, In [851]: xnp.zeros((3,),dt)In [852]: x[cycle][0,10,23]In [853]: x[dxn][3,2,2]I…

easyexcel 日期类型 convert_数据库的几种日期时间类型,你真的会用吗?

日期和时间是每个系统&#xff0c;每个数据库设计必不可少的部分。也是容易被大家忽视的部分。很多开发者可能根本不了解以不同类型存储日期和时间意味着什么。有朋友可能会说&#xff0c;数据库定义一个datetime或timestamp类型的字段&#xff0c;然后在Java代码中获取当前时间…

从重复到重用

简介&#xff1a; 开发技术的发展&#xff0c;从第一次提出“函数/子程序”&#xff0c;实现代码级重用&#xff1b;到面向对象的“类”&#xff0c;重用数据结构与算法&#xff1b;再到“动态链接库”、“控件”等重用模块&#xff1b;到如今流行的云计算、微服务可重用整个系…

JAVA中randomfile_java中的RandomAccessFile的用法

Java的RandomAccessFile提供对文件的读写功能&#xff0c;与普通的输入输出流不一样的是RamdomAccessFile可以任意的访问文件的任何地方。这就是“Random”的意义所在。RandomAccessFile的对象包含一个记录指针&#xff0c;用于标识当前流的读写位置&#xff0c;这个位置可以向…

官宣|Apache Flink 1.13.0 正式发布,流处理应用更加简单高效!

简介&#xff1a; Flink 1.13.0 版本让流处理应用的使用像普通应用一样简单和自然&#xff0c;并且让用户可以更好地理解流作业的性能。 ​翻译 | 高赟 Review | 朱翥、马国维 Flink 1.13 发布了&#xff01;Flink 1.13 包括了超过 200 名贡献者所提交的 1000 多项修复和优化…

lightning接口_Lightning太赚钱?iPhone永远不会用Type-C

欧盟日前通过了法案&#xff0c;要求在欧洲销售的各手机制造商要统一充电接口&#xff0c;全部采用USB Type-C接口&#xff0c;但这可能让一直使用Lightning(闪电)充电接口的Apple受到很大影响。虽说目前苹果的Mac电脑、iPad平板电脑以及智能音箱等部分产品都开始使用USB Type-…

这个冬天,头秃了,口袋也空了......

秋天里的第一杯奶茶刚喝完&#xff0c;冬天里的第一条秋裤就要安排上&#xff01;不让加班的程序员&#xff0c;从此的生活便不只有脑袋秃秃&#xff0c;还有口袋空空&#xff01;从外包出来&#xff0c;没想到新的面试让我手忙脚乱外包虐我千百遍&#xff0c;只能待她如初恋&a…

云数据仓库的未来趋势:计算存储分离

简介&#xff1a; 随着云时代的到来&#xff0c;数据库也开始拥抱云数据库时代&#xff0c;各类数据库系统在各内外云平台百花齐放&#xff0c;有开源的MySQL、PostgreSQL、MongoDB&#xff0c;传统数据库厂商的SQLServer、Oracle&#xff0c;云厂商自研的Aurora、Redshift、Po…

Java内存配太大导致fullgc_记一次因为短命大对象导致fullGC的问题

写在前面java内存申请和释放均是由jvm在控制。而释放往往会出现各种各样的问题&#xff0c;经常一个引用没处理好就引起内存泄漏&#xff0c;最后引发OOM。如果发生在重要业务系统还可能出现严重的生产事故。 因此内存使用一定要谨慎&#xff0c;特别是引用要及时断链。虽然jvm…

猜数字游戏python123_【趣味数学】可以说谎的猜数字游戏

又是一年找工作的高峰期&#xff0c;各种各样千奇百怪的智力题也在考验着学子们的智商&#xff0c;其中有些题目更是让人脑细胞大量死亡。。。近来有同学问一道&#xff0c;带有说谎的猜数字游戏&#xff0c;问“元芳&#xff0c;这事你怎么看&#xff1f;”&#xff0c;我这想…