构建合成价格与因子数据进行 Alphalens 分析
笔记本 Alphalens
总结
此笔记本构造人工价格和因子数据,以展示 Alphalens 所需的输入结构,并为因子分析提供可控环境。它为六种资产创建具有不同确定性走势的每日价格,在选定日期赋予因子值并设置缺失观测,还将资产映射到不同组别。随后,它将价格扩展为日内观测,并将因子时间戳与开盘时间对齐。
因子数据经过清理后,与多个期限的前瞻收益率配对,随后使用 Alphalens 分析报告考察收益、信息、换手率和事件表现。笔记本还对多空投资组合重复分析,并启用组中性设置,以展示评估设置和分组处理如何影响报告。由于价格和因子值都是合成数据且经过刻意设计,输出适用于学习工作流程和输入惯例,不能用于推断真实市场表现或验证可交易信号。该示例也未纳入真实的成本和市场摩擦。
核心观点
- 合成价格表和因子表可展示 Alphalens 所需的数据格式。
- 可根据每日价格构造日内时间戳,以研究不同期限的前瞻收益率。
- 示例数据集包含因子观测缺失和资产分组。
- Alphalens 分析报告可评估因子收益、信息、换手率和事件表现。
- 多空和组中性设置可从不同角度分析同一组合成因子数据。
标签
全文
# Synthetic data examples
# Synthetic data examples
In this Notebook we will build synthetic data suitable to Alphalens analysis. This is useful to understand how Alphalens expects the input to be formatted and also it is a good testing environment to experiment with Alphalens.
```python
import matplotlib.pyplot as plt
import pandas as pd
from numpy import nan
from pandas import (DataFrame, date_range)
from alphalens.tears import (create_returns_tear_sheet,
create_information_tear_sheet,
create_turnover_tear_sheet,
create_summary_tear_sheet,
create_full_tear_sheet,
create_event_returns_tear_sheet,
create_event_study_tear_sheet)
from alphalens.utils import get_clean_factor_and_forward_returns
```
```python
#
# build price
#
price_index = date_range(start='2015-1-10', end='2015-2-28')
price_index.name = 'date'
tickers = ['A', 'B', 'C', 'D', 'E', 'F']
data = [[1.0025**i, 1.005**i, 1.00**i, 0.995**i, 1.005**i, 1.00**i]
for i in range(1, 51)]
base_prices = DataFrame(index=price_index, columns=tickers, data=data)
#
# build factor
#
factor_index = date_range(start='2015-1-15', end='2015-2-13')
factor_index.name = 'date'
factor = DataFrame(index=factor_index, columns=tickers,
data=[[3, 4, 2, 1, nan, nan], [3, nan, nan, 1, 4, 2],
[3, 4, 2, 1, nan, nan], [3, 4, 2, 1, nan, nan],
[3, 4, 2, 1, nan, nan], [3, 4, 2, 1, nan, nan],
[3, nan, nan, 1, 4, 2], [3, nan, nan, 1, 4, 2],
[3, 4, 2, 1, nan, nan], [3, 4, 2, 1, nan, nan],
[3, nan, nan, 1, 4, 2], [3, nan, nan, 1, 4, 2],
[3, nan, nan, 1, 4, 2], [3, nan, nan, 1, 4, 2],
[3, nan, nan, 1, 4, 2], [3, nan, nan, 1, 4, 2],
[3, nan, nan, 1, 4, 2], [3, nan, nan, 1, 4, 2],
[3, nan, nan, 1, 4, 2], [3, nan, nan, 1, 4, 2],
[3, 4, 2, 1, nan, nan], [3, 4, 2, 1, nan, nan],
[3, 4, 2, 1, nan, nan], [3, 4, 2, 1, nan, nan],
[3, 4, 2, 1, nan, nan], [3, 4, 2, 1, nan, nan],
[3, 4, 2, 1, nan, nan], [3, 4, 2, 1, nan, nan],
[3, nan, nan, 1, 4, 2], [3, nan, nan, 1, 4, 2]])
factor_groups = {'A': 'Group1', 'B': 'Group2', 'C': 'Group1', 'D': 'Group2', 'E': 'Group1', 'F': 'Group2'}
```
```python
base_prices.plot()
plt.show()
```
```python
base_prices.head()
```
```python
# create artificial intraday prices
today_open = base_prices.copy()
today_open.index += pd.Timedelta('9h30m')
# every day, after 1 hour from open all stocks increase by 0.1%
today_open_1h = today_open.copy()
today_open_1h.index += pd.Timedelta('1h')
today_open_1h += today_open_1h*0.001
# every day, after 3 hours from open all stocks decrease by 0.2%
today_open_3h = today_open.copy()
today_open_3h.index += pd.Timedelta('3h')
today_open_3h -= today_open_3h*0.002
# prices DataFrame will contain all intraday prices
prices = pd.concat([today_open, today_open_1h, today_open_3h]).sort_index()
```
```python
prices.head(10)
```
```python
prices.plot()
plt.show()
```
```python
# Align factor to open price
factor.index += pd.Timedelta('9h30m')
factor = factor.stack()
factor.index = factor.index.set_names(['date', 'asset'])
```
```python
factor.head(10)
```
```python
# Period 1: today open to open + 1 hour
# Period 2: today open to open + 3 hours
# Period 3: today open to next day open
# Period 6: today open to 2 days open
factor_data = get_clean_factor_and_forward_returns(
factor,
prices,
groupby=factor_groups,
quantiles=4,
periods=(1, 2, 3, 6),
filter_zscore=None)
```
```python
factor_data.head(10)
```
```python
create_full_tear_sheet(factor_data, long_short=False, group_neutral=False, by_group=False)
create_event_returns_tear_sheet(factor_data, prices, avgretplot=(3, 11),
long_short=False, group_neutral=False, by_group=False)
plt.show()
```
```python
create_full_tear_sheet(factor_data, long_short=True, group_neutral=False, by_group=True)
create_event_returns_tear_sheet(factor_data, prices, avgretplot=(3, 11),
long_short=True, group_neutral=False, by_group=True)
plt.show()
```
```python
create_full_tear_sheet(factor_data, long_short=True, group_neutral=True, by_group=True)
create_event_returns_tear_sheet(factor_data, prices, avgretplot=(3, 11),
long_short=True, group_neutral=True, by_group=True)
plt.show()
```

















在遵守原作品许可的前提下,附作者信息全文展示。 许可协议: Apache-2.0
此摘要由 Stratmill 研究智能体根据原文撰写,并非原文副本。