Python 如何通过雅虎导入熊猫的多种股票价格?

Python 如何通过雅虎导入熊猫的多种股票价格?,python,pandas,yahoo-finance,pandas-datareader,Python,Pandas,Yahoo Finance,Pandas Datareader,因此,我尝试使用pandas和panadas datareader获取多个股票价格。如果我只尝试导入一个ticker,它将正常运行,但如果我使用多个ticker,则会出现错误。代码是: import pandas as pd import pandas_datareader as web import datetime as dt stocks = ['BA', 'AMD'] start = dt.datetime(2018, 1, 1) end = dt.datetime(2020, 1, 1

因此,我尝试使用pandas和panadas datareader获取多个股票价格。如果我只尝试导入一个ticker,它将正常运行,但如果我使用多个ticker,则会出现错误。代码是:

import pandas as pd
import pandas_datareader as web
import datetime as dt
stocks = ['BA', 'AMD']
start = dt.datetime(2018, 1, 1)
end = dt.datetime(2020, 1, 1)
d = web.DataReader(stocks, 'yahoo', start, end) 
虽然我得到了错误:

ValueError: Wrong number of items passed 2, placement implies 1
那么,我如何才能绕过它,只允许通过1只股票。 到目前为止,我已经尝试使用quandl和google,这两种方法都不起作用。我也尝试过pdr.get_data_yahoo,但得到了相同的结果。我也尝试过
yf.download()
,但仍然遇到同样的问题。有没有人有什么办法来解决这个问题?多谢各位

编辑:完整代码:

import pandas as pd
import pandas_datareader as web
import datetime as dt
import yfinance as yf
import numpy as np
stocks = ['BA', 'AMD', 'AAPL']
start = dt.datetime(2018, 1, 1)
end = dt.datetime(2020, 1, 1)
d = web.DataReader(stocks, 'yahoo', start, end)
d['sma50'] = np.round(d['Close'].rolling(window=2).mean(), decimals=2)
d['sma200'] = np.round(d['Close'].rolling(window=14).mean(), decimals=2)
d['200-50'] = d['sma200'] - d['sma50']
_buy = -2
d['Crossover_Long'] = np.where(d['200-50'] < _buy, 1, 0)
d['Crossover_Long_Change']=d.Crossover_Long.diff()
d['buy'] = np.where(d['Crossover_Long_Change'] == 1, 'buy', 'n/a')
d['sell'] = np.where(d['Crossover_Long_Change'] == -1, 'sell', 'n/a')
pd.set_option('display.max_rows', 5093)
d.drop(['High', 'Low', 'Close', 'Volume', 'Open'], axis=1, inplace=True)
d.dropna(inplace=True)
#make 2 dataframe
d.set_index(d['Adj Close'], inplace=True)
buy_price = d.index[d['Crossover_Long_Change']==1]
sell_price = d.index[d['Crossover_Long_Change']==-1]
d['Crossover_Long_Change'].value_counts()
profit_loss = (sell_price - buy_price)*10
commision = buy_price*.01
position_value = (buy_price + commision)*10
percent_return = (profit_loss/position_value)*100
percent_rounded = np.round(percent_return, decimals=2)
prices = { 
    "Buy Price" : buy_price,
    "Sell Price" : sell_price,
    "P/L" : profit_loss,
    "Return": percent_rounded
}
df = pd.DataFrame(prices)
print('The return was {}%, and profit or loss was ${} '.format(np.round(df['Return'].sum(), decimals=2), 
                                                               np.round(df['P/L'].sum(), decimals=2)))
d
将熊猫作为pd导入
将数据读取器导入web
将日期时间导入为dt
以yf形式导入yf财务
将numpy作为np导入
股票=['BA','AMD','AAPL']
开始=日期时间(2018年1月1日)
end=dt.datetime(2020,1,1)
d=web.DataReader(股票,“雅虎”,开始,结束)
d['sma50']=np.round(d['Close'].rolling(窗口=2.mean(),小数=2)
d['sma200']=np.四舍五入(d['Close'].滚动(窗口=14).平均值(),小数=2)
d['200-50']=d['sma200']-d['sma50']
_买入=-2
d['Crossover_Long']=np.其中(d['200-50']<\u buy,1,0)
d['Crossover_Long_Change']=d.Crossover_Long.diff()
d['buy']=np.其中(d['Crossover\u Long\u Change']==1,'buy','n/a')
d['sell']=np.其中(d['Crossover\u Long\u Change']==-1,'sell','n/a')
pd.set_选项('display.max_rows',5093)
d、 下降(['High'、'Low'、'Close'、'Volume'、'Open'],轴=1,在位=True)
d、 dropna(就地=真)
#生成2个数据帧
d、 设置索引(d['Adj Close'],就地=真)
买入价格=d.指数[d['Crossover\u Long\u Change']=1]
卖出价格=d.指数[d['Crossover\u Long\u Change']=-1]
d['Crossover_Long_Change'].值计数()
损益=(卖出价-买入价)*10
佣金=购买价格*.01
头寸价值=(买入价+佣金)*10
收益率=(损益/头寸价值)*100
四舍五入百分比=np.四舍五入(返回百分比,小数=2)
价格={
“买入价”:买入价,
“售价”:售价,
“损益”:损益,
“回报”:四舍五入的百分比
}
df=pd.数据帧(价格)
print('返回值为{}%,损益为${}'。格式(np.round(df['return'].sum(),小数=2),
np.round(df['P/L'].sum(),小数=2)
D

我在你的代码中尝试了3只股票,它会返回所有3只股票的数据,我不确定我是否理解你面临的问题

import pandas as pd
import pandas_datareader as web
import datetime as dt
stocks = ['BA', 'AMD', 'AAPL']
start = dt.datetime(2018, 1, 1)
end = dt.datetime(2020, 1, 1)
d = web.DataReader(stocks, 'yahoo', start, end)
print(d)
输出:

Attributes   Adj Close                              Close                         ...        Open                            Volume
Symbols             BA        AMD        AAPL          BA        AMD        AAPL  ...          BA        AMD        AAPL         BA          AMD        AAPL
Date                                                                              ...
2018-01-02  282.886383  10.980000  166.353714  296.839996  10.980000  172.259995  ...  295.750000  10.420000  170.160004  2978900.0   44146300.0  25555900.0
2018-01-03  283.801239  11.550000  166.324722  297.799988  11.550000  172.229996  ...  295.940002  11.610000  172.529999  3211200.0  154066700.0  29517900.0
2018-01-04  282.724396  12.120000  167.097290  296.670013  12.120000  173.029999  ...  297.940002  12.100000  172.539993  4171700.0  109503000.0  22434600.0
2018-01-05  294.322296  11.880000  168.999741  308.839996  11.880000  175.000000  ...  296.769989  12.190000  173.440002  6177700.0   63808900.0  23660000.0
2018-01-08  295.570740  12.280000  168.372040  310.149994  12.280000  174.350006  ...  308.660004  12.010000  174.350006  4124900.0   63346000.0  20567800.0
...                ...        ...         ...         ...        ...         ...  ...         ...        ...         ...        ...          ...         ...
2019-12-24  331.030457  46.540001  282.831299  333.000000  46.540001  284.269989  ...  339.510010  46.099998  284.690002  4120100.0   44432200.0  12119700.0
2019-12-26  327.968689  46.630001  288.442780  329.920013  46.630001  289.910004  ...  332.700012  46.990002  284.820007  4593400.0   57562800.0  23280300.0
2019-12-27  328.187408  46.180000  288.333313  330.140015  46.180000  289.799988  ...  330.200012  46.849998  291.119995  4124000.0   36581300.0  36566500.0
2019-12-30  324.469513  45.520000  290.044617  326.399994  45.520000  291.519989  ...  330.500000  46.139999  289.459991  4525500.0   41149700.0  36028600.0
2019-12-31  323.833313  45.860001  292.163818  325.760010  45.860001  293.649994  ...  325.410004  45.070000  289.929993  4958800.0   31673200.0  25201400.0

我在你的代码中尝试了3种股票,它会返回所有3种股票的数据,我不确定我是否理解你面临的问题

import pandas as pd
import pandas_datareader as web
import datetime as dt
stocks = ['BA', 'AMD', 'AAPL']
start = dt.datetime(2018, 1, 1)
end = dt.datetime(2020, 1, 1)
d = web.DataReader(stocks, 'yahoo', start, end)
print(d)
输出:

Attributes   Adj Close                              Close                         ...        Open                            Volume
Symbols             BA        AMD        AAPL          BA        AMD        AAPL  ...          BA        AMD        AAPL         BA          AMD        AAPL
Date                                                                              ...
2018-01-02  282.886383  10.980000  166.353714  296.839996  10.980000  172.259995  ...  295.750000  10.420000  170.160004  2978900.0   44146300.0  25555900.0
2018-01-03  283.801239  11.550000  166.324722  297.799988  11.550000  172.229996  ...  295.940002  11.610000  172.529999  3211200.0  154066700.0  29517900.0
2018-01-04  282.724396  12.120000  167.097290  296.670013  12.120000  173.029999  ...  297.940002  12.100000  172.539993  4171700.0  109503000.0  22434600.0
2018-01-05  294.322296  11.880000  168.999741  308.839996  11.880000  175.000000  ...  296.769989  12.190000  173.440002  6177700.0   63808900.0  23660000.0
2018-01-08  295.570740  12.280000  168.372040  310.149994  12.280000  174.350006  ...  308.660004  12.010000  174.350006  4124900.0   63346000.0  20567800.0
...                ...        ...         ...         ...        ...         ...  ...         ...        ...         ...        ...          ...         ...
2019-12-24  331.030457  46.540001  282.831299  333.000000  46.540001  284.269989  ...  339.510010  46.099998  284.690002  4120100.0   44432200.0  12119700.0
2019-12-26  327.968689  46.630001  288.442780  329.920013  46.630001  289.910004  ...  332.700012  46.990002  284.820007  4593400.0   57562800.0  23280300.0
2019-12-27  328.187408  46.180000  288.333313  330.140015  46.180000  289.799988  ...  330.200012  46.849998  291.119995  4124000.0   36581300.0  36566500.0
2019-12-30  324.469513  45.520000  290.044617  326.399994  45.520000  291.519989  ...  330.500000  46.139999  289.459991  4525500.0   41149700.0  36028600.0
2019-12-31  323.833313  45.860001  292.163818  325.760010  45.860001  293.649994  ...  325.410004  45.070000  289.929993  4958800.0   31673200.0  25201400.0

我认为误差来自你的移动平均线和直线 d['sma50']=np.round(d['Close'].rolling(窗口=2.mean(),小数=2) 因为d代表3只股票,我认为你必须把每只股票分开,分别计算移动平均数

编辑:我只尝试了两种股票(BA和AMD),但这不是最好的解决方案,因为我总是重复自己的每一行。 我只是Python的初学者,但这可能会帮助您找到问题的解决方案 附言:最后一行不太好用(那是损益表和退货的打印)

"

将熊猫作为pd导入
将数据读取器导入web
将日期时间导入为dt
股票1=['BA']
股票2=['AMD']
开始=日期时间(2018年1月1日)
end=dt.datetime(2020,1,1)
d1=web.DataReader(stock1,'yahoo',start,end)
d2=web.DataReader(stock2,'yahoo',start,end)
d1['sma50']=np.四舍五入(d1['Close'].滚动(窗口=2)。平均值(),小数=2)
d2['sma50']=np.四舍五入(d2['Close'].滚动(窗口=2)。平均值(),小数=2)
d1['sma200']=np.四舍五入(d1['Close'].滚动(窗口=14)。平均值(),小数=2)
d2['sma200']=np.四舍五入(d2['Close'].滚动(窗口=14)。平均值(),小数=2)
d1['200-50']=d1['sma200']-d1['sma50']
d2['200-50']=d2['sma200']-d2['sma50']
_买入=-2
d1['Crossover_Long']=np.其中(d1['200-50']<\u buy,1,0)
d2['Crossover_Long']=np.其中(d2['200-50']<\u buy,1,0)
d1['Crossover_Long_Change']=d1.Crossover_Long.diff()
d2['Crossover_Long_Change']=d2.Crossover_Long.diff()
d1['buy']=np.其中(d1['Crossover\u Long\u Change']==1,'buy','n/a')
d2['buy']=np.其中(d2['Crossover\u Long\u Change']==1,'buy','n/a')
d1['sell_BA']=np.其中(d1['Crossover_Long_Change']==-1,'sell','n/a')
d2['sell\u AMD']=np.其中(d2['Crossover\u Long\u Change']==-1,'sell','n/a')
pd.set_选项('display.max_rows',5093)
d1.下降([‘高’、‘低’、‘关’、‘音量’、‘开’],轴=1,在位=真)
d2.下降([‘高’、‘低’、‘关’、‘音量’、‘开’],轴=1,在位=真)
d2.dropna(就地=真)
d1.dropna(就地=真)
d1.设置索引(“调整关闭”,就地=真)
d2.设置索引(“调整关闭”,就地=真)
买入价格=np.数组(d1.索引[d1['Crossover\u Long\u Change']=1])
买入价格AMD=np.array(d2.index[d2['Crossover\u Long\u Change']=1])
卖出价=np.数组(d1.索引[d1['Crossover\u Long\u Change']=-1])
卖出价格AMD=np.array(d2.index[d2['Crossover\u Long\u Change']=-1])
d1['Crossover_Long_Change'].值计数()
d2['Crossover\u Long\u Change'].值\u计数()
盈亏平衡=(卖出价平衡-买入价平衡)*10
利润损失金额=(卖出价格金额-买入价格金额)*10
佣金=买入价*01
佣金=购买价格*01
仓位价值=(买入价格+佣金)*10
仓位价值金额=(买入价格金额+佣金金额)*10
收益率=np.四舍五入((损益/头寸价值)*100),小数=2)
收益率=np.四舍五入((损益/头寸价值)*100),小数=2)
价格_BA={
“买入价格BA”:[买入价格BA],
“售价BA”:[售价BA],
“损益基础”:[损益基础],
“返回BA”:[返回百分比]}
df=pd.数据帧(价格)
print('返回值为{}%,损益为${}'。格式(np.round(df['return BA'].sum(),小数=2),
np.round(df['P/L BA'].sum(),小数=2)))
价格_AMD={
“买入价格AMD”:[买入价格AMD],
“售价AMD”:[售价AMD],
“P/L AM