我正在尝试使用来自 Alpha Vantage
的实时外汇数据制作一个简单的移动平均线(API 密钥可以从 Alpha Vantage 免费注册)。除了 SMA 的期限未完成外,一切似乎都正常。
例如,如果我设置 data[:'2020-1-1']
,它应该返回从 1.1.2020 到当前日期的数据。然而,发生的事情是2020年12月到2021年1月这段时间过去了。
我尝试绘制图表并意识到我的移动平均周期越大,删除的最新数据就越多。我的图表上的情节如下:
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()
任何帮助将不胜感激。 谢谢。
答案 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(紫色线)还有一些似乎缺失的日期:
您可以做的是获取您不会在图表中显示的早期信息。
例如,如果您想显示 2020 年 12 月至 2021 年 2 月的 10 天 SMA 线,您可以考虑开始日期之前10 天的数据,然后绘制您的图表开始日期到结束日期。这将填补似乎缺失的区域,因为您的计算现在考虑了上一时期(不会绘制成图表)。