<p>下面是一个非常简单的解决方案,它使用一个函数,从提供的日期范围内的所有标记器返回一个组合数据帧:</p>
<pre class="lang-py prettyprint-override"><code>from datetime import datetime
import pandas as pd
def get_quotes(tickers: list[str],
start_date: datetime,
end_date: datetime = datetime.now(),
interval: str = '1d') -> pd.DataFrame:
dfs: list[pd.DataFrame] = [] # initialize an empty list to store dataframes
for ticker in tickers: # loop over each ticker
url = f'https://query1.finance.yahoo.com/v7/finance/download/{ticker}?period1={int(start_date.timestamp())}&period2={int(end_date.timestamp())}&interval={interval}&events=history&includeAdjustedClose=true'
df = pd.read_csv(url) # read the csv from the url into a pandas DataFrame
df['ticker'] = ticker # set the ticker value of each row to the current ticker
dfs.append(df) # append the DataFrame to the list of DataFrames
return pd.concat(dfs).reset_index(drop=True) # combine the dataframes and reset the index for convenience
data = get_quotes(tickers=['aapl', 'msft'],
start_date=datetime.fromisoformat('2021-05-17'),
end_date=datetime.fromisoformat('2021-05-21T23:59')) # the end_date is optional, will default to current date
print(data)
</code></pre>
<p>输出:</p>
<pre><code> Date Open High Low Close Adj Close Volume ticker
0 2021-05-17 126.820000 126.930000 125.169998 126.269997 126.269997 74244600 aapl
1 2021-05-18 126.559998 126.989998 124.779999 124.849998 124.849998 63342900 aapl
2 2021-05-19 123.160004 124.919998 122.860001 124.690002 124.690002 92612000 aapl
3 2021-05-20 125.230003 127.720001 125.099998 127.309998 127.309998 76857100 aapl
4 2021-05-21 127.820000 128.000000 125.209999 125.430000 125.430000 79209300 aapl
5 2021-05-17 246.550003 246.589996 243.520004 245.179993 244.615158 24970200 msft
6 2021-05-18 246.270004 246.410004 242.899994 243.080002 242.520004 20168000 msft
7 2021-05-19 239.309998 243.229996 238.600006 243.119995 243.119995 25739800 msft
8 2021-05-20 243.960007 247.949997 243.860001 246.479996 246.479996 21800700 msft
9 2021-05-21 247.570007 248.330002 244.740005 245.169998 245.169998 21855500 msft
</code></pre>
<p>通过使用生成器而不是for循环<code>pd.concat()</code>可以改进这一点。此外,由于Yahoo API的工作方式,结束日期应设置为所需结束日期的结束或下一个结束日期的开始</p>