我试图使用Alpha Vantage
的实时外汇数据制作一个简单的移动平均线(API键可以免费从Alpha Vantage注册)。除了SMA的周期不完整外,一切看起来都很好。
例如,如果我设置了data[:'2020-1-1']
,它应该返回1.1.2020到当前日期的数据。然而,发生的情况是,从2020年12月到2021年1月这段时期已经过去。
我试着绘制图表,并意识到我的移动平均周期越大,最近的数据就会被删除。我的图表上的情节如下:
以下是我在三个单独文件中的代码:
这是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()
任何帮助都将不胜感激。谢谢。
发布于 2021-02-02 04:41:59
这不是因为pandas
或Python,而是因为SMA是如何计算的。除非你自己做了计算,才能看到发生了什么,这可能有点棘手。
简单移动平均的公式是在n个区间取n个收盘价。除以n,其中P是收盘价,数是n天SMA中的偶数间隔,一个5天SMA的周期如下所示:
(P1 + P2 + P3 + P4 + P5)/5
您的一些开始日期似乎缺少的原因是,从句点计算的数据点被放置在该期间的end中。举个例子,让我们来看一下Airbnb (ABNB)
对TD美国的思考或游泳的看法。这只股票是最近上市的,所以我们可以很容易地看到,这个50天的SMA (紫色线)也有一些日期似乎是缺失的:
您可以做的是获得更早的信息,您将不会显示在您的图形。
例如,如果要显示2020年12月至2021年2月10天的SMA行,可以在开始日期前10天将数据写入,然后将开始日期绘制为结束日期。这将填充似乎缺少的区域,因为您的计算现在说明了前一个期间(这将不会被绘制)。
https://stackoverflow.com/questions/66009577
复制