簡體   English   中英

Pandas 移動平均計算缺少日期?

[英]Pandas moving average calculation missing dates?

我正在嘗試使用來自Alpha Vantage的實時外匯數據制作一個簡單的移動平均線(API 密鑰可以從 Alpha Vantage 免費注冊)。 除了 SMA 的周期不完整之外,一切似乎都運行良好。

例如,如果我設置data[:'2020-1-1'] ,它應該返回從 1.1.2020 到當前日期的數據。 然而,2020 年 12 月至 2021 年 1 月的這段時間已經一去不復返了。

我嘗試繪制圖表並意識到我的移動平均周期越大,刪除的數據越多。 我圖上的 plot 如下:

英鎊美元

Dataframe 用於 2020-1-1 期初

Dataframe 周期固定但 NAN 值

以下是我在 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()

任何幫助,將不勝感激。 謝謝。

這不是因為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 天的數據,然后僅繪制開始日期到結束日期的圖表。 這將填補似乎缺失的區域,因為您的計算現在考慮了上一時期(不會繪制圖表)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM