afdata是一个专为金融与财经数据分析设计的Python第三方库,聚焦于A股市场数据的获取、清洗、分析及可视化。该工具整合了多个主流财经数据平台(如Tushare、东方财富、同花顺等)的数据接口,并封装了高频处理、技术指标计算以及回测支持等功能,显著提升了金融数据工作的效率和便捷性。本文将从多个维度对该库进行系统解析。
afdata围绕“A股数据全生命周期管理”构建其核心架构,各模块分工明确,覆盖从原始数据获取到最终策略验证的完整流程:
| 模块名称 | 主要功能描述 |
|---|---|
| afdata.stock | 提供股票基础信息(代码、名称、行业分类)、历史K线数据、分时行情以及实时股价抓取 |
| afdata.indicator | 集成常用技术指标计算功能,包括MA、EMA、MACD、RSI、BOLL、KDJ、成交量相关指标,支持自定义周期参数 |
| afdata.finance | 获取企业财务报表数据(利润表、资产负债表、现金流量表),并可自动计算关键财务比率如ROE、PE、PB等 |
| afdata.clean | 内置数据清洗能力,涵盖缺失值填补、异常值识别、复权处理、停牌数据修正、时间格式标准化等操作 |
| afdata.visual | 支持多种金融图表绘制,如K线图、叠加技术指标的行情图、财务数据对比图,兼容交互式可视化输出 |
| afdata.utils | 包含实用辅助工具,例如股票代码格式转换、时间区间生成、数据类型转换、多线程并发下载机制 |
| afdata.backtest | 提供轻量级回测框架,可用于基于技术信号的策略测试,支持收益曲线生成、最大回撤统计等评估指标 |
方式一:通过PyPI安装(推荐方式)
pip install afdata -U # 使用-U参数确保升级至最新版
方式二:源码安装(适用于开发测试或定制化需求)
git clone https://github.com/afdata-team/afdata.git
cd afdata
python setup.py install
安装完成后可通过以下代码确认是否成功:
import afdata
print(afdata.__version__) # 输出当前版本号,无错误即表示安装正常
print(afdata.__doc__) # 查看包文档说明
afdata采用“模块名.函数名”的统一调用风格,接口简洁清晰。大部分核心函数共享以下通用参数:
code
start_date
end_date
freq
adjust
source
1. 获取股票历史行情数据
使用afdata.stock.get_stock_hist函数拉取指定时间段内的K线信息:
from afdata.stock import get_stock_hist
# 参数说明:
# code: 股票代码
# start_date: 开始日期
# end_date: 结束日期
# freq: 数据频率
# adjust: 复权类型
df = get_stock_hist(
code="600036",
start_date="2023-01-01",
end_date="2023-12-31",
freq="day",
adjust="forward"
)
print(df.head()) # 展示前几行数据,字段通常包含日期、开盘价、收盘价、最高价、最低价、成交量等
2. 计算常用技术指标
利用afdata.indicator.cal_tech_index对已有行情数据追加技术分析结果:
from afdata.indicator import cal_tech_index
# 在原有DataFrame基础上添加MACD、RSI、BOLL等指标列
df_with_indicator = cal_tech_index(
df=df, # 输入由get_stock_hist返回的行情数据
indicators=["MACD", "RSI", "BOLL"], # 指定需计算的指标列表
rsi_period=14 # RSI计算周期,默认为14期
)
macd_fast=12, macd_slow=26, macd_signal=9, # MACD参数
boll_period=20, boll_dev=2 # BOLL参数(周期20,标准差2)
)
print(df_with_indicator[["date", "close", "MACD", "RSI", "BOLL_MID"]].tail())
from afdata.finance import get_finance_data
# 获取招商银行2022-2023年年度财务数据
finance_df = get_finance_data(
code="600036",
start_year=2022,
end_year=2023,
report_type="annual", # 报告类型:annual=年报,quarter=季报,half=中报
fields=["roe", "pe_ttm", "pb", "revenue", "profit"] # 要获取的财务字段
)
print(finance_df)
from afdata.visual import plot_kline
# 绘制带MACD和成交量的K线图
plot_kline(
df=df_with_indicator,
code="600036",
indicators=["MACD", "VOL"], # 叠加MACD和成交量
save_path="./600036_kline.png", # 保存路径(可选,不填则显示)
figsize=(15, 8) # 图表尺寸
)
需求:获取贵州茅台(600519)2024年日线数据,并统计其日均成交量及出现最大涨幅的具体日期。
from afdata.stock import get_stock_hist
import pandas as pd
# 1. 获取数据
df = get_stock_hist(
code="600519",
start_date="2024-01-01",
end_date="2024-10-01",
adjust="forward"
)
# 2. 计算每日涨跌幅
df["daily_return"] = (df["close"] - df["open"]) / df["open"] * 100
# 3. 基础分析处理
avg_volume = df["volume"].mean() # 日均成交量
max_return_day = df.loc[df["daily_return"].idxmax(), "date"] # 涨幅最大的交易日
max_return = df["daily_return"].max() # 最大单日涨幅
print(f"贵州茅台2024年日均成交量:{avg_volume:.2f}手")
print(f"最大涨幅日:{max_return_day},涨幅:{max_return:.2f}%")
需求:统计并比较招商银行(600036)与平安银行(000001)在2024年内发生的MACD金叉次数。
from afdata.stock import get_stock_hist
from afdata.indicator import cal_tech_index
def count_macd_gold_cross(df):
"""计算MACD金叉发生次数(即DIFF线上穿DEA线)"""
df["gold_cross"] = (df["DIFF"] > df["DEA"]) & (df["DIFF"].shift(1) <= df["DEA"].shift(1))
return df["gold_cross"].sum()
# 1. 分别获取两只股票的历史行情并计算技术指标
stocks = ["600036", "000001"]
gold_cross_count = {}
for code in stocks:
df = get_stock_hist(code=code, start_date="2024-01-01", end_date="2024-10-01")
df = cal_tech_index(df, indicators=["MACD"])
gold_cross_count[code] = count_macd_gold_cross(df)
# 2. 输出对比结果
print("MACD金叉次数对比:")
for code, count in gold_cross_count.items():
print(f"{code}:{count}次")
需求:基于给定的财务数据接口,筛选出具备较高净资产收益率(ROE)的上市公司股票。
案例3:筛选高ROE低PE的银行股
# 获取申万银行行业中2023年ROE大于10%且PE_TTM小于15的股票
from afdata.finance import get_industry_stocks, get_finance_data
# 第一步:提取银行行业的全部成分股代码
bank_codes = get_industry_stocks(industry="银行", source="eastmoney")
# 第二步:逐个获取财务指标并进行条件筛选
high_roe_stocks = []
for code in bank_codes[:20]: # 限制为前20只股票,防止请求频率过高
try:
finance_df = get_finance_data(
code=code,
start_year=2023,
end_year=2023,
report_type="annual",
fields=["roe", "pe_ttm"]
)
if not finance_df.empty:
roe = finance_df.iloc[0]["roe"]
pe_ttm = finance_df.iloc[0]["pe_ttm"]
# 筛选条件:ROE > 10%,PE_TTM < 15,且非空值
if roe > 10 and pe_ttm < 15 and not pd.isna(roe) and not pd.isna(pe_ttm):
high_roe_stocks.append({"code": code, "roe": roe, "pe_ttm": pe_ttm})
except Exception as e:
print(f"获取{code}数据失败:{e}")
continue
# 第三步:展示符合条件的股票列表
print("高ROE低PE银行股:")
for stock in high_roe_stocks:
print(f"代码:{stock['code']},ROE:{stock['roe']:.2f}%,PE_TTM:{stock['pe_ttm']:.2f}")
案例4:股票分时数据异常值检测与清洗处理
# 目标:识别并处理某只股票分钟级价格中的异常波动(例如超出均值3倍标准差的数据点)
from afdata.stock import get_stock_min
from afdata.clean import detect_outliers, fill_missing
# 1. 获取指定日期的分钟线行情数据
df_min = get_stock_min(
code="600036",
date="2024-10-08",
freq="5min" # 使用5分钟K线
)
# 2. 对收盘价字段执行异常值检测(基于标准差方法)
df_min = detect_outliers(
df=df_min,
fields=["close"], # 检测对象为收盘价
method="std", # 采用标准差法
threshold=3 # 阈值设定为3倍标准差
)
# 3. 对清洗后产生的缺失数据进行填补(按时间轴线性插值)
df_min = fill_missing(
df=df_min,
field="close",
method="linear" # 使用线性插值填充
)
# 4. 输出清洗前后对比统计信息
print(f"清洗前异常值数量:{df_min['close_outlier'].sum()}")
print(f"清洗后缺失值数量:{df_min['close'].isna().sum()}")
code
案例5:基于RSI指标的简单交易策略回测
# 回测目标:在招商银行(600036)2023年度行情中,验证“RSI低于30买入,高于70卖出”的策略收益表现
from afdata.stock import get_stock_hist
from afdata.indicator import cal_tech_index
from afdata.backtest import simple_backtest
# 步骤一:获取历史行情并计算技术指标RSI(周期14)
df = get_stock_hist(code="600036", start_date="2023-01-01", end_date="2023-12-31")
df = cal_tech_index(df, indicators=["RSI"], rsi_period=14)
# 步骤二:生成买卖信号
df["signal"] = 0
df.loc[df["RSI"] < 30, "signal"] = 1 # RSI低于30视为买入信号
df.loc[df["RSI"] > 70, "signal"] = -1 # RSI高于70视为卖出信号
# 步骤三:执行简易回测(初始资金10万元,交易手续费0.05%)
backtest_result = simple_backtest(
df=df,
signal_col="signal",
initial_capital=100000,
fee_rate=0.0005
)
# 步骤四:输出最终回测结果摘要
print("策略回测结果:")
总收益:{backtest_result['total_return']:.2f}元 收益率:{backtest_result['return_rate']:.2f}% 最大回撤:{backtest_result['max_drawdown']:.2f}% 交易次数:{backtest_result['trade_count']}次
需求说明:对2024年9月期间申万分类下的各行业板块进行平均涨跌幅的计算与分析。
实现步骤如下:
代码实现:
from afdata.stock import get_industry_stocks, get_stock_hist
import pandas as pd
# 获取全部行业名称
industries = get_industry_stocks(return_industry_list=True, source="eastmoney")
# 存储各行业平均回报
industry_return = {}
for industry in industries[:10]: # 仅处理前10个行业
codes = get_industry_stocks(industry=industry)
if not codes:
continue
returns = []
for code in codes[:10]: # 每行业取前10只股票样本
try:
df = get_stock_hist(
code=code,
start_date="2024-09-01",
end_date="2024-09-30"
)
if len(df) < 2:
continue
# 计算整月价格变动比例
monthly_return = (df.iloc[-1]["close"] - df.iloc[0]["open"]) / df.iloc[0]["open"] * 100
returns.append(monthly_return)
except Exception:
continue
if returns:
industry_return[industry] = sum(returns) / len(returns)
# 按照平均涨幅降序排列
sorted_industries = sorted(industry_return.items(), key=lambda x: x[1], reverse=True)
print("2024年9月各行业平均涨跌幅(前10):")
for industry, ret in sorted_industries:
print(f"{industry}:{ret:.2f}%")
目标描述:展示招商银行(600036)与工商银行(601398)在2019至2023年度的营业收入变化趋势,并以柱状图形式呈现对比效果。
操作流程包括:
具体代码如下:
from afdata.finance import get_finance_data
from afdata.visual import plot_finance_compare
# 设定目标公司代码
codes = ["600036", "601398"]
finance_data = {}
for code in codes:
df = get_finance_data(
code=code,
start_year=2019,
end_year=2023,
report_type="annual",
fields=["revenue"]
)
finance_data[code] = df["revenue"].tolist()
# 绘制营收对比图表
plot_finance_compare(
data=finance_data,
x_labels=["2019", "2020", "2021", "2022", "2023"],
metric="营收(亿元)",
title="招商银行VS工商银行2019-2023年营收对比",
save_path="./revenue_compare.png",
figsize=(12, 6)
)
应用场景:设定一个自选股观察池,程序定时拉取最新行情,识别是否有个股触及涨停状态,并即时输出提示信息。
关键逻辑点:
实现代码:
from afdata.stock import get_stock_realtime
import time
# 自选股票池
watch_list = ["600036", "600519", "000001", "601318"]
stop_limit_rate = 0.1 # A股主板涨停标准
print("开始监控涨停股票(每10秒刷新一次)...")
while True:
try:
for code in watch_list:
realtime_data = get_stock_realtime(code=code)
if not realtime_data:
continue
last_close = realtime_data.get("last_close", 0)
current_price = realtime_data.get("price", 0)
if last_close > 0 and current_price >= last_close * (1 + stop_limit_rate):
print(f"[警告] 股票 {code} 已涨停!当前价:{current_price:.2f}")
except Exception as e:
print(f"数据获取异常:{e}")
time.sleep(10) # 暂停10秒后再次检查
code
current_price = realtime_data["price"]
pre_close = realtime_data["pre_close"]
rise_rate = (current_price - pre_close) / pre_close
# 检测涨停
if rise_rate >= stop_limit_rate - 0.001: # 允许0.1%误差
print(f"【涨停预警】{code} 当前价:{current_price},涨幅:{rise_rate*100:.2f}%")
time.sleep(10) # 10秒刷新一次
except KeyboardInterrupt:
print("\n监控结束")
break
except Exception as e:
print(f"监控异常:{e}")
time.sleep(10)
continue
| 问题类型 | 典型提示信息 | 解决方式 |
|---|---|---|
| 股票代码格式不正确 | “Code format error: 600036sh” | 统一采用6位数字(如"600036")或添加市场前缀如"sh600036"/"sz000001” |
| 数据接口请求失败 | “Request failed: eastmoney API error” | 1. 更换数据源参数(例如切换为"tushare");2. 检查网络连接状态;3. 降低调用频率 |
| 返回数据为空 | “Empty DataFrame” | 1. 核实日期范围是否有效;2. 确认该股票已上市(新股可能无历史记录);3. 检查复权设置是否匹配 |
| 依赖库版本冲突 | “AttributeError: ‘DataFrame’ object has no attribute ‘to_numpy’” | 将pandas升级至兼容版本(推荐执行:pip install pandas==1.5.3) |
| 周期参数设置错误 | “Invalid freq: ‘daily’” | 请严格使用支持的周期标识:“day”、“week”、“month”、“min” |
| 财务字段不存在 | “Field ‘roa’ not found” | 查阅afdata.finance.get_finance_data文档,确保使用合法字段名称 |
| 接口访问被限流 | “Too many requests, limit 100/min” | 1. 使用afdata.utils.multithread_download控制并发量;2. 在请求间加入延迟(time.sleep) |
| 缺少复权数据 | “Adjust data missing for 600036” | 尝试将adjust设为"none"(不复权),或更换数据提供方(如从"eastmoney"改为"tushare") |
遵守数据源使用规范:afdata所集成的第三方平台(如东方财富、同花顺等)所提供的数据仅供个人学习和研究用途。若用于商业场景,需获得原始数据服务商的正式授权。
合理控制请求频率:高频访问(尤其是分钟级行情和实时报价)容易触发接口限流机制,建议采取以下措施:
afdata.utils.multithread_download(默认并发数为5);关注数据更新时效性:
正确理解复权处理方式:
afdata.clean.adjust_dividend 进行二次校正,以保证连续性。处理异常值:分钟线与实时价格可能出现极端波动(如操作失误导致的“乌龙指”),必须通过
afdata.clean.detect_outliers 等手段进行数据清洗。
注意版本兼容性:升级afdata前请备份现有脚本。部分版本会调整函数接口,例如cal_tech_index中的技术指标参数名称可能发生变更。
优化内存使用:当需要加载长时间跨度的分钟数据(如5年5分钟K线)时,建议分段读取,防止出现内存溢出问题。
认识回测功能局限:afdata.backtest模块为简易策略验证框架,未包含滑点、成交量限制等因素,仅适合初步测试。实盘部署前应结合Backtrader、VNPY等专业系统进行深度回测。
afdata包围绕“轻量、易用、适配A股”三大理念设计,完整覆盖金融数据分析流程——从数据提取、清洗、特征计算到可视化展示及基础回测,能够有效支持金融分析师与量化研究人员高效开展A股相关研究工作。
在实际应用中,应特别留意数据合规要求、请求频率管理以及数据质量把控,避免因外部接口限制或脏数据影响分析结论的准确性。
对于复杂策略开发,可依托afdata提供的底层数据服务,接入Backtrader、VNPY等成熟量化平台,实现更高级别的策略建模与实盘对接,从而提升整体分析能力与实战价值。
《AI提示工程必知必会》是一本系统讲解人工智能提示工程技术的实用指南,帮助读者深入理解并掌握AI交互中的核心技巧。本书涵盖了多种类型的提示词运用方法,包括但不限于问答式、指令式、状态类、建议式、安全类以及感谢类提示词,并通过丰富的实战案例指导读者熟练应用这些技巧。
书中详细介绍了如何借助提示词完成各类语言处理任务,例如文本摘要生成、内容改写与重述、语法错误修正以及机器翻译等。同时,还拓展到数据挖掘和程序开发等多个专业领域,展现提示工程在实际工作场景中的广泛适用性。
此外,《AI提示工程必知必会》也探讨了AI在艺术创作特别是绘画方面的应用潜力,解析百度文心一言与阿里通义大模型两大主流智能平台的功能特点及其在不同业务场景下的操作方式。尤其值得一提的是,书中结合市场调研的实际需求,展示了提示词在真实项目中的高效应用策略。
通过系统学习本书内容,读者能够全面提升使用AI工具的能力,优化工作效率,重构传统工作流程,在智能化时代中获得更强的竞争力与发展空间。
扫码加好友,拉您进群



收藏
