平时主要关注tick、分钟频,今天偶然做一些日频的工作,便直接参考了东北证券的研报《Alphalens使用教程》(2017-12-06)。
下文的示例中使用的模拟数据,将使用的数据转换成类似的格式即可。
示例中使用alphalens版本是0.4.0
# -*- coding: utf-8 -*-
# @Time :2021/9/18 13:26
# @Author :百载文枢江左
import alphalens
import pandas as pd
import random
import warnings
warnings.filterwarnings('ignore')
if __name__ == '__main__':
# 模拟的交易日期序列
trade_date_ls = pd.date_range('1/1/2010', '31/3/2020').tolist()
# 模拟的股票代码序列
stock_id_ls = [f"{'0' * (6 - len(str(i)))}{i}.SZ" for i in range(2000)]
# 输入因子矩阵
factor_ls = []
for trade_date in trade_date_ls:
for stock_id in stock_id_ls:
factor_ls.append([trade_date, stock_id, random.random() / 100])
factor = pd.DataFrame(factor_ls, columns=['trade_date', 'stock_id', 'factor1'])
factor = factor.set_index(['trade_date', 'stock_id'])
# 输入价格矩阵
prices_ls = []
for trade_date in trade_date_ls:
tmp = [random.random() / 100 for _ in range(len(stock_id_ls))]
tmp.append(trade_date)
prices_ls.append(tmp)
prices = pd.DataFrame(prices_ls, columns=['trade_date' if i == len(stock_id_ls) else stock_id_ls[i] for i in range(len(stock_id_ls) + 1)])
prices = prices.set_index(['trade_date'])
# periods表示调仓周期
# bins表示分组数量
input_df = alphalens.utils.get_clean_factor_and_forward_returns(factor, prices, periods=(1, 5, ), bins=10, quantiles=None)
alphalens.tears.create_information_tear_sheet(input_df)
alphalens.tears.create_returns_tear_sheet(input_df)