如何使用yfinance和pandas在python中找到macd并发出多只股票的信号?

时间:2020-07-18 14:51:29

标签: python pandas yfinance

我有以下代码:

import pandas as pd 
import yfinance as yf
import matplotlib.pyplot as plt
import datetime as dt

start=dt.datetime.today()-dt.timedelta(160)
end=dt.datetime.today()
clprice=pd.DataFrame(yf.download("FB MSFT AMZN GOOG GM", start=start, end=end))
clprice=clprice.dropna()
def macd(DF,a,b,c):
  df=DF.copy()
  df['MA Fast']=df['Adj Close'].ewm(span=a, min_periods=a).mean()
  df['MA Slow']=df['Adj Close'].ewm(span=b, min_periods=b).mean()
  df["MACD"]=df['MA Fast']-df['MA Slow']
  df['Signal']=df.MACD.ewm(span=c, min_periods=c).mean()
  df["Histrogram"]=df.MACD-df.Signal
  df=df.dropna()
  df.iloc[:,[4,8,9,10]].plot()
  plt.savefig("msftmacdsignal.png")
  return df


d=macd(clprice, 12,26,9)

我正在尝试创建一个接受数据帧并返回MACD和信号的函数。当我使用一个股票行情自动收录器时,我没有问题,它给了我适当的结果。当我在这种情况下使用多个股票时,例如“ FB MSFT AMZn GOOG GM”,我会收到此错误:

raise ValueError(
ValueError: Wrong number of items passed 5, placement implies 1

1 个答案:

答案 0 :(得分:0)

我的回答是指所提供的代码:

import pandas as pd 
import yfinance as yf
import matplotlib.pyplot as plt
import datetime as dt

start=dt.datetime.today()-dt.timedelta(160)
end=dt.datetime.today()
clprice=pd.DataFrame(yf.download("FB MSFT AMZN GOOG GM", start=start, end=end))
clprice=clprice.dropna()
def macd(DF,a,b,c):
  df=DF.copy()
  df['MA Fast']=df['Adj Close'].ewm(span=a, min_periods=a).mean()
  df['MA Slow']=df['Adj Close'].ewm(span=b, min_periods=b).mean()
  df["MACD"]=df['MA Fast']-df['MA Slow']
  df['Signal']=df.MACD.ewm(span=c, min_periods=c).mean()
  df["Histrogram"]=df.MACD-df.Signal
  df=df.dropna()
  df.iloc[:,[4,8,9,10]].plot()
  plt.savefig("msftmacdsignal.png")
  return df

我要使用单个代码,例如“ FB”:

macd(clprice.xs('FB', level=1, axis=1), 12,26,9)

对于多个代码来说,macd函数没有变化:

for ticker in clprice.columns.get_level_values(1).unique():
    macd(clprice.xs(ticker, level=1, axis=1), 12,26,9)

请注意,列是多层的,因此使用get_levelvalues。 运行上述代码后,将产生每个股票行情图表。