如何使用 yfinance 和 pandas 查找 python 中多只股票的 MACD 和信号?
how to find macd and signal for multiple stocks in python using yfinance and pandas?
我有以下代码:
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)
我正在尝试创建一个接受数据帧和 returns MACD 和信号的函数。当我使用单个自动收报机时,我没有问题,它会给我适当的结果。当我使用不止一只股票时,例如“FB MSFT AMZn GOOG GM”,我收到此错误:
raise ValueError(
ValueError: Wrong number of items passed 5, placement implies 1
我的回答参考了问题中提供的代码:
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
。
在 运行 上面的代码之后,生成了每个代码的图表。
我有以下代码:
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)
我正在尝试创建一个接受数据帧和 returns MACD 和信号的函数。当我使用单个自动收报机时,我没有问题,它会给我适当的结果。当我使用不止一只股票时,例如“FB MSFT AMZn GOOG GM”,我收到此错误:
raise ValueError(
ValueError: Wrong number of items passed 5, placement implies 1
我的回答参考了问题中提供的代码:
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
。
在 运行 上面的代码之后,生成了每个代码的图表。