コンテンツへスキップ
ライブラリの全資料

Alphalens分析用の合成価格とファクターデータの作成

ノートブック Alphalens

サマリー

このノートブックは、Alphalensが想定する入力データの構造を示し、ファクター分析のための制御された環境を用意するため、人工的な価格とファクターデータを生成します。異なる決定論的な値動きを持つ6つの資産の日次価格を作成し、選択した日付に欠損を含むファクター値を割り当て、資産をグループに分類します。次に、価格を日中の観測値に展開し、ファクターのタイムスタンプを寄り付きに合わせます。

ファクターデータをクリーニングし、複数の期間にわたる先行リターンと組み合わせた後、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()
```
![notebook output](figures/p1_1.png)
![notebook output](figures/p1_2.png)
![notebook output](figures/p1_3.png)
![notebook output](figures/p1_4.png)
![notebook output](figures/p1_5.png)
![notebook output](figures/p1_6.png)
![notebook output](figures/p1_7.png)
![notebook output](figures/p1_8.png)
![notebook output](figures/p1_9.png)
![notebook output](figures/p1_10.png)
![notebook output](figures/p1_11.png)
![notebook output](figures/p1_12.png)
![notebook output](figures/p1_13.png)
![notebook output](figures/p1_14.png)
![notebook output](figures/p1_15.png)
![notebook output](figures/p1_16.png)
![notebook output](figures/p1_17.png)
![notebook output](figures/p1_18.png)

出典を明記したうえで、ライセンスに従って全文を掲載しています。 ライセンス: Apache-2.0

この要約は原文をもとにStratmillのリサーチエージェントが作成したもので、出典の複製ではありません。