0

我有 6 只股票的清单。我已经设置了我的代码来引用列表中的股票名称与股票名称中的硬编码......首先使用位于位置 0 的 SPY。列表下方的代码将返回昨天的股票收盘价。

我的问题是:如何在列表中的每只股票中循环代码,以便打印出所有 6 只股票的收盘价?

我想我需要使用循环,但我不明白它们。

有任何想法吗?代码:

#import packages

import pandas_datareader.data as web
import datetime as dt

#create list of stocks to reference later

stocks = ['SPY', 'QQQ', 'IWM', 'AAPL', 'FB', 'GDX']

#define prior day close price

start = dt.datetime(2010, 1, 1)
end = dt.datetime(2030, 1, 27)
ticker = web.DataReader(stocks[0], 'google', start, end)
prior_day = ticker.iloc[-1] 
PDL = list(prior_day)
prior_close = PDL[3]
#print the name of the stock from the stocks list, and the prior close price

print(stocks[0])
print('Prior Close')
print(prior_close)

回报:

SPY
Prior Close
249.08
4

3 回答 3

3

您可以使用循环,但您不需要循环。将您的整个列表传递stocksDataReader. 这应该比打多个电话便宜。

stocks = ['SPY', 'QQQ', 'IWM', 'AAPL', 'FB', 'GDX']
ticker = web.DataReader(stocks, 'google', start, end)

close = ticker.to_frame().tail()['Close'].to_frame('Prior Close')    
print(close)
                  Prior Close
Date       minor             
2017-09-26 FB          164.21
           GDX          23.35
           IWM         144.61
           QQQ         143.17
           SPY         249.08

细节

ticker是一个面板,但可以使用以下方法转换为数据框to_frame

print(ticker)
<class 'pandas.core.panel.Panel'>
Dimensions: 5 (items) x 251 (major_axis) x 6 (minor_axis)
Items axis: Open to Volume
Major_axis axis: 2016-09-28 00:00:00 to 2017-09-26 00:00:00
Minor_axis axis: AAPL to SPY

df = ticker.to_frame()

您可以使用以下方式查看所有记录的股票日期df.index.get_level_values

print(df.index.get_level_values('Date'))
DatetimeIndex(['2016-09-28', '2016-09-28', '2016-09-28', '2016-09-28',
               '2016-09-28', '2016-09-28', '2016-09-29', '2016-09-29',
               '2016-09-29', '2016-09-29',
               ...
               '2017-09-25', '2017-09-25', '2017-09-25', '2017-09-25',
               '2017-09-26', '2017-09-26', '2017-09-26', '2017-09-26',
               '2017-09-26', '2017-09-26'],
              dtype='datetime64[ns]', name='Date', length=1503, freq=None)

如果您想查看特定日期的所有股票,您可以df.loc使用slice. 对于您的情况,您希望查看最后一天的收盘股票,因此您可以使用df.tail

print(df.tail()['Close'].to_frame()) 
                   Close
Date       minor        
2017-09-26 FB     164.21
           GDX     23.35
           IWM    144.61
           QQQ    143.17
           SPY    249.08
于 2017-09-27T12:44:59.880 回答
1

你可以只使用一个for循环

for stock in stocks:
    start = dt.datetime(2010, 1, 1)
    end = dt.datetime(2030, 1, 27)
    ticker = web.DataReader(stock, 'google', start, end)
    prior_day = ticker.iloc[-1] 
    PDL = list(prior_day)
    prior_close = PDL[3]

    print(stock)
    print('Prior Close')
    print(prior_close)
于 2017-09-27T12:37:40.613 回答
0

我将为您提供一个函数,您可以随时将其传递给股票列表,并为您提供时间序列。;) 我将此功能用于许多股票代码

tickers = ['SPY', 'QQQ', 'EEM', 'INDA', 'AAPL', 'MSFT'] # add as many tickers
start = dt.datetime(2010, 3,31)
end = dt.datetime.today()

# Function starts here
def get_previous_close(strt, end, tick_list, this_price):
    """ arg: `this_price` can take str Open, High, Low, Close, Volume"""
    #make an empty dataframe in which we will append columns
    adj_close = pd.DataFrame([])
    # loop here. 
    for idx, i in enumerate(tick_list):
        total = web.DataReader(i, 'google', strt, end)
        adj_close[i] = total[this_price]
    return adj_close

#call the function
get_previous_close(start, end, tickers, 'Close')

您可以以任何可能的方式使用此时间序列。使用具有可维护性和可重用性的函数总是好的。此外,此功能可以使用 yahoo 而不是 google

于 2017-09-27T15:29:19.593 回答