本文目录导读:

- 使用akshare库(推荐,数据来源丰富)
- 使用tushare库(需要注册获取token)
- 使用baostock库(免费,数据质量好)
- 使用yfinance库(获取美股和港股)
- 综合示例:股票数据获取与分析
- 安装依赖
- 注意事项
我来介绍几种Python获取股票数据的常用方法:
使用akshare库(推荐,数据来源丰富)
import akshare as ak
import pandas as pd
# 获取A股实时行情
def get_stock_realtime():
# 获取所有A股实时数据
df = ak.stock_zh_a_spot_em()
return df
# 获取历史数据
def get_stock_history(symbol="000001", start_date="20240101", end_date="20241231"):
# 获取个股历史行情
df = ak.stock_zh_a_hist(symbol=symbol,
period="daily",
start_date=start_date,
end_date=end_date,
adjust="qfq") # qfq:前复权
return df
# 获取板块数据
def get_sector_data():
df = ak.stock_board_industry_name_em()
return df
# 使用示例
if __name__ == "__main__":
# 获取贵州茅台历史数据
stock_data = get_stock_history("600519", "20240101", "20241231")
print(stock_data.head())
# 获取实时行情
realtime = get_stock_realtime()
print(realtime.head())
使用tushare库(需要注册获取token)
import tushare as ts
# 需要先注册获取token
token = "your_token_here"
ts.set_token(token)
pro = ts.pro_api()
def get_tushare_data():
# 获取日线行情
df = pro.daily(ts_code="000001.SZ",
start_date="20240101",
end_date="20241231")
return df
# 获取实时行情
def get_realtime_quote():
df = ts.get_today_ticks("000001")
return df
使用baostock库(免费,数据质量好)
import baostock as bs
import pandas as pd
# 登录系统
lg = bs.login()
def get_baostock_data():
# 获取历史K线数据
rs = bs.query_history_k_data_plus(
"sh.600519", # 贵州茅台
"date,code,open,high,low,close,volume,amount,adjustflag",
start_date='2024-01-01',
end_date='2024-12-31',
frequency="d", # 日线
adjustflag="3" # 不复权
)
# 转换为DataFrame
data_list = []
while rs.error_code == '0' and rs.next():
data_list.append(rs.get_row_data())
df = pd.DataFrame(data_list, columns=rs.fields)
return df
# 退出系统
bs.logout()
使用yfinance库(获取美股和港股)
import yfinance as yf
def get_yahoo_finance():
# 获取美股数据
msft = yf.Ticker("MSFT")
# 获取历史数据
hist = msft.history(period="1y")
# 获取实时信息
info = msft.info
# 获取港股
tencent = yf.Ticker("0700.HK")
tencent_hist = tencent.history(period="1mo")
return hist, info
综合示例:股票数据获取与分析
import akshare as ak
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
class StockDataFetcher:
def __init__(self):
self.data = None
def get_stock_data(self, symbol, days=60):
"""
获取股票数据并添加技术指标
"""
end_date = datetime.now().strftime("%Y%m%d")
start_date = (datetime.now() - timedelta(days=days)).strftime("%Y%m%d")
# 获取数据
df = ak.stock_zh_a_hist(
symbol=symbol,
period="daily",
start_date=start_date,
end_date=end_date,
adjust="qfq"
)
# 数据清洗和重命名
df.columns = ['日期', '开盘', '收盘', '最高', '最低', '成交量', '成交额',
'振幅', '涨跌幅', '涨跌额', '换手率']
df['日期'] = pd.to_datetime(df['日期'])
# 添加技术指标
self._add_technical_indicators(df)
return df
def _add_technical_indicators(self, df):
"""添加技术指标"""
# 移动平均线
df['MA5'] = df['收盘'].rolling(window=5).mean()
df['MA10'] = df['收盘'].rolling(window=10).mean()
df['MA20'] = df['收盘'].rolling(window=20).mean()
# 布林带
df['20标准差'] = df['收盘'].rolling(window=20).std()
df['上轨'] = df['MA20'] + 2 * df['20标准差']
df['下轨'] = df['MA20'] - 2 * df['20标准差']
# RSI指标
delta = df['收盘'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
rs = gain / loss
df['RSI'] = 100 - (100 / (1 + rs))
return df
# 使用示例
def main():
fetcher = StockDataFetcher()
# 获取股票数据
stock_code = "000001" # 平安银行
data = fetcher.get_stock_data(stock_code, days=100)
print(f"股票代码: {stock_code}")
print("最新数据:")
print(data.tail())
# 简单分析
latest = data.iloc[-1]
print(f"\n最新收盘价: {latest['收盘']:.2f}")
print(f"涨幅: {latest['涨跌幅']:.2f}%")
print(f"RSI指标: {latest['RSI']:.2f}")
if __name__ == "__main__":
main()
安装依赖
pip install akshare tushare baostock yfinance pandas numpy
注意事项
- 数据频率限制:免费API通常有调用频率限制
- 数据延迟:非交易时间的数据可能有延迟
- 跨市场支持:不同库支持不同市场
- 稳定性:建议添加异常处理和重试机制
- 合规性:注意遵守各平台的使用条款
选择哪个库取决于你的具体需求:
- 国内A股:akshare或baostock
- 美股/港股:yfinance
- 专业量化:tushare(需要付费获取更多数据)