广告:本人的单因子测试视频教程https://edu.csdn.net/course/detail/25572
近一个半月疯狂的接触多因子模型,其中对于单个因子的回测,是最熟的。而对于单个因子,或者叫做signal(这一系列文章后续都这么叫),是多因子模型的基础。当然,如果你认为,世界上没有alpha,那么只要bet style或者industry就可以了,也不需要寻找alpha。
这一系列的教程,我们将从一个因子开始,最简单的因子,revs10,也就是,十天收益率。这个教程,注重的是整个signal测试的框架,包含两个方面,测试的思路和软件的平台建设,而我们的因子是否好,其实不是我们关注的点。
首先,我们有好多的csv文件,一个文件对应于一个股票的交易行情数据,我们用的是daily的行情数据。
我们有好多csv文件。csv文件有一个好处就是可以增量增加。
随意打开一个csv文件,里面的内容大致如下,当然,这不是必须的,可以增加,也可以减少。注意到,其实这里的openinterest是一个没有用的记录,所有的数值都是0,当然,如果读者需要,那么可以自己加。总而言之,我们需要每个交易日有每个股票的一个记录。首先说明的是,这一系列的教程,由于仅仅是一个教程,所以我们随意选取了50个股票作为我们的选股池,也就是我们的universe,这是出于计算量大小的考虑,毕竟笔者将在自己使用多年的笔记本上完成这一系列的工作。
我们的因子叫做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累计相乘。
其实,多因子模型的第一步就是这么简单。当然,这个因子是最简单的一个因子了,别的因子会用到别的数据,无论如何,核心的一步就是,千方百计计算好你的因子值,然后存下来。