【问题标题】:How to adjust Moving Average for weekly analysis?如何为每周分析调整移动平均线?
【发布时间】:2019-05-06 06:02:07
【问题描述】:

我需要根据每周间隔(如 3 周间隔或 21 天)绘制移动平均线,但在调整错过的日期时,它现在计数为 0,因此它给出了不正确的结果。

from nsepy import get_history as gh
from datetime import date
import pandas as pd

nifty = gh(symbol="NIFTY IT", 
                    start=date(2015,1,1), 
                    end=date(2016,1,3),
                    index=True)
idx = pd.date_range('01-01-2015', '01-01-2016')
nifty.index = pd.DatetimeIndex(nifty.index)
nifty = nifty.reindex(idx, fill_value=0)
nifty["3weekMA"]=nifty["Close"].rolling(21).mean()
nifty[nifty.Open != 0]

可以做些什么来解决这个问题。

这是实际结果:

并且期望的结果必须是这样的:

这是因为收盘的移动平均线必须在 11000 而不是 8000 的范围内。

【问题讨论】:

  • 最好包含您的结果和期望的结果,以便人们可以更快更好地帮助您

标签: python pandas algorithm dataframe nsepy


【解决方案1】:

想到的最简单的事情是从数据中删除周末值:

nifty=nifty[nifty['Close']!=0]

然后执行移动平均:

nifty["3weekMA"]=nifty["Close"].rolling(15).mean()

使用 15 代替 21 就可以了,它会发挥应有的作用。不过,这方面的指针很少。滚动平均值将给出最后 15 个值的平均值,但问题是它会在您的情况下将其作为第 15 个值或第 21 个值,因此结果图看起来像这样:

因此,为了解决这个问题,我们需要做的就是将新找到的移动平均线向上移动,或者只是将收盘值绘制在前 7 个之后和最后 7 个之前的值以及移动平均值,这看起来像:

plt.figure(figsize=(10,8))
plt.plot(nifty['Close'].values.tolist()[7:-7])
plt.plot(nifty['3weekMA'].values.tolist()[14:])

好吧,但是可视化只是为了表示目的;我希望您了解如何处理此类数据的要点。我希望这可以解决您的问题,是的,移动平均值确实是 11Ks 而不是 8Ks。

样本输出:

        Date         Open       High        Low         Close       Volume      Turnover        3weekMA
        -------------------------------------------------------------------------------------------------
        2015-01-15  11672.30    11774.50    11575.10    11669.85    13882213    1.764560e+10    NaN
        2015-01-16  11708.85    11708.85    11582.85    11659.60    12368107    1.714690e+10    NaN
        2015-01-19  11732.50    11797.60    11629.05    11642.75    13696381    1.183750e+10    NaN
        2015-01-20  11681.80    11721.90    11635.70    11695.00    11021415    1.234730e+10    NaN
        2015-01-21  11732.45    11838.30    11659.70    11813.70    18679282    1.973070e+10    11418.113333
        2015-01-22  11832.55    11884.50    11782.95    11850.85    15715515    1.655670e+10    11460.456667
        2015-01-23  11877.90    11921.00    11767.40    11885.15    30034833    2.001210e+10    11494.660000
        2015-01-27  11915.60    11917.25    11679.55    11693.45    17005337    1.866840e+10    11524.320000
        2015-01-28  11712.55    11821.80    11693.80    11809.55    16876897    1.937590e+10    11580.963333
        2015-01-29  11812.35    11861.50    11728.75    11824.15    15520902    2.160790e+10    11641.506667
        2015-01-30  11998.35    12003.35    11799.35    11824.75    18559078    2.905950e+10    11695.280000
        2015-02-02  11871.35    11972.60    11847.80    11943.95    17272113    2.304050e+10    11731.566667
        2015-02-03  11963.75    12000.65    11849.00    11963.90    21053605    1.770590e+10    11759.583333

【讨论】:

  • 绝对可以理解和有效的观点。我没有想到。所以你的意思是,如果在 3 周之间有国定假日,那么采用滚动平均值 14 比 15 更有意义。对吧?
  • 对,但是对于一年的数据,我如何知道这 3 周集之间的所有假期。有没有一种方法可以根据周而不是天来计算,因为这样可以得出完美的结果。我对这种分析很陌生。
  • 好吧,我确实找到了一些东西。在滚动内部,您可以提供与时间相关的窗口,例如 = '3d' 将是 3 秒,因此它将计算 3 天的滚动平均值,假设您的索引是时间戳等。还有“3w”,表示 3 周。它目前正在出错,但在解决问题时,我意识到,我们正在计算移动平均线,那么考虑假期类似于我们在周末做的事情有什么大问题(只是让它从数据中删除) .毕竟我们需要 Nifty 开放的日子的 MA 吗?那么这有什么问题呢?
  • 没错...如果这不起作用,我将提供当天的类比。同时,这只是一项以周为单位进行隔离的任务。
  • 那么在这种情况下,2015 年 1 月 1 日从星期四开始,我想这不可能是一周的开始。但是,我们可以在每行的每次日期中添加 21,获取索引范围并计算该范围的 Close 列值的平均值,并将这 21 个日期的第 11 个索引标记为结果 MA。我的意思是这样做很容易,因为在日期时间戳中添加一个整数可以完美地工作,并且会为您提供特定日期的第 21 个日期。得到它?我相信你也可以自己做到这一点。万一你不明白我指的是什么,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2013-12-22
  • 2020-05-19
  • 2023-03-12
  • 2017-11-12
  • 2018-02-08
相关资源
最近更新 更多