yfinance是一个Python开源工具,使用Yahoo公开api访问金融数据,地址finance.Yahoo.com从2021.11.1开始停止对国内的访问服务,使用需要在国外或者使用代理请求。
几乎所有的方法都在Ticker模块中。
例如:将 yfinance 导入为 yf 并为特定代码(股票)创建一个代码对象:
import yfinance as yf
aapl= yf.Ticker("aapl")
aapl
现在可以用这个aapl股票代码对象——在其上调用各种方法。要获取历史数据,可以使用 history() 方法。
history() 方法参数:
aapl_historical = aapl.history(start="2023-02-05", end="2023-02-11", interval="1m")
aapl_historical
aapl.actions
aapl.financials
一次下载多个股票的历史数据
data = yf.download("AMZN AAPL GOOG", start="2017-01-01", end="2017-04-30")
data
如果我们想按股票代码而不是开盘价/最高价/最低价/收盘价进行分组,我们可以这样做:
data = yf.download("AMZN AAPL GOOG", start="2017-01-01",end="2017-04-30", group_by='tickers')
用 yfinance 库下载期权数据
简而言之,期权是赋予交易者权利但没有义务在特定日期或之前以特定价格购买(看涨)或出售(看跌)他们所代表的标的资产的合约。
option_chain()方法:
它将参数作为输入: date:(YYYY-MM-DD),到期日。如果 None 返回所有期权数据。并且有 opt.calls 和 opt.puts 方法。
如何获得到期日期;
aapl.options
获取对话数据:
opt = aapl.option_chain(date='2020-07-24')
opt.calls
如何获得看跌期权数据:
opt.puts
最后, opts 本身会返回一个包含调用和将数据放在一起的代码对象。
pandas库提供了专门从财经网站获取金融数据的API接口,可作为量化交易股票数据获取的另一种途径,该接口在urllib3库基础上实现了以客户端身份访问网站的股票数据。需要注意的是目前模块已经迁徙到pandas-datareader包中,因此导入模块时需要由import pandas.io.data as web
更改为import pandas_datareader.data as web
DataReader方法介绍
查看Pandas的操作文档可以发现,第一个参数为股票代码,苹果公司的代码为"AAPL",国内股市采用的输入方式“股票代码”+“对应股市”,上证股票在股票代码后面加上“.SS”,深圳股票在股票代码后面加上“.SZ”。DataReader可从多个金融网站获取到股票数据,如“Yahoo! Finance” 、“Google Finance”等,这里以Yahoo为例。第三、四个参数为股票数据的起始时间断。返回的数据格式为DataFrame.
!pip3 install pandas_datareader --upgrade
import pandas_datareader as web
#载入数据,雅虎网中的601318.ss股票,从2020-01-01到2020-03-18的数据
start_date='2020-01-01'
end_date='2020-03-18'
data=web.data.DataReader('601318.ss','yahoo',start_date,end_date)
data.head()
参考:yfinance介绍 pandas_datareader
pip install yfinance
import yfinance as yf
import pandas as pd
DOW_30_TICKER = [
"AXP",
"AMGN",
"AAPL",
"BA",
"CAT",
"CSCO",
"CVX",
"GS",
"HD",
"HON",
"IBM",
"INTC",
"JNJ",
"KO",
"JPM",
"MCD",
"MMM",
"MRK",
"MSFT",
"NKE",
"PG",
"TRV",
"UNH",
"CRM",
"VZ",
"V",
"WBA",
"WMT",
"DIS",
"DOW",
]
class YahooDownloader:
#通过雅虎金融API接口提供获取日常股票数据
def __init__(self,start_date:str,end_date:str,ticker_list:list):#构造函数,用来实例化对象
self.start_date=start_date
self.end_date=end_date
self.ticker_list=ticker_list
def fetch_data(self,proxy=None):
#抓取数据,返回pd.DataFrame 7 columns:A date,open,high,low,close,volume and tick symbol
data_df=pd.DataFrame()
for tic in self.ticker_list:
temp_df=yf.download(tic,start=self.start_date,end=self.end_date,proxy=proxy)
temp_df['tic']=tic
data_df=data_df.append(temp_df)
print("刚下载的数据:")
print(data_df.head(5))
data_df = data_df.reset_index() #会将原来的索引index作为新的一列,使日期作为新的一列
print("使日期作为新的一列:")
print(data_df.head(5))
try:
#修改列名
data_df.columns=["date","open","high","low","close","adjcp","volumn","tic",]
#使用调整后的收盘价去代替收盘价
data_df["close"]=data_df["adjcp"]
#删除调整后的收盘价那一列
data_df=data_df.drop(labels="adjcp",axis=1)
except NotImplementedError:
print("the features are not supported currently")
#创建一周中的天数(星期一是0,星期天是6):Pandas.Series.dt.dayofweek
data_df['day']=data_df['date'].dt.dayofweek
#时间字符串转换为年月日方法,可以容易过滤
data_df['date']=data_df.date.apply(lambda x:x.strftime("%Y-%m-%d"))
#去除读入的数据中(DataFrame)含有NaN的行。
data_df=data_df.dropna()
data_df=data_df.reset_index(drop=True)#重置索引
print("处理后的数据:")
print(data_df.head(5))
print("Shape of DataFrame: ", data_df.shape)
# print("Display DataFrame: ", data_df.head())
data_df = data_df.sort_values(by=["date", "tic"]).reset_index(drop=True)
return data_df
df = YahooDownloader(start_date = TRAIN_START_DATE,
end_date = TRADE_END_DATE,
ticker_list = DOW_30_TICKER).fetch_data()