因子分析(by+alphalens)

目录Alphalens是什么?

使用Alphalens的数据准备工作?

如何用Alphalens测试选股因子效果?

什么是信息系数?

如何通过信息系数的可视化呈现进一步观测因子效果?

更多:因子在不同板块的选股能力比较分析

Alphalen是什么?

Alphalens是一个Python第三方库,专门用于选股因子alpha(α)的绩效分析。因子:

对股价未来涨跌有预测效果的指标

下载方式: pip install alphalens==0.2.1

使用Alphalens的数据准备工作?factor: MultiIndex(用stack()方法来转换)

prices: DataFrame

索引要求均为日期-datetime日期格式

将以上数据通过alphalens处理成标准格式-factor_data 用于进一步分析

下面以沪深300成分股为例,构造选股因子(factor)并

fromjaqs_fxdayu.dataimportDataView# 可以视为一个轻量级的数据库,数据格式基于pandas,方便数据的调用和处理

fromjaqs_fxdayu.dataimportRemoteDataService# 数据服务,用于下载数据

importos

importwarnings

warnings.filterwarnings("ignore")

dataview_folder='../Factor'

ifnot(os.path.isdir(dataview_folder)):

os.makedirs(dataview_folder)

# 数据下载

defsave_dataview():

data_config={

"remote.data.address":"tcp://data.quantOS.org:8910",

"remote.data.username":"18566262672",

"remote.data.password":"eyJhbGciOiJIUzI1NiJ9.eyJjcmVhdGVfdGltZSI6IjE1MTI3MDI3NTAyMTIiLCJpc3MiOiJhdXRoMCIsImlkIjoiMTg1NjYyNjI2NzIifQ.O_-yR0zYagrLRvPbggnru1Rapk4kiyAzcwYt2a3vlpM"

}

ds=RemoteDataService()

ds.init_from_config(data_config)

dv=DataView()

props={'start_date':20140101,'end_date':20140201,'universe':'000300.SH',

'fields':"pb,pe,ps,float_mv,sw1",

'freq':1}

dv.init_from_config(props,ds)

dv.prepare_data()

dv.save_dataview(dataview_folder)# 保存数据文件到指定路径,方便下次直接加载

# save_dataview()

# 加载数据

dv=DataView()

dv.load_dataview(dataview_folder)Dataview loaded successfully.

dv.fields['low_adj',

'index_weight',

'ps',

'index_member',

'close_adj',

'high_adj',

'sw1',

'float_mv',

'high',

'open_adj',

'vwap_adj',

'pb',

'open',

'pe',

'vwap',

'close',

'adjust_factor',

'low',

'trade_status']

importpandasaspd

fromdatetimeimportdatetime

factor=dv.get_ts("pb")

factor.index=pd.Index(map(lambdax:datetime.strptime(str(x),"%Y%m%d"),factor.index))#索引调整为datetime日期格式

factor=factor.stack()#处理成MultiIndex格式(alphalens分析因子必须的格式)

factor.head()symbol

2014-01-02 000001.SZ 1.0563

000002.SZ 1.2891

000008.SZ 4.8981

000009.SZ 3.5794

000012.SZ 2.3725

dtype: float64

defchange_index(df):

df.index=pd.Index(map(lambdax:datetime.strptime(str(x),"%Y%m%d"),df.index))#索引调整为datetime日期格式

returndf

prices=dv.get_ts("close_adj")#获取价格

prices=change_index(prices)

prices.head()symbol

000001.SZ

000002.SZ

000008.SZ

000009.SZ

000012.SZ

000024.SZ

000027.SZ

000039.SZ

000046.SZ

000059.SZ

...

601998.SH

603000.SH

603160.SH

603288.SH

603699.SH

603799.SH

603833.SH

603858.SH

603885.SH

603993.SH

2014-01-02

685.432796

869.28004

54.679500

57.244120

155.894015

97.545898

45.840241

348.968736

130.848969

7.635187

...

4.617178

79.318951

NaN

NaN

NaN

NaN

NaN

NaN

NaN

6.541196

2014-01-03

668.619236

852.96064

54.375725

55.721670

153.407362

95.883723

44.750802

354.379104

128.507153

7.359216

...

4.545408

78.055589

NaN

NaN

NaN

NaN

NaN

NaN

NaN

6.438347

2014-01-06

654.047484

813.79408

51.702505

55.234486

144.799717

90.754728

43.745166

342.656640

126.458064

7.006587

...

4.473638

77.762489

NaN

NaN

NaN

NaN

