【问题标题】:how compute rolling difference between open year stock price and closing price of that stock with a frequency one Day如何以一天的频率计算开年股票价格和该股票收盘价之间的滚动差异
【发布时间】:2016-04-03 01:57:45
【问题描述】:

我有超过 30 年的股票数据。我要做的是使用 rolling_apply() 计算股票在一年中是上涨还是下跌。

频率为 1 天,窗口为 252,min_period 为 2 天。

由于大量数据,我试图避免 for 循环,因为它大大减慢了执行速度,pandas 似乎是最好的选择。

这里是样本数据的图像。

the data 我想要实现的是例如在输入日期(例如 2015-12-22)之后,滚动函数应该计算从 2015-12-22 到 2014-12-22 的这一年是否值 open_price( 在 2015- 12-2 ) - close_price( 2014-12-22 ) 增加或减少并返回从 2014-12-22 到 2013-12-22 一直到 1997 的值。然后对 2015-12- 执行相同操作23,一路到2015-12-31。

返回的值应该是股票上涨的年数。例如给出第一个日期,例如 2015-12-22,开盘价为 663.xx strong> 2014 年 12 月 22 日收盘价为660.00,股价上涨,增仓。然后,如果股票从 2014 年 12 月 22 日上涨到 2013 年 12 月 22 日,它应该增加计数器,直到达到数据中的最后一年,即如果有 30 年并且上涨了 14,那么返回的值是 14日期然后它应该滚动到其他日期并执行相同的操作。

import pandas as pd
import numpy  as np

Data = pd.io.parsers.read_csv( "amzn.csv" ) # Reading data from the csv

def append_date( Data ):                    # Appending year mont and day column
    data = Data
    data['date'] = pd.to_datetime( data.Date )
    data['year'], data['month'], data['day'] = data['date'].dt.year, \
                                               data['date'].dt.month, \
                                               data['date'].dt.day
    num_of_yrs   = np.size( np.where( ( np.unique( data['year'].values ))))
    data.ix[:,0] = pd.to_datetime( data.ix[:,0] )
    del data['date']
    return data, num_of_yrs

Data_datetime, num_of_years= a ppend_date( Data )

        Date        Open        High         Low       Close   Volume  \
     0 2015-12-23  666.500000  666.599976  656.630005  663.700012  2714900   
     1 2015-12-22  666.830017  668.489990  659.260010  663.150024  2664000   
     2 2015-12-21  668.500000  669.900024  658.929993  664.510010  3197500   
     3 2015-12-18  668.650024  676.840027  664.130005  664.140015  6765900   
     4 2015-12-17  680.000000  682.500000  670.650024  670.650024  3663500   

   Adj Close  year  month  day  
0  663.700012  2015     12   23  
1  663.150024  2015     12   22  
2  664.510010  2015     12   21  
3  664.140015  2015     12   18  
4  670.650024  2015     12   17  

【问题讨论】:

  • 你能发布你的数据框来代替图片吗?
  • 刚刚添加了代码来显示我是如何获取数据的

标签: python pandas


【解决方案1】:

这是你想要做的吗?

import pandas as pd

def up_over_period(s):
    """Check if most recent value in Series is greater than the earliest.
    """
    return s[0] > s[-1]

#Reading data from the csv
df = pd.read_csv("amzn.csv")

period = 253

df['UpOnYear'] = pd.rolling_apply(
    df['Close'], 
    window=period, 
    func=up_over_period, 
    )

根据评论编辑

s = pd.rolling_apply(
    df['Close'], 
    window=period, 
    func=up_over_period, 
    ).shift(-period + 1)[::-1]

s = (s.groupby((s != s.shift()).cumsum()).cumsum() / (period - 1)).apply(math.ceil)

df['ConsecPeriodsUp'] = s

【讨论】:

  • 谢谢,但不完全是答案。返回的值应该是股票上涨的年数。例如给定第一个日期,例如 2015-12-22,开盘价为 663.xx,2014-12-22 收盘价为 660上升,因此增加一个计数器。那么如果股票从 2014 年 12 月 22 日上升到 2013 年 12 月 22 日,它应该增加计数器,直到达到数据中的最后一年。即,如果有 30 年并且上涨了 14,则该日期返回的值是 14,那么它应该滚动到其他日期并执行相同的操作。
  • 也许在问题中这么说。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多