由于yahoo已经中止了大陆地区的服务,所以原来使用pandas_datareader模块,以及升级版本的yfinance模块,包括许多网络上介绍的方法,读取股票行情数据都是失败的,可能是雅虎接口变化引起的。经过两天的在谷歌查找终于找到解决方案,需要以下几步准备:
1.解决上网的问题,这是必须;
2.引入import io, requests , pandas as pd包,由于最新URLLib3最新库访问Https会报错,必须将URLLib3的版本从新版本降低到1.25.11 以下(pip install urllib3==1.25.7 ),这时使用 requests 的get方法读取股票数据。
3.通过get方法访问https://query1.finance.yahoo.com/v7/finance/download/得到一个excel文件,然后使用pandas.read_csv函数生成dataframe
def fetch(ticker, start="2022-01-01", end="2022-02-02",intervalstr="1d"):
headers = {
'User-Agent':
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2)
AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2
Safari/601.3.9'
}
url = "https://query1.finance.yahoo.com/v7/finance/download/" + str(ticker)
x = int(datetime.strptime(start, '%Y-%m-%d').timestamp())
y = int(datetime.strptime(end, '%Y-%m-%d').timestamp())
url += "?period1=" + str(x) + "&period2=" + str(y) +
"&interval="+intervalstr+"&events=history&includeAdjustedClose=true"
print(url)
r = requests.get(url, headers=headers,verify=False)
pd1 = pd.read_csv(io.StringIO(r.text), index_col=0, parse_dates=True)
return pd1
#使用AAPL测试
now =datetime.strptime('2022-05-30', '%Y-%m-%d')
print(int(now.timestamp()) )
startv = "2022-01-03"
endv =str( datetime.now().strftime("%Y-%m-%d"))
print(endv)
data = fetch("AAPL",start=startv,end=endv,intervalstr="1d")
print(data)
4.在雅虎我们免费只能取得股票的每天行情数据,其它一些基本数据,更多的数据被其移到finance plus 那么更多的股票数据必须花钱才能才能拿到。国内数据有tushare,baostock 包可以使用。