Python 动态日期时间段
Python dynamic datetime periods
我正在编写一个 HAR-RV 波动率模型,我在其中回归每日、每周和每月数据以预测明天的每日波动率。我有 6 年的每日数据,我想对其进行回测。起初,我认为这会很简单——我使用 pandas asfreq 将我的每日数据转换为每周和每月,以计算每日、每周和每月 pct_change 以开始分析。问题是我试图在 python 中找到一个函数,该函数允许我为每个每日数据点计算每月和每周 pct_change,以便在 2015 年 1 月 24 日我将有一周的开始2015 年 1 月 17 日(-7 天)和 2014 年 12 月 25 日(-30 天)开始的月份以及每日数据点 15 年 1 月 23 日我将在 2015 年 1 月 16 日(-7 天)和月份开始一周从 2014 年 12 月 24 日开始(-30 天)等
但是,通过使用 asfreq('W') 和 asfreq('M') 我每个月获得 31 个每日数据点(好)每个月 1 个月度数据点(不好)每个月有 4 个每周数据点(不好)。我每个月需要31个日点,31个周点,31个月点。
关于如何为每个每日日期时间实现相应的每周和每月 pct_change 的任何指导?这是我目前使用的代码:
import pandas as pd
import numpy as np
from zipline.data.loader import load_bars_from_yahoo
start = pd.Timestamp('2009-07-26')
end = pd.Timestamp('2015-01-18')
data = zp.utils.factory.load_from_yahoo(
stocks=['USO'],
start=start,
end=end,
)
daily = data
weekly = daily.asfreq('W-FRI')
monthly = daily.asfreq('M')`
asfreq
方法用于重新索引 您的数据。也就是说,它在不同的时间段对它进行分类。
您要做的是计算滚动 统计数据。
http://pandas.pydata.org/pandas-docs/stable/computation.html#moving-rolling-statistics-moments
这是一个使用自定义 lambda 函数和 rolling_apply
的实现,它似乎可以满足您的要求:
from pandas import Series, date_range
import numpy as np
# Generate some synthetic price data
ts = pd.Series(np.random.randn(1000), index=date_range('1/1/2000', periods=1000))
ts = ts.cumsum() + 100
ts.plot()
# Define a function to calculate percent change over an x-day period
rollingChange = lambda x: 100*(x[-1]-x[0])/x[0]
# Use rolling_apply to calculate 7 and 30 day rolling prcnt_change
week = pd.rolling_apply(ts, 7, rollingChange)
month = pd.rolling_apply(ts, 30, rollingChange)
这里是一个 nbviewer link 以获取更多详细信息:
http://nbviewer.ipython.org/gist/twowheelmotion/70e8f114b208c194ac8b
假设您已按顺序将收盘价 ('adj_close') 调整为一列,您可以执行如下操作。
df['daily_performance'] = df.groupby('Ticker').adj_close.pct_change().fillna(0)
df['5_day_performance'] = df.groupby('Ticker').adj_close.pct_change(periods=5).fillna(0)
df['21_day_performance'] = df.groupby('Ticker').adj_close.pct_change(periods=21).fillna(0)
如果你没有包含多只股票的代码列,你可以去掉"groupby('Ticker)。平均每个月5 days/week和21个交易日,因此,上面的 5 和 21。
我正在编写一个 HAR-RV 波动率模型,我在其中回归每日、每周和每月数据以预测明天的每日波动率。我有 6 年的每日数据,我想对其进行回测。起初,我认为这会很简单——我使用 pandas asfreq 将我的每日数据转换为每周和每月,以计算每日、每周和每月 pct_change 以开始分析。问题是我试图在 python 中找到一个函数,该函数允许我为每个每日数据点计算每月和每周 pct_change,以便在 2015 年 1 月 24 日我将有一周的开始2015 年 1 月 17 日(-7 天)和 2014 年 12 月 25 日(-30 天)开始的月份以及每日数据点 15 年 1 月 23 日我将在 2015 年 1 月 16 日(-7 天)和月份开始一周从 2014 年 12 月 24 日开始(-30 天)等
但是,通过使用 asfreq('W') 和 asfreq('M') 我每个月获得 31 个每日数据点(好)每个月 1 个月度数据点(不好)每个月有 4 个每周数据点(不好)。我每个月需要31个日点,31个周点,31个月点。
关于如何为每个每日日期时间实现相应的每周和每月 pct_change 的任何指导?这是我目前使用的代码:
import pandas as pd
import numpy as np
from zipline.data.loader import load_bars_from_yahoo
start = pd.Timestamp('2009-07-26')
end = pd.Timestamp('2015-01-18')
data = zp.utils.factory.load_from_yahoo(
stocks=['USO'],
start=start,
end=end,
)
daily = data
weekly = daily.asfreq('W-FRI')
monthly = daily.asfreq('M')`
asfreq
方法用于重新索引 您的数据。也就是说,它在不同的时间段对它进行分类。
您要做的是计算滚动 统计数据。 http://pandas.pydata.org/pandas-docs/stable/computation.html#moving-rolling-statistics-moments
这是一个使用自定义 lambda 函数和 rolling_apply
的实现,它似乎可以满足您的要求:
from pandas import Series, date_range
import numpy as np
# Generate some synthetic price data
ts = pd.Series(np.random.randn(1000), index=date_range('1/1/2000', periods=1000))
ts = ts.cumsum() + 100
ts.plot()
# Define a function to calculate percent change over an x-day period
rollingChange = lambda x: 100*(x[-1]-x[0])/x[0]
# Use rolling_apply to calculate 7 and 30 day rolling prcnt_change
week = pd.rolling_apply(ts, 7, rollingChange)
month = pd.rolling_apply(ts, 30, rollingChange)
这里是一个 nbviewer link 以获取更多详细信息: http://nbviewer.ipython.org/gist/twowheelmotion/70e8f114b208c194ac8b
假设您已按顺序将收盘价 ('adj_close') 调整为一列,您可以执行如下操作。
df['daily_performance'] = df.groupby('Ticker').adj_close.pct_change().fillna(0)
df['5_day_performance'] = df.groupby('Ticker').adj_close.pct_change(periods=5).fillna(0)
df['21_day_performance'] = df.groupby('Ticker').adj_close.pct_change(periods=21).fillna(0)
如果你没有包含多只股票的代码列,你可以去掉"groupby('Ticker)。平均每个月5 days/week和21个交易日,因此,上面的 5 和 21。