数据是量化投资的基石。本文带你5分钟上手Python股票数据获取,从零搭建你的量化数据源。
一、为什么选择AKShare?
在Python金融数据领域,有几大主流选择:
| 工具 | 优点 | 缺点 | 适用场景 |
|---|
| AKShare | 免费、数据全、更新快 | 偶有稳定性问题 | 个人研究、回测 |
| Tushare | 数据质量高、稳定 | 高级数据需积分 | 生产环境 |
| YFinance | 美股数据方便 | A股支持有限 | 美股分析 |
| JoinQuant | 集成度高 | 需平台依赖 | 策略回测 |
AKShare的优势:
- • ✅ 完全免费,无需注册
- • ✅ A股数据全面(行情、财务、宏观、期货)
- • ✅ 更新及时,支持实时数据
- • ✅ 社区活跃,文档完善
二、环境准备
安装AKShare
pip install akshare -i https://pypi.tuna.tsinghua.edu.cn/simple
依赖库
pip install pandas matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
三、实战代码
3.1 获取股票列表
import akshare as ak
# 获取所有A股股票列表
stock_df = ak.stock_zh_a_spot_em()
print(f"A股上市公司数量:{len(stock_df)}")
print(stock_df.head(10)[['代码', '名称', '最新价', '涨跌幅']])
输出示例:
A股上市公司数量:5389
代码 名称 最新价 涨跌幅
0 000001 平安银行 10.25 1.28
1 000002 万科A 8.56 -0.58
2 000063 中兴通讯 28.90 2.15
...
3.2 获取个股历史K线
import akshare as ak
import pandas as pd
# 获取贵州茅台历史日线数据
df = ak.stock_zh_a_hist(
symbol="600519", # 股票代码
period="daily", # 周期:daily, weekly, monthly
start_date="20240101", # 开始日期
end_date="20260323", # 结束日期
adjust="qfq" # 复权:qfq前复权,hfq后复权
)
print(f"获取到 {len(df)} 条数据")
print(df.tail())
输出示例:
获取到 299 条数据
日期 开盘 收盘 最高 最低 成交量
294 2026-03-17 1580.0 1575.0 1588.0 1568.0 15234
295 2026-03-18 1576.0 1590.0 1595.0 1570.0 18956
...
3.3 获取实时行情
import akshare as ak
import time
# 获取多只股票的实时行情
codes = ['600519', '000858', '002594'] # 茅台、五粮液、比亚迪
for code in codes:
df = ak.stock_zh_a_spot_em()
stock = df[df['代码'] == code]
if not stock.empty:
name = stock['名称'].values[0]
price = stock['最新价'].values[0]
change = stock['涨跌幅'].values[0]
print(f"{name}({code}): ¥{price}, 涨跌: {change}%")
time.sleep(0.5) # 避免请求过快
3.4 数据可视化
import akshare as ak
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
# 获取数据
df = ak.stock_zh_a_hist(symbol="600519", period="daily",
start_date="20241001", end_date="20260323", adjust="qfq")
# 转换日期
df['日期'] = pd.to_datetime(df['日期'])
# 绘制K线图简化版(收盘价走势)
plt.figure(figsize=(12, 6))
plt.plot(df['日期'], df['收盘'], label='收盘价', color='#0F4C81', linewidth=1.5)
plt.fill_between(df['日期'], df['收盘'], alpha=0.3, color='#0F4C81')
# 添加均线
df['MA5'] = df['收盘'].rolling(window=5).mean()
df['MA20'] = df['收盘'].rolling(window=20).mean()
plt.plot(df['日期'], df['MA5'], label='MA5', color='orange', linewidth=1)
plt.plot(df['日期'], df['MA20'], label='MA20', color='red', linewidth=1)
plt.title('贵州茅台(600519) 股价走势', fontsize=14, fontweight='bold')
plt.xlabel('日期')
plt.ylabel('价格(元)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
3.5 批量获取多只股票数据
import akshare as ak
import pandas as pd
def get_stock_data_batch(codes, start_date, end_date):
"""
批量获取多只股票的历史数据
Parameters:
codes: 股票代码列表,如 ['600519', '000858']
start_date: 开始日期 '20240101'
end_date: 结束日期 '20260323'
Returns:
dict: {股票代码: DataFrame}
"""
data_dict = {}
for code in codes:
try:
df = ak.stock_zh_a_hist(
symbol=code,
period="daily",
start_date=start_date,
end_date=end_date,
adjust="qfq"
)
data_dict[code] = df
print(f"✅ 成功获取 {code},共 {len(df)} 条数据")
except Exception as e:
print(f"❌ 获取 {code} 失败: {e}")
return data_dict
# 使用示例
stocks = ['600519', '000858', '002594', '300750']
data = get_stock_data_batch(stocks, '20250101', '20260323')
# 计算收益率
for code, df in data.items():
start_price = df['收盘'].iloc[0]
end_price = df['收盘'].iloc[-1]
return_rate = (end_price - start_price) / start_price * 100
print(f"{code}: 收益率 {return_rate:.2f}%")
四、进阶技巧
4.1 获取指数数据
import akshare as ak
# 获取上证指数历史数据
sh_index = ak.index_zh_a_hist(symbol="000001", period="daily",
start_date="20250101", end_date="20260323")
print(sh_index.tail())
# 获取行业板块数据
sector_df = ak.stock_board_industry_name_em()
print(sector_df.head(10))
4.2 获取财务数据
import akshare as ak
# 获取个股财务指标
finance_df = ak.stock_financial_analysis_indicator(symbol="600519")
print(finance_df[['报告期', '营业收入', '净利润', 'ROE']].head())
五、完整实战案例
"""
股票数据获取完整示例
功能:获取指定股票近期数据,计算基础统计指标
"""
import akshare as ak
import pandas as pd
import numpy as np
def analyze_stock(code, name, days=30):
"""分析单只股票"""
# 获取数据
df = ak.stock_zh_a_hist(symbol=code, period="daily",
start_date="20250201", end_date="20260323")
# 取最近N天
recent = df.tail(days)
# 计算指标
stats = {
'股票代码': code,
'股票名称': name,
'最新价': recent['收盘'].iloc[-1],
'区间最高': recent['最高'].max(),
'区间最低': recent['最低'].min(),
'区间涨幅': (recent['收盘'].iloc[-1] / recent['收盘'].iloc[0] - 1) * 100,
'日均成交量': recent['成交量'].mean(),
'波动率': recent['涨跌幅'].std()
}
return stats
# 分析多只股票
watchlist = [
('600519', '贵州茅台'),
('000858', '五粮液'),
('002594', '比亚迪'),
('300750', '宁德时代')
]
results = []
for code, name in watchlist:
try:
stats = analyze_stock(code, name, days=30)
results.append(stats)
print(f"✅ {name} 分析完成")
except Exception as e:
print(f"❌ {name} 分析失败: {e}")
# 汇总展示
result_df = pd.DataFrame(results)
print("\n" + "="*60)
print("股票分析汇总")
print("="*60)
print(result_df.to_string(index=False))
六、常见问题
Q1: 获取数据时报错怎么办?
# 添加异常处理
try:
df = ak.stock_zh_a_hist(symbol="600519")
except Exception as e:
print(f"获取失败: {e}")
# 可尝试更换数据源或重试
Q2: 如何保存数据到本地?
# 保存为CSV
df.to_csv('stock_data.csv', index=False, encoding='utf-8-sig')
# 保存为Excel
df.to_excel('stock_data.xlsx', index=False)
Q3: 数据更新频率?
- • 日线数据:交易日收盘后更新
- • 实时行情:盘中每几秒更新
- • 财务数据:季报/年报发布后更新
七、下节预告
下一期我们将学习: 《用Python计算技术指标:MACD金叉死叉实战》
- • MACD指标原理详解
- • Python实现MACD计算
- • 金叉死叉信号识别
- • 回测策略初探
完整代码已上传,复制即可运行。建议动手实践,遇到问题欢迎在评论区交流!
本文代码基于AKShare 1.15+版本,Python 3.8+环境测试通过。