很多初学者认为量化交易的门槛极高,必须购买昂贵的终端或数据接口。事实并非如此。量化的第一步,是让我们的视野从“K线图”转化为“数据表”。
今天,我们将抛弃传统看盘软件,使用纯 Python 代码,零成本、合规地获取 A 股的历史行情数据。这是构建所有量化策略(尤其是后续我们要做的短线动量和微观结构策略)的唯一基石。
在获取数据之前,我们需要准备两个核心工具:
pip install akshare pandas我们以获取“平安银行 (000001)”的历史日 K 线数据为例。 在编写量化代码时,有一个极其重要的避坑准则:不要依赖裸露的 try/except 来捕获数据获取阶段的错误。这会掩盖网络断连或接口变更的致命问题。 我们应该让代码在遇到无效数据时“尽早报错 (Fail Fast)”,并在逻辑中主动检查数据的完整性。
import akshare as ak
import pandas as pd
def fetch_a_share_daily_data(symbol: str, start_date: str, end_date: str) -> pd.DataFrame:
"""
获取 A 股复权历史日线数据
参数:
symbol: 股票代码 (例如: '000001')
start_date: 开始日期 (格式: 'YYYYMMDD')
end_date: 结束日期 (格式: 'YYYYMMDD')
"""
print(f"正在获取 {symbol} 从 {start_date} 到 {end_date} 的行情数据...")
# 使用 akshare 获取前复权数据 (前复权最适合用于策略回测和信号计算)
df = ak.stock_zh_a_hist(symbol=symbol, period="daily", start_date=start_date, end_date=end_date, adjust="qfq")
# 主动校验数据完整性,拒绝使用 try/except 掩盖潜在的网络或接口错误
if df is None or df.empty:
raise ValueError(f"警告: 无法获取 {symbol} 的数据。请检查网络连接或股票代码是否正确。")
# 数据清洗:重命名列名,使其符合量化标准英文命名规范
rename_columns = {
'日期': 'date',
'开盘': 'open',
'收盘': 'close',
'最高': 'high',
'最低': 'low',
'成交量': 'volume',
'成交额': 'amount'
}
df = df.rename(columns=rename_columns)
# 将日期列转换为标准的 datetime 格式,并设置为索引
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
# 只保留量化回测最核心的列
df = df[['open', 'high', 'low', 'close', 'volume', 'amount']]
return df
# === 执行与测试 ===
if __name__ == "__main__":
# 获取平安银行 2023年1月1日 到 2023年12月31日 的数据
target_stock = "000001"
df_pingan = fetch_a_share_daily_data(symbol=target_stock, start_date="20230101", end_date="20231231")
# 打印前 5 行数据,验证结果
print("\n数据获取成功!前5个交易日数据如下:")
print(df_pingan.head())运行上述代码后,你会看到表格数据(DataFrame)。这标志着你的量化研究已经正式脱离了视觉直觉,进入了数学建模阶段。
一旦数据变成了 Pandas DataFrame 结构,它就像是被摆上了手术台。我们不再需要用肉眼去观察均线交叉或资金异动,而是可以用几行数学公式,在一秒钟内遍历过去十年的所有交易日,找出符合我们交易逻辑的入场点。
本期思考题:
尝试修改代码中的 symbol 参数,获取你最关注的一只股票(例如某只光伏或科技白马股)的数据,看看能否成功打印出来?
这第一篇文章为你搭建好了本地数据获取的底座。下一步,你是想学习如何用 Pandas 清洗这些数据并计算收益率,还是想直接切入如何用这些数据计算短线交易的技术指标?