任何数据分析的第一步都是解析原始数据,包括从源中提取数据,然后清洗和填充缺失的数据(如果有的话)。虽然数据有多种形式,但Python使用有用的包可以很容易地读取时间序列数据。
这篇博客,我们将使用一些流行的python包检索和存储EOD数据和intraday数据。这些库旨在保持API的简单性,并使访问历史数据变得更容易。此外,我们还将了解如何从本地存储的传统数据源读取数据。
概念准备
但是先不急,我们先看一看金融数据的特性,在这里我们引入“时间序列”这个概念。时间序列是按时间顺序索引的一系列数据点。在等距时间点观察到的股票、商品和外汇价格系列等金融数据就是时间序列的一个例子。时间序列通常以滴答、秒、分、小时、日、周、月、季度和年为单位。它是一组按固定时间间隔观测的数据点序列,观测的频率是很重要的一个影响因素。关于时间序列的代码不多,文章最后我们会看到。
在了解时间序列和金融数据后,再介绍一下我们之前提到的EOD数据和intraday数据。
End-of-day (EOD) data 和 intraday data 都是金融市场数据的类型,但它们在时间范围和提供的信息类型上存在差异。
End-of-day data 指的是在交易日结束时捕获和记录的市场数据。它提供有关证券的开盘价和收盘价、当日最高和最低价以及交易量的信息。这种类型的数据通常由交易员和投资者用于分析市场趋势并做出针对下一个交易日的明智投资决策。
另一方面,intraday data 则在交易日内以较短的时间间隔提供市场数据,例如每分钟、每五分钟或每小时。Intraday data 提供更细致的市场活动信息,包括价格变动、交易量和买卖价差。这种类型的数据被日间交易员和其他投资者用于实时密切监测市场活动以便根据短期市场波动快速做出决策。
总之,虽然 end-of-day data 提供了交易日结束时市场活动的快照,intraday data 则提供了更详细的市场活动信息,因为它在整个交易日内提供了市场活动的实时信息。
导入库
这里我们导入会用到的library。
# Import data manipulation libraries
import pandas as pd
import numpy as np
# Import yahoo finance library
# 如果没有可以先下载,后面没有也一样,可能需要翻墙,下载代码如下:
# !pip install yfinance
import yfinance as yf
# Import cufflinks for visualization
import cufflinks as cf
cf.set_config_file(offline=True)
# Ignore warnings - optional
import warnings
warnings.filterwarnings('ignore')
# Check the package version
pd.__version__, cf.__version__, yf.__version__
数据检索
这里我们会使用yfinance.download这个function来检索数据。想了解function attributes和它的output可以运行以下代码。
# help(yf.download)
yf.download?
后面我们会分别介绍如何检索EOD, Intraday, Options data.
检索EOD数据
当使用 yfinance 检索公司股票的每日收盘数据时,period 参数被设置为 “max”。这意味着我们正在请求该股票最早可用日期以来的历史数据,这可能会因股票和数据提供商而异。使用 “max” 作为 period 参数在我们想要检索给定股票尽可能多的历史数据时非常有用。
但是,在我提供的示例代码中,我们还可以通过将 period 参数设置为特定值(例如 “5d”、“1m”、“3mo”、“1y” 等)来指定较短的时间段。这些值表示不同的时间段,如五天、一个月、三个月、一年等。检索EOD时,这里我们选取5d。
使用 “max” 的原因是检索一支股票的所有可用历史数据。但是,根据用例,我们也可以将 period 参数设置为特定值,以指定较短的时间段。
# Fetch the data by specifying the number of period
df1 = yf.download('SPY', period='5d', progress=False)
# Display the first five rows of the dataframe to check the results.
df1.head()
我们可以不用period,而是通过设立start date和end date来检索特定时间的数据。
# Fetch data by specifying the the start and end dates
df2 = yf.download('SPY', start='2022-01-01', end='2022-12-31', progress=False)
# Display the first five rows of the dataframe to check the results.
df2.head()
这里插入一个无关痛痒的内容。如果想显示结果的最后五行,运行以下代码。
df2.tail()
下面是另外一个例子。
# Fetch data for year to date (YTD)
df3 = yf.download('SPY', period='ytd', progress=False)
# Display the last five rows of the dataframe to check the results.
df3.tail()
检索多个证券的每日收盘价
上一小节我们只检索了SPY的数据。如果我们想同时知道多家公司在同一交易日的历史收盘价数据呢?下面以几个纳斯达克上市公司为例,我们想检索苹果、亚马逊、微软、英伟达、特斯拉的历史数据。
# Specify stocks
nasdaq_stocks = ['AAPL', 'AMZN', 'MSFT', 'NVDA', 'TSLA']
# this is list of stocks
nasdaq_stocks
# Fetch data for multiple stocks at once
df4 = yf.download(nasdaq_stocks, period='ytd', progress=False)['Adj Close']
# Display dataframe
df4.tail()
检索多个证券的多个数据点
前面几个例子,我们分别对一直证券、多只证券检索了收盘价。但是要描述特定证券,我们不但但只有收盘价。
OHLCV 是金融市场中常用的缩写词,尤其在交易和投资领域中使用。它代表开盘价、最高价、最低价、收盘价和成交量等五个关键数据点,通常用于描述特定金融工具(如股票、商品或货币)的价格和交易活动。
- 开盘价指的是交易会话开始时工具的价格。
- 最高价指的是交易会话中工具达到的最高价格。
- 最低价指的是交易会话中工具达到的最低价格。
- 收盘价指的是交易会话结束时工具的价格。
- 成交量指的是交易会话期间交易的股票、合同或工具数量总计。
OHLCV 数据通常以蜡烛图的形式显示,提供了一个对给定时间段内价格走势和交易活动的视觉表现。通过分析 OHLCV 数据,交易员和投资者可以深入了解特定工具的供需动态,并做出更明智的交易决策。后面我们也会见到蜡烛图,但是不急,我们先进行一些铺垫。
仍然是之前提到的那五家公司股票,我们想知道它们的OHLCV。
# Fetch data for multiple fields using comprehension
ohlcv= {
symbol: yf.download(symbol, period='250d', progress=False)
for symbol in nasdaq_stocks}
ohlcv
信息已经都有了,但如果在整个OHLCV中,我只想知道英伟达的数据,又要怎么办呢?见以下代码。