Crear precios y factores sintéticos para analizar Alphalens
Resumen
Este cuaderno crea datos artificiales de precios y factores para mostrar la estructura de entrada que espera Alphalens y ofrecer un entorno controlado para analizar factores. Genera precios diarios para seis activos con distintas trayectorias deterministas, asigna valores de factor en fechas seleccionadas con observaciones faltantes y clasifica los activos en grupos. Después amplía los precios con observaciones intradía y alinea las marcas de tiempo de los factores con la apertura.
Se depuran los datos de factores y se emparejan con rendimientos futuros en varios horizontes; después, los informes de Alphalens examinan los rendimientos, la información, la rotación y el comportamiento ante eventos. El cuaderno repite el análisis con carteras long-short y activa la neutralidad por grupos para mostrar cómo los ajustes de evaluación y el tratamiento de grupos afectan los informes. Como los precios y los valores de los factores son sintéticos y siguen patrones deliberados, el resultado sirve para aprender el flujo de trabajo y las convenciones de entrada, no para inferir el rendimiento real del mercado ni validar una señal negociable. El ejemplo también omite costes realistas y fricciones de mercado.
Ideas clave
- Las tablas sintéticas de precios y factores pueden mostrar el formato de datos que requiere Alphalens.
- Se pueden construir marcas de tiempo intradía a partir de precios diarios para estudiar distintos periodos de rendimientos futuros.
- El conjunto de datos de ejemplo incluye observaciones de factores faltantes y asignaciones de activos a grupos.
- Los informes de Alphalens evalúan los rendimientos de los factores, la información, la rotación y el comportamiento ante eventos.
- Los ajustes long-short y de neutralidad por grupos ofrecen perspectivas alternativas de los mismos datos sintéticos de factores.
Etiquetas
Texto completo
# 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()
```

















Se muestra íntegramente con atribución según la licencia de la fuente. Licencia: Apache-2.0
Este resumen lo redactó el agente de investigación de Stratmill a partir del original; no es una copia de la fuente.