欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多因子模型之因子(信号)测试平台----计算因子值

程序员文章站 2022-07-13 15:18:05
...

        近一个半月疯狂的接触多因子模型,其中对于单个因子的回测,是最熟的。而对于单个因子,或者叫做signal(这一系列文章后续都这么叫),是多因子模型的基础。当然,如果你认为,世界上没有alpha,那么只要bet style或者industry就可以了,也不需要寻找alpha。

1.我们开始的数据

这一系列的教程,我们将从一个因子开始,最简单的因子,revs10,也就是,十天收益率。这个教程,注重的是整个signal测试的框架,包含两个方面,测试的思路和软件的平台建设,而我们的因子是否好,其实不是我们关注的点。
首先,我们有好多的csv文件,一个文件对应于一个股票的交易行情数据,我们用的是daily的行情数据。
多因子模型之因子(信号)测试平台----计算因子值我们有好多csv文件。csv文件有一个好处就是可以增量增加。
随意打开一个csv文件,里面的内容大致如下,当然,这不是必须的,可以增加,也可以减少。注意到,其实这里的openinterest是一个没有用的记录,所有的数值都是0,当然,如果读者需要,那么可以自己加。总而言之,我们需要每个交易日有每个股票的一个记录。首先说明的是,这一系列的教程,由于仅仅是一个教程,所以我们随意选取了50个股票作为我们的选股池,也就是我们的universe,这是出于计算量大小的考虑,毕竟笔者将在自己使用多年的笔记本上完成这一系列的工作。
多因子模型之因子(信号)测试平台----计算因子值

2.计算因子值

我们的因子叫做revs10,说白了就是十天的收益率的值。

res10(t) = close(t) / close(t - 10) - 100%
公式大概就是上面这样。
我们的所以stock的csv文件存放在price_data这个文件夹下面,所以,我们需要把因子值计算出来,然后再放到这个文件下面,笔者采用的是直接覆盖。
import pandas as pd
univers = ['000156.SZ.csv', '000157.SZ.csv', '000166.SZ.csv', '000333.SZ.csv',
           '000338.SZ.csv', '000402.SZ.csv', '000413.SZ.csv', '000415.SZ.csv',
           '000423.SZ.csv', '000425.SZ.csv', '000503.SZ.csv', '000538.SZ.csv',
           '000540.SZ.csv', '000555.SZ.csv', '000559.SZ.csv', '000568.SZ.csv',
           '000623.SZ.csv', '000625.SZ.csv', '000627.SZ.csv', '000630.SZ.csv',
           '000651.SZ.csv', '000671.SZ.csv', '000686.SZ.csv', '000709.SZ.csv',
           '000712.SZ.csv', '000718.SZ.csv', '000725.SZ.csv', '000728.SZ.csv',
           '000738.SZ.csv', '000750.SZ.csv', '000768.SZ.csv', '000776.SZ.csv',
           '000778.SZ.csv', '000783.SZ.csv', '000792.SZ.csv', '000793.SZ.csv',
           '000800.SZ.csv', '000826.SZ.csv', '000839.SZ.csv', '000858.SZ.csv',
           '000876.SZ.csv', '000895.SZ.csv', '000917.SZ.csv', '000938.SZ.csv',
           '000963.SZ.csv', '000977.SZ.csv', '000983.SZ.csv', '001979.SZ.csv',
           '002007.SZ.csv', '002008.SZ.csv']
# REVS10
for stock_file_name in univers:
    stock_data = pd.read_csv('./price_data/%s' % stock_file_name, index_col=0, parse_dates=True)
    stock_data['raw_factor'] = stock_data['close'].rolling(11).apply(lambda x: x[-1] / x[0] - 1)
    stock_data.dropna(inplace=True)
    stock_data.to_csv('./price_data/%s' % stock_file_name)

这样,我们就可以把因子值给计算出来。但是,这里存在很多的问题。
1.停牌怎么处理
2.价格数据的复权问题
3.停牌时,所谓的十天收益率的十天怎么定义?包含十个交易日还是,把停牌也计入十天?
这些都是存在争论的问题。对于第二个问题,其实有一个比较曲线救国,避免股票价格复权的问题,就是尽可能用daily return来算。譬如,计算十日收益率,我们不用上面笔者程序里面这样价格的计算方法,而是用十天的return累计相乘。

        其实,多因子模型的第一步就是这么简单。当然,这个因子是最简单的一个因子了,别的因子会用到别的数据,无论如何,核心的一步就是,千方百计计算好你的因子值,然后存下来。