【问题标题】:Pandas moving average calculation missing dates?熊猫移动平均计算缺少日期?
【发布时间】:2021-02-02 12:16:44
【问题描述】:

我正在尝试使用来自Alpha Vantage 的实时外汇数据制作一个简单的移动平均线(API 密钥可以从 Alpha Vantage 免费注册)。除了 SMA 的周期不完整之外,一切似乎都运行良好。

例如,如果我设置data[:'2020-1-1'],它应该返回从 1.1.2020 到当前日期的数据。但是,2020 年 12 月到 2021 年 1 月的时间段已经过去了。

我尝试绘制图表并意识到我的移动平均周期越大,删除的数据越多。我的图表上的情节如下:

GBP USD

Dataframe for beginning period 2020-1-1

Dataframe period fixed but NAN values

以下是我在 3 个单独文件中的代码:

这是 execution.py 文件:

from alpha_vantage.foreignexchange import ForeignExchange
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from to_USD import currencyExchangeB
from smvgavg import sma

UniSymbol = 'USD'
fromSymbolsB = ['EUR','GBP']

for symbol in fromSymbolsB:
    # store the result that return from "currencyExchange()" function
    result = currencyExchangeB(UniSymbol,symbol)

    # generate graph by passing those result of each currency data
    sma(result,UniSymbol,symbol)

下一个是 to_USD.py 文件,我用它从 Alpha Vantage 中提取外币数据:

from alpha_vantage.foreignexchange import ForeignExchange
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import datetime

# added a class to collect a collection of variable so it can be return easily in the following function
class GRAPH_STRUCT:
    date:any
    symbol:str
    def __init__(self,date,symbol):
        self.date = date
        self.symbol = symbol

def currencyExchangeB(toCurrencyB,fromCurrencyB):
    # create an array to store the result
    result = []

    cc = ForeignExchange(key='%ALPHA_VANTAGE_APIKEY%',output_format='pandas')
    data, meta_data = cc.get_currency_exchange_daily(from_symbol=fromCurrencyB,to_symbol=toCurrencyB,outputsize='full')

    # append those result in the array
    result = GRAPH_STRUCT(data[:'2020-1-1'],toCurrencyB)

    # return those result in the end of the function
    return result

最后一个文件是用于计算简单移动平均线的smvgavg.py文件:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

#dataObj is a datatype of GRAPH_STRUCT
def sma(dataObj,UniSymbol,symbol):
    maA = 25
    maB = 50
    maT = [maA,maB]
    for ma in maT:
        smaString = "SMA" + str(ma)

        data = dataObj.date
        data[smaString] = data.iloc[:,3].rolling(window = ma).mean()
        data = data.iloc[ma:]

        print(data)
        fig = plt.gcf()
        fig.set_size_inches(10, 6)
        plt.plot(data['4. close'], label='Close' if ma == 0 else "",color='red')
        plt.plot(data['SMA' + str(ma)],label='SMA' + str(ma))

    plt.title(symbol + '/' + UniSymbol, y=1)
    plt.xlabel("Date")
    plt.ylabel("Exchange Rate")
    plt.legend()
    plt.show()

任何帮助将不胜感激。 谢谢。

【问题讨论】:

  • 你可以使用min_periods=1参数Minimum number of observations in window required to have a value. min_periods will default to the size of the window。参考here

标签: python


【解决方案1】:

这不是因为 pandas 或 Python,而是因为 SMA 的计算方式。除非您自己进行计算只是为了看看发生了什么,否则可能会有点棘手。

简单移动平均线的公式是在 n 个区间取 n 个收盘价。并除以 n。其中 P 是收盘价,数字是您的 n 天 SMA 的偶数区间,5 天 SMA 的一个周期看起来像这样:

(P1 + P2 + P3 + P4 + P5)/5

您的某些开始日期似乎缺失的原因是,从某个时期计算的数据点位于该时期的结束。例如,让我们看看 TD Ameritrade 的 thinkorswim 上的 Airbnb (ABNB)。这只股票最近刚刚上市,所以我们可以很容易地看到这条 50 天 SMA(紫色线)有一些日期似乎缺失:

可以做的是获取您不会在图表中显示的早期信息。

例如,如果您想显示 2020 年 12 月至 2021 年 2 月日期的 10 天 SMA 线,您可以考虑开始日期前 10 天的数据,然后仅绘制您的图表开始日期到结束日期。这将填补似乎缺失的区域,因为您的计算现在考虑了上一个时期(不会绘制图表)。

【讨论】:

  • 我可以知道如何使用 python 计算开始日期前 10 天的日期吗?
  • 您将不得不将其纳入您的 API 请求或从请求返回的数据中选择数据点。例如,图表:data['2020-11-20':'data[2021-1-1]'](如果您想绘制 2020 年 12 月至 2021 年 1 月的图表,因为现在您计算的是开始日期之前的 10 天)
  • 你好 gmdev。我刚刚注意到您向我展示的图表示例在起点处缺少数据。但是,我的图表中缺失的数据是相反的。更新的数据实际上已经消失了。我已经更新了我的问题,向您展示正在发生的事情。我在问题中的第一组代码之前上传了名为 GBP USD 的图片。
  • 期末好像没有绘制数据。我正在尝试绘制最近一天的移动平均线。
  • 你好 gmdev。我已经更新了这个问题。数据框就在 GBP USD 图像下方。我根据问题维护了代码,没有进行任何编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 2023-01-31
  • 1970-01-01
  • 2019-11-19
  • 2018-10-01
相关资源
最近更新 更多