Python动态日期时间段

时间:2015-01-25 05:55:07

标签: python datetime pandas

我正致力于编制HAR-RV波动率模型,我会对每日,每周和每月数据进行回归,以预测明天的每日波动率。我有6年的每日数据,我想反击。起初,我认为这很简单 - 我使用pandas asfreq将我的每日数据转换为每周和每月,以计算每日,每周和每月pct_change以开始分析。问题是我试图在python中找到一个函数,它允许我为每个每日数据点计算每月和每周pct_change,这样在2015年1月24日我将有一周从2015年1月17日开始(-7天和)从2014年12月25日开始的月份(-30天)和每日数据点1/23/15我将从2015年1月16日(-7天)开始的一周和2014年12月24日开始的月份( - 30天)等。

然而,通过使用asfreq('W')和asfreq('M')我每个月获得31个每日数据点(OK)每月1个月数据点(不是OK)和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')`

2 个答案:

答案 0 :(得分:2)

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链接,了解更多详情: http://nbviewer.ipython.org/gist/twowheelmotion/70e8f114b208c194ac8b

答案 1 :(得分:0)

假设您已按顺序调整收盘价('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天,每月平均21个交易日,因此,上面的5和21