熊猫移动平均计算缺少日期?

时间:2021-02-02 12:16:44

标签: python

我正在尝试使用来自 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()

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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