NaN

NaN

NaN

6.191510

2014-01-07

651.805676

808.35428

50.973445

55.112690

144.034593

88.760118

43.577560

353.026512

124.408975

6.883933

...

4.461677

79.743441

NaN

NaN

NaN

NaN

NaN

NaN

NaN

6.191510

2014-01-08

659.091552

807.26632

50.001365

54.138322

143.652031

86.338093

44.080378

351.448488

126.165337

6.853270

...

4.473638

81.865890

NaN

NaN

NaN

NaN

NaN

NaN

NaN

6.098946

5 rows × 472 columns

importalphalens

#计算目标股票池每只股票的持有期收益,和对应因子值的quantile分类

factor_data=alphalens.utils.get_clean_factor_and_forward_returns(factor,prices,quantiles=5,periods=(1,5,10))

factor_data.head()1

5

10

factor

factor_quantile

date

asset

2014-01-02

000001.SZ

-0.024530

-0.033524

-0.044154

1.0563

1

000002.SZ

-0.018773

-0.066333

-0.100125

1.2891

2

000008.SZ

-0.005556

-0.102222

-0.054444

4.8981

4

000009.SZ

-0.026596

-0.075532

-0.057447

3.5794

4

000012.SZ

-0.015951

-0.093252

-0.039264

2.3725

3

如何用Alphalens测试选股因子效果?demeaned:是否计算相对收益(减去当日所有assets持有期收益的均值)

累计收益计算方法:日化复利再逐日累乘-无法根据该方式复制投资组合

importmatplotlib.pyplotasplt

mean_return_by_q,std_err_by_q=alphalens.performance.mean_return_by_quantile(factor_data,by_date=True,demeaned=True)

alphalens.plotting.plot_cumulative_returns_by_quantile(mean_return_by_q,1)

alphalens.plotting.plot_cumulative_returns_by_quantile(mean_return_by_q,5)

alphalens.plotting.plot_cumulative_returns_by_quantile(mean_return_by_q,10)

plt.show()

什么是信息系数?

度量变量的预测值与实际值之间的相关关系。信息系数是用来评估金融分析师预测技能的一种表现方法。

系数在-1到1之间,越大表示正相关程度强。

这里,我们可以用信息系数来评价一个选股因子效力的好坏。也即,用因子值大小与下一期股票收益大小的相关程度来评估因子。

经验来看,通常|mean(IC)|>0.02可以作为判定一个选股因子有收益预测效力的标准

什么是spearman相关系数?

其中d为秩次差。

什么是秩次差?

A = [1,3,5,7,9]

B = [3,2,4,5,1]

A的排序是1,2,3,4,5

B的排序是3,2,4,5,1

d为排序相减

接下来我们要计算的因子IC值,即为当期因子值与下期股票收益值的spearman相关系数。

ic=alphalens.performance.factor_information_coefficient(factor_data)

ic.head()1

5

10

date

2014-01-02

0.325364

0.372408

0.346461

2014-01-03

0.094661

0.233455

0.287933

2014-01-06

0.211379

0.156397

0.210309

2014-01-07

0.375963

0.150975

0.144572

2014-01-08

-0.029050

0.167510

0.014627

如何通过信息系数的可视化呈现进一步观测因子效果?

alphalens.plotting.plot_ic_hist(ic)#因子IC分布

alphalens.plotting.plot_ic_ts(ic)#因子IC时间序列曲线

plt.show()

# 月均IC热度图

mean_monthly_ic=alphalens.performance.mean_information_coefficient(factor_data,by_time='M')

alphalens.plotting.plot_monthly_ic_heatmap(mean_monthly_ic)#因子月均IC表现

plt.show()

将Quantile1的选股结果保存成excel

importnumpyasnp

excel_data=factor_data[factor_data['factor_quantile']==1]["factor_quantile"].unstack().replace(np.nan,0)

excel_data.to_excel('./pb_quantile_1_by_alphalens.xlsx')

excel_data.head()asset

000001.SZ

000002.SZ

000024.SZ

000027.SZ

000039.SZ

000059.SZ

000063.SZ

000069.SZ

000157.SZ

000338.SZ

...

601898.SH

601901.SH

601918.SH

601939.SH

601985.SH

601988.SH

601991.SH

601992.SH

601997.SH

601998.SH

date

2014-01-02

1.0

0.0

0.0

1.0

0.0

1.0

0.0

0.0

1.0

0.0

...

1.0

0.0

1.0

1.0

0.0

1.0

0.0

1.0

0.0

1.0

2014-01-03

1.0

0.0

0.0

1.0

0.0

1.0

0.0

0.0

1.0

0.0

...

1.0

0.0

1.0

1.0

0.0

1.0

0.0

1.0

0.0

1.0

2014-01-06

1.0

0.0

0.0

1.0

0.0

1.0

0.0

0.0

1.0

0.0

...

1.0

0.0

1.0

1.0

0.0

1.0

0.0

1.0

0.0

1.0

2014-01-07

1.0

0.0

0.0

1.0

0.0

1.0

0.0

0.0

1.0

0.0

...

1.0

0.0

1.0

1.0

0.0

1.0

0.0

1.0

0.0

1.0

2014-01-08

1.0

0.0

0.0

1.0

0.0

1.0

0.0

0.0

1.0

0.0

...

1.0

0.0

1.0

1.0

0.0

1.0

0.0

1.0

0.0

1.0

5 rows × 192 columns

更多:因子在不同板块的选股能力比较分析通过groupby参数指定每只股票对应的行业(按行业分组)

构造factor_data

计算不同行业的平均IC,并可视化呈现

sectors=dv.get_ts("sw1")

sectors=change_index(sectors)

sectors.head()symbol

000001.SZ

000002.SZ

000008.SZ

000009.SZ

000012.SZ

000024.SZ

000027.SZ

000039.SZ

000046.SZ

000059.SZ

...

601998.SH

603000.SH

603160.SH

603288.SH

603699.SH

603799.SH

603833.SH

603858.SH

603885.SH

603993.SH

2014-01-02

银行

房地产

休闲服务

综合

建筑材料

房地产

公用事业

机械设备

房地产

化工

...

银行

传媒

电子

食品饮料

机械设备

有色金属

轻工制造

医药生物

交通运输

有色金属

2014-01-03

银行

房地产

休闲服务

综合

建筑材料

房地产

公用事业

机械设备

房地产

化工

...

银行

传媒

电子

食品饮料

机械设备

有色金属

轻工制造

医药生物

交通运输

有色金属

2014-01-06

银行

房地产

休闲服务

综合

建筑材料

房地产

公用事业

机械设备

房地产

化工

...

银行

传媒

电子

食品饮料

机械设备

有色金属

轻工制造

医药生物

交通运输

有色金属

2014-01-07

银行

房地产

休闲服务

综合

建筑材料

房地产

公用事业

机械设备

房地产

化工

...

银行

传媒

电子

食品饮料

机械设备

有色金属

轻工制造

医药生物

交通运输

有色金属

2014-01-08

银行

房地产

休闲服务

综合

建筑材料

房地产

公用事业

机械设备

房地产

化工

...

银行

传媒

电子

食品饮料

机械设备

有色金属

轻工制造

医药生物

交通运输

有色金属

5 rows × 472 columns

factor_data=alphalens.utils.get_clean_factor_and_forward_returns(factor,

prices,

groupby=sectors.stack(),

quantiles=5,

periods=(1,5,10))

factor_data.head()1

5

10

factor

group

factor_quantile

date

asset

2014-01-02

000001.SZ

-0.024530

-0.033524

-0.044154

1.0563

银行

1

000002.SZ

-0.018773

-0.066333

-0.100125

1.2891

房地产

2

000008.SZ

-0.005556

-0.102222

-0.054444

4.8981

休闲服务

4

000009.SZ

-0.026596

-0.075532

-0.057447

3.5794

综合

4

000012.SZ

-0.015951

-0.093252

-0.039264

2.3725

建筑材料

3

ic_by_sector=alphalens.performance.mean_information_coefficient(factor_data,by_group=True)

ic_by_sector.head()1

5

10

group

交通运输

-0.054600

-0.076287

-0.101861

休闲服务

-0.008219

-0.047374

-0.066913

传媒

-0.034612

-0.043479

-0.047153

公用事业

-0.029263

-0.038912

-0.046744

农林牧渔

-0.023074

-0.033296

-0.043930

frommatplotlibimportpyplotasplt

alphalens.plotting.plot_ic_by_group(ic_by_sector)

plt.show()

用python做股票因子分析_因子分析(by+alphalens)相关推荐

  1. python做股票分析_利用Python进行股票投资组合分析(调试)

    pythonsp500-robo-advisor-edition Python for Financial Analyses 需要的镜像文件和数据--Robo Advisor edition. 小结 ...

  2. python股票量化交易入门到实践_量化资料学习《Python与量化投资从基础到实战》+《量化交易之路用Python做股票量化分析》+《组织与管理研究的实证方法第2版》...

    我们需要利用Python进行数据分析的指南,有大量的关于数据处理分析的应用,重点学习如何高效地利用Python解决投资策略问题,推荐学习<Python与量化投资从基础到实战>等电子资料. ...

  3. 用 Python 做股票指标分析和 OBV, 真香

    近几年,Python的热度一直在涨,它的应用领域也非常广泛:自动化测试,Devops运维,爬虫工程师,Web开发,数据分析,机器学习等,不过 Python 还有一个神秘而有趣的应用领域,那就是量化交易 ...

  4. 用Python做股票量化分析[附量化交易学习资料]

    量化交易的核心是筛选策略,策略也是依靠数学或物理模型来创造,把数学语言变成计算机语言.量化交易的流程是从数据的获取到数据的分析.处理. import pandas as pd import talib ...

  5. python 股票 因子分析_因子分析1.-Python数据科学技术详解与商业项目实战精讲 - Python学习网...

    因子分析1.因子分析1. 获取单个数据 获取单个数据的方法包括:// 取出主键为1的数据 $user = User::find(1); echo $user->name; // 使用查询构造器查 ...

  6. 我用python做股票_十分钟学会用Python交易股票

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 本文通过讲述 [单股票均线策略] 在 Ricequant 量化平台的实现,熟悉平台并快速入门.创建自己的量化策略代码 .难易度:入门级.从一下几点说起: ...

  7. 用python进行股票数据分析_利用python进行股票数据分析

    个人觉得这问题问的不太对,说句不好的话,你是来搞编程的还是做股票的. 当然,如果题主只是用来搜集资料,看数据的话那还是可以操作一波的,至于python要怎么入门,个人下面会推荐一些入门级的书籍,通过这 ...

  8. 用python做自我介绍_用python做个自我介绍(python入门教程)_逻辑教育

    原标题:用python做个自我介绍(python入门教程)_逻辑教育 本文涉及的python基础语法为:数据类型等 数字类型 1. 字符串的拼接 我们在上一章中已经简单介绍了一下字符串的创建方式,这里 ...

  9. python做数学计算器_从零开始学习PYTHON3讲义(二)把Python当做计算器

    <从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...

  10. 一步一步教你如何用python做词云_一步一步教你如何用Python做词云

    前言 在大数据时代,你竟然会在网上看到的词云,例如这样的. 看到之后你是什么感觉?想不想自己做一个? 如果你的答案是正确的,那就不要拖延了,现在我们就开始,做一个词云分析图,Python是一个当下很流 ...

最新文章

  1. Nat. Commun.|概率蛋白质序列模型的生成能力
  2. 为什么Kafka中的分区数只能增加不能减少?
  3. 使用 x3dom 框架及 WebGL 在浏览器上显示 3 维模型
  4. My Linux 让人高兴的新进展(博客搬家 2007-07-14 13:05)
  5. vue中页面跳转传值_vue的页面跳转方式和传值、取值
  6. ITK:将颜色贴图应用于图像
  7. spark中的println失效问题解决
  8. 一些奇妙的线段树操作
  9. 复习HTML CSS(2)
  10. python 三引号_入门Python 必备知识基础(一)
  11. Python练习:百分制到五级制的转换
  12. In your eyes, what is Jobs‘ best product?
  13. C#网络编程之 UDP编程
  14. 数据结构--数组+链表实现哈希表
  15. access mysql 操作方法_设置和取消Access数据库密码-图解教程
  16. 最全中文停用词表整理(1893个)
  17. 蓝桥杯青少年创意编程大赛 scratch python C++ 资料集(2022.07.08)
  18. Unity实现瞄准镜效果
  19. mysql 组织结构 支持_如何优化MySQL索引组织结构
  20. 12 张图看懂 CPU 缓存一致性与 MESI 协议,真的一致吗?

热门文章

  1. 文法规则自顶向下分析
  2. Linux中使用 if 、for、while等循环来写脚本
  3. java maven 配置环境变量_maven 环境变量的配置详解
  4. STM32 USB Host 鼠标和键盘驱动 -- 原创
  5. 蓝桥杯嵌入式旧版子驱动问题-keil5下载卡死解决方法
  6. 误用分区助手的沉痛教训
  7. Matlab与灰色模型预测
  8. 高斯过程回归matlab,高斯过程回归及其应用.PDF
  9. 游戏修改服务器数据,修改游戏服务器数据的教程
  10. android官方原生主题,原生Android可以更换系统主题吗?