
Akshare
- 135 installs
- 169 repo stars
- Updated June 29, 2026
- lzwme/finance-quant-skills
Helps with ai & agent building tasks.
About
akshare is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- akshare
- AI & Agent Building
- AI-coding skill
Akshare by the numbers
- 135 all-time installs (skills.sh)
- +9 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #3,564 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 2, 2026 (Skillselion catalog sync)
npx skills add https://github.com/lzwme/finance-quant-skills --skill akshareAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 135 |
|---|---|
| repo stars | ★ 169 |
| Last updated | June 29, 2026 |
| Repository | lzwme/finance-quant-skills ↗ |
What it does
Helps with ai & agent building tasks.
Files
AKShare 金融数据获取
任务目标
- 本 Skill 用于:通过 AKShare 接口获取全品类金融市场数据
- 能力包含:股票、期货、期权、基金、外汇、债券、指数、加密货币、宏观经济等数据
- 触发条件:用户提及 AKShare 或需要获取各类金融数据时
前置准备
- 依赖说明:安装 akshare 库(已包含在 dependency 中)
- 凭证配置:AKShare 无需注册或 API Key,直接调用即可使用
- 环境要求:Python 3.9+,建议定期更新
pip install akshare --upgrade
操作步骤
- 标准流程:
1. 确定数据需求 — 智能体理解用户意图(股票/期货/基金/外汇等) 2. 调用对应脚本 — 根据数据类型选择脚本 3. 解析结果 — 智能体分析返回的 JSON 格式数据
- 脚本调用映射:
- 股票数据 →
python scripts/stock_data.py --type hist --symbol 000001 --start 20240101 --end 20240131 - 期货数据 →
python scripts/futures_data.py --type daily --exchange CFFEX --start 20240101 --end 20240131 - 基金数据 →
python scripts/fund_data.py --type etf --symbol 510300 - 外汇数据 →
python scripts/forex_data.py --type spot --symbol usd - 宏观经济 →
python scripts/macro_data.py --type gdp - 加密货币 →
python scripts/crypto_data.py --type price --symbol BTC/USDT - 可选分支:
- 当需要多只标的:使用逗号分隔多个代码
- 当需要指定周期:使用
--period参数(daily/weekly/monthly) - 当需要复权数据:使用
--adjust参数(qfq/hfq/空值)
使用示例
- 示例1:获取股票历史K线
- 场景/输入:用户说"获取贵州茅台2024年的日K线数据"
- 预期产出:返回日期、开盘价、最高价、最低价、收盘价、成交量等OHLCV数据
- 关键要点:调用
python scripts/stock_data.py --type hist --symbol 600519 --start 20240101 --end 20241231 --period daily --adjust qfq - 示例2:获取期货数据
- 场景/输入:用户说"查看沪深300股指期货数据"
- 预期产出:返回期货合约的K线数据、持仓量、成交量等信息
- 关键要点:调用
python scripts/futures_data.py --type daily --symbol IF2406 --start 20240101 --end 20240131 - 示例3:获取基金数据
- 场景/输入:用户说"查询沪深300ETF的行情"
- 预期产出:返回ETF的实时行情或历史净值数据
- 关键要点:调用
python scripts/fund_data.py --type etf --symbol 510300 - 示例4:获取宏观经济数据
- 场景/输入:用户说"查看中国GDP数据"
- 预期产出:返回GDP历史数据和最新值
- 关键要点:调用
python scripts/macro_data.py --type gdp
数据分类详解
完整的 API 函数清单(70+ 个接口,覆盖股票/期货/基金/期权/债券/外汇/指数/加密货币/宏观经济/特色数据)见 references/api-catalog.md。
快速索引:
- 股票 →
ak.stock_zh_a_hist(),ak.stock_zh_a_spot_em() - 期货 →
ak.futures_zh_spot(),ak.get_futures_daily() - 基金 →
ak.fund_etf_spot_em(),ak.fund_etf_hist_em() - 宏观 →
ak.macro_china_gdp(),ak.macro_usa_cpi_monthly() - 特色 →
ak.stock_lhb_detail_em()(龙虎榜),ak.stock_hsgt_hist_em()(北向资金)
资源索引
脚本:
- scripts/stock_data.py(用途与参数:获取股票K线/行情/财务数据,支持 --type/--symbol/--start/--end/--period/--adjust)
- scripts/futures_data.py(用途与参数:获取期货数据,支持 --type/--symbol/--exchange/--start/--end)
- scripts/fund_data.py(用途与参数:获取基金数据,支持 --type/--symbol/--start/--end)
- scripts/forex_data.py(用途与参数:获取外汇贵金属数据,支持 --type/--symbol)
- scripts/macro_data.py(用途与参数:获取宏观经济数据,支持 --type)
- scripts/crypto_data.py(用途与参数:获取加密货币数据,支持 --type/--symbol/--period)
- scripts/index_data.py(用途与参数:获取指数数据,支持 --type/--symbol/--start/--end)
- scripts/option_data.py(用途与参数:获取期权数据,支持 --type/--symbol)
- scripts/bond_data.py(用途与参数:获取债券数据,支持 --type/--symbol)
- scripts/special_data.py(用途与参数:获取龙虎榜/融资融券/北向资金等特色数据,支持 --type/--symbol/--start/--end)
参考文档:
- API 函数速查表(何时读取:需要查看完整 AKShare API 函数清单时)
- 股票数据文档(何时读取:需要查看股票相关API参数说明时)
- 期货数据文档(何时读取:需要查看期货相关API参数说明时)
- 基金数据文档(何时读取:需要查看基金相关API参数说明时)
- 宏观经济文档(何时读取:需要查看宏观数据API参数说明时)
- AKShare官方文档(何时读取:需要查看最新API文档时)
注意事项
- AKShare 无需注册或 API Key,直接调用即可使用
- A股股票代码格式:纯数字代码(如 000001、600519),不带市场前缀
- 港股股票代码格式:纯数字代码(如 00700)
- 美股股票代码格式:英文代码(如 AAPL、TSLA)
- 数据列名:A股数据为中文列名,美股/港股数据为英文列名
- 建议定期更新AKShare版本:
pip install akshare --upgrade - 由于上游数据源变化,接口更新频繁,遇到错误时可先尝试更新版本
- 脚本返回 JSON 格式数据,智能体负责解析并转换为用户友好的展示
- 非Python用户可使用 AKTools HTTP API封装
- 数据仅供学术研究使用,不构成投资建议
快速参考
函数命名规则
{asset_type}_{market}_{data_type}_{data_source}- Asset type:
stock(股票),futures(期货),fund(基金),bond(债券),forex(外汇),option(期权),macro(宏观),index(指数) - Market:
zh(中国),us(美国),hk(香港), 或交易所代码 - Data type:
spot(实时),hist(历史),daily(日线),minute(分钟) - Data source:
em(东方财富),sina(新浪财经), 交易所缩写
复权类型
""- 不复权"qfq"- 前复权"hfq"- 后复权
周期类型
"daily"- 日线"weekly"- 周线"monthly"- 月线"1","5","15","30","60"- 分钟线
AKShare API 函数速查表
股票数据(A股/港股/美股)
- 实时行情:
ak.stock_zh_a_spot_em()- 全部A股实时行情 - 历史K线:
ak.stock_zh_a_hist(symbol, period, start_date, end_date, adjust) - 分钟K线:
ak.stock_zh_a_hist_min_em(symbol, period, start_date, end_date) - 个股信息:
ak.stock_individual_info_em(symbol)- 基本信息、市值、行业等 - 财务数据:
ak.stock_fundamental(symbol)- 基本面数据 - 估值指标:
ak.stock_valuation(symbol)- PE、PB等 - 港股数据:
ak.stock_hk_spot_em(),ak.stock_hk_hist() - 美股数据:
ak.stock_us_daily(symbol),ak.stock_us_spot_em()
期货数据
- 期货行情:
ak.futures_zh_spot()- 实时行情 - 期货K线:
ak.get_futures_daily(start_date, end_date, market)- 按交易所 - 库存数据:
ak.futures_inventory_99(symbol)- 期货库存
基金数据
- ETF行情:
ak.fund_etf_spot_em()- ETF实时行情 - ETF历史:
ak.fund_etf_hist_em(symbol, period, start_date, end_date, adjust) - 开放式基金:
ak.fund_open_fund_daily_em(symbol)- 每日净值 - 基金评级:
ak.fund_rating_all()- 基金评级信息
期权数据
- 期权历史:
ak.option_hist_dce(symbol)- 交易所期权数据 - ETF期权:
ak.option_sse_spot_price(symbol)- 上证50ETF期权
债券数据
- 可转债:
ak.bond_zh_cov()- 可转债列表 - 可转债K线:
ak.bond_zh_hs_cov_daily(symbol)- 可转债历史数据 - 债券报价:
ak.bond_spot_quote()- 中国债券现货报价
外汇贵金属
- 外汇行情:
ak.forex_spot_em()- 外汇实时行情 - 汇率数据:
ak.forex_usd_cny()- 美元兑人民币 - 贵金属:
ak.metals_gold()- 国际金价
指数数据
- A股指数:
ak.stock_zh_index_daily_em(symbol)- 指数历史数据 - 指数成分:
ak.index_stock_cons_csindex(symbol)- 指数成分股
加密货币
- 币种列表:
ak.crypto_binance_symbols()- 币安交易对 - 实时价格:
ak.crypto_binance_btc_usdt_spot()- BTC/USDT价格 - K线数据:
ak.crypto_binance_btc_usdt_kline(period)- 加密货币K线
宏观经济
- 中国GDP:
ak.macro_china_gdp(),ak.macro_china_gdp_yearly() - CPI数据:
ak.macro_china_cpi_yearly(),ak.macro_china_cpi() - PMI数据:
ak.macro_china_pmi() - 美国数据:
ak.macro_usa_non_farm(),ak.macro_usa_cpi_monthly()
特色数据
- 龙虎榜:
ak.stock_lhb_detail_em(start_date, end_date)- 龙虎榜详情 - 融资融券:
ak.stock_margin_sse(start_date, end_date)- 融资融券数据 - 北向资金:
ak.stock_hsgt_hist_em(symbol)- 陆港通数据 - 股东数据:
ak.stock_gdfx_top_10_em(symbol, date)- 前十大股东 - 板块行情:
ak.stock_board_industry_name_em()- 行业板块 - 限售解禁:
ak.stock_restricted_release_queue_em(symbol)- 限售解禁 - 资金流向:
ak.stock_market_fund_flow()- 市场资金流向
AKShare 基金数据 API 参考
主要功能
AKShare 提供全面的基金数据获取功能,包括ETF、开放式基金、货币基金、基金评级等。
核心API接口
ETF基金数据
ETF实时行情
# 获取ETF实时行情
ak.fund_etf_spot_em()返回字段:
- 代码、名称、最新价、涨跌幅、涨跌额、成交量、成交额、振幅、最高、最低、今开、昨收、换手率等
ETF历史K线
# 获取ETF历史K线数据
ak.fund_etf_hist_em(
symbol="510300", # ETF代码
period="daily", # 周期: "daily", "weekly", "monthly"
start_date="20240101", # 开始日期
end_date="20240630", # 结束日期
adjust="qfq" # 复权: "", "qfq", "hfq"
)返回字段:
- 日期、开盘、收盘、最高、最低、成交量、成交额、涨跌幅等
开放式基金数据
开放式基金每日净值
# 获取开放式基金每日净值
ak.fund_open_fund_daily_em(symbol="000001")返回字段:
- 基金代码、基金名称、净值日期、单位净值、累计净值、日增长率等
开放式基金列表
# 获取开放式基金列表
ak.fund_open_fund_rank_em()基金评级数据
# 获取基金评级
ak.fund_rating_all()返回字段:
- 基金代码、基金名称、评级机构、评级、评级日期等
基金持仓信息
# 获取基金持仓信息
ak.fund_portfolio_hold_em(symbol="000001")返回字段:
- 基金代码、股票代码、股票名称、持仓比例、持股数量等
基金经理信息
# 获取基金经理信息
ak.fund_manager()返回字段:
- 基金代码、基金名称、基金经理、从业时间、管理规模等
货币基金数据
# 获取货币基金信息
ak.fund_money_fund_em()返回字段:
- 基金代码、基金名称、万份收益、七日年化收益率等
基金规模信息
# 获取基金规模信息
ak.fund_scale_open_em()返回字段:
- 基金代码、基金名称、基金规模、基金规模变化等
新发基金信息
# 获取新发基金信息
ak.fund_new_found_em()返回字段:
- 基金代码、基金名称、成立日期、基金类型等
基金分类数据
股票型基金
# 股票型基金排行
ak.fund_stock_open_em()债券型基金
# 债券型基金排行
ak.fund_bond_open_em()混合型基金
# 混合型基金排行
ak.fund_mixed_open_em()QDII基金
# QDII基金排行
ak.fund_qdii_em()基金净值数据
基金净值走势
# 获取基金净值走势
ak.fund_value_hist_em(symbol="000001")基金累计净值
# 获取基金累计净值
ak.fund_accumulated_net_em(symbol="000001")基金分红信息
# 获取基金分红信息
ak.fund_dividend_em(symbol="000001")返回字段:
- 基金代码、基金名称、分红年度、权益登记日、除息日、分红金额等
基金行业配置
# 获取基金行业配置
ak.fund_portfolio_industry_allocation_em(symbol="000001")使用注意事项
1. 基金代码格式:
- ETF基金:5/6位数字代码(如510300)
- 开放式基金:6位数字代码(如000001)
- LOF基金:5/6位数字代码
2. 净值更新频率:
- 交易日净值:T+1日更新
- 货币基金:每日更新
- 分红信息:分红公告后更新
3. 数据延迟:
- 实时行情:可能有15分钟延迟
- 历史净值:交易日结束后更新
- 持仓信息:季度报告后更新
4. 基金类型:
- 股票型、债券型、混合型、货币型、QDII等
- 开放式、封闭式、ETF、LOF等
常见应用场景
1. ETF投资分析
# 获取ETF实时行情
etf_spot = ak.fund_etf_spot_em()
# 筛选特定类型的ETF
stock_etf = etf_spot[etf_spot['名称'].str.contains('指数|ETF')]
bond_etf = etf_spot[etf_spot['名称'].str.contains('债券')]
# 获取特定ETF的历史数据
hs300_etf = ak.fund_etf_hist_em(
symbol="510300",
period="daily",
start_date="20240101",
end_date="20241231",
adjust="qfq"
)
# 计算ETF技术指标
hs300_etf["MA5"] = hs300_etf["收盘"].rolling(window=5).mean()
hs300_etf["MA20"] = hs300_etf["收盘"].rolling(window=20).mean()
hs300_etf["RSI"] = calculate_rsi(hs300_etf["收盘"], 14)2. 基金筛选与评级
# 获取基金评级数据
fund_rating = ak.fund_rating_all()
# 筛选高评级基金
high_rated = fund_rating[
(fund_rating['评级'] == '5星') |
(fund_rating['评级'] == '4星')
]
# 按基金类型分类
grouped = high_rated.groupby('基金类型')
# 获取各类基金数量
fund_count_by_type = grouped.size()3. 基金持仓分析
# 获取基金持仓信息
def analyze_fund_portfolio(symbol):
# 获取持仓数据
portfolio = ak.fund_portfolio_hold_em(symbol=symbol)
if len(portfolio) > 0:
# 分析行业分布
industry_dist = portfolio.groupby('行业')['持仓比例'].sum()
# 分析重仓股
top_holdings = portfolio.nlargest(10, '持仓比例')
return {
"symbol": symbol,
"industry_distribution": industry_dist.to_dict(),
"top_holdings": top_holdings[['股票名称', '持仓比例']].to_dict('records')
}
return None
# 分析多只基金
fund_symbols = ["000001", "110022", "161725"]
analysis_results = {}
for symbol in fund_symbols:
result = analyze_fund_portfolio(symbol)
if result:
analysis_results[symbol] = result4. 基金经理绩效分析
# 获取基金经理信息
managers = ak.fund_manager()
# 分析基金经理绩效
def analyze_manager_performance(manager_name):
manager_funds = managers[managers['基金经理'] == manager_name]
if len(manager_funds) > 0:
# 获取管理的基金数量
fund_count = len(manager_funds)
# 计算平均管理规模
avg_scale = manager_funds['管理规模'].mean()
# 分析从业时间分布
experience_years = manager_funds['从业时间'].mean()
return {
"manager": manager_name,
"fund_count": fund_count,
"avg_scale": avg_scale,
"experience_years": experience_years
}
return None
# 分析顶级基金经理
top_managers = managers.nlargest(10, '管理规模')['基金经理'].unique()
manager_analysis = {}
for manager in top_managers:
result = analyze_manager_performance(manager)
if result:
manager_analysis[manager] = result5. 基金规模趋势分析
# 获取基金规模数据
fund_scale = ak.fund_scale_open_em()
# 分析规模变化趋势
def analyze_scale_trend(symbol):
# 筛选特定基金
fund_data = fund_scale[fund_scale['基金代码'] == symbol]
if len(fund_data) > 0:
# 计算规模变化率
fund_data = fund_data.sort_values('报告期')
fund_data['scale_change'] = fund_data['基金规模'].pct_change()
# 分析规模稳定性
scale_volatility = fund_data['scale_change'].std()
# 获取最新规模
latest_scale = fund_data.iloc[-1]['基金规模']
return {
"symbol": symbol,
"latest_scale": latest_scale,
"scale_volatility": scale_volatility,
"scale_trend": fund_data[['报告期', '基金规模', 'scale_change']].to_dict('records')
}
return None
# 分析头部基金规模趋势
top_funds = fund_scale.groupby('基金代码')['基金规模'].last().nlargest(10).index.tolist()
scale_analysis = {}
for symbol in top_funds:
result = analyze_scale_trend(symbol)
if result:
scale_analysis[symbol] = result6. 新发基金监控
# 获取新发基金信息
new_funds = ak.fund_new_found_em()
# 筛选近期新发基金
from datetime import datetime, timedelta
current_date = datetime.now()
recent_date = current_date - timedelta(days=90) # 最近3个月
# 转换日期格式并筛选
new_funds['成立日期'] = pd.to_datetime(new_funds['成立日期'])
recent_new_funds = new_funds[new_funds['成立日期'] >= recent_date]
# 按基金类型统计
fund_type_count = recent_new_funds['基金类型'].value_counts()
# 分析新发基金趋势
print(f"最近3个月新发基金数量: {len(recent_new_funds)}")
print("按类型分布:")
print(fund_type_count)错误处理
try:
# 获取基金数据
df = ak.fund_etf_hist_em(
symbol="510300",
period="daily",
start_date="20240101",
end_date="20241231"
)
if len(df) == 0:
print("警告: 未获取到基金数据,请检查基金代码")
except Exception as e:
print(f"基金数据获取失败: {e}")
# 重试或降级处理性能优化建议
1. 批量处理: 对多只基金数据进行批量获取 2. 数据缓存: 对历史净值数据建立本地缓存 3. 增量更新: 只获取新增的净值数据 4. 异步处理: 对大量基金使用异步获取方式
相关资源
AKShare 期货数据 API 参考
主要功能
AKShare 提供全面的期货数据获取功能,包括期货行情、历史K线、库存数据、主力合约等。
核心API接口
期货行情数据
实时行情
# 获取期货实时行情
ak.futures_zh_spot()返回字段:
- symbol: 合约代码
- contract: 合约名称
- price: 最新价
- open: 开盘价
- high: 最高价
- low: 最低价
- volume: 成交量
- open_interest: 持仓量
- change: 涨跌幅
期货日线数据
from akshare import get_futures_daily
# 获取期货日线数据(按交易所)
df = get_futures_daily(
start_date="20240101",
end_date="20240131",
market="CFFEX" # 交易所代码
)交易所选项:
"CFFEX"- 中国金融期货交易所(中金所)"SHFE"- 上海期货交易所(上期所)"DCE"- 大连商品交易所(大商所)"CZCE"- 郑州商品交易所(郑商所)"INE"- 上海国际能源交易中心"GFEX"- 广州期货交易所
库存数据
# 获取期货库存数据
ak.futures_inventory_99(symbol="豆一")常用品种:
- "豆一", "豆二", "豆粕", "豆油", "棕榈油"
- "玉米", "玉米淀粉", "鸡蛋", "纤维板"
- "铁矿石", "焦炭", "焦煤", "聚乙烯"
主力合约数据
# 获取期货主力合约
ak.futures_main_sure_em(symbol="IF") # 股指期货各交易所数据接口
中国金融期货交易所(CFFEX)
# 中金所期货数据
df = get_futures_daily(
start_date="20240101",
end_date="20240131",
market="CFFEX"
)
# 主要品种:IF(沪深300), IC(中证500), IH(上证50), T(国债)等上海期货交易所(SHFE)
# 上期所期货数据
df = get_futures_daily(
start_date="20240101",
end_date="20240131",
market="SHFE"
)
# 主要品种:CU(铜), AL(铝), ZN(锌), PB(铅), NI(镍), SN(锡)
# AU(黄金), AG(白银), RB(螺纹钢), WR(线材), HC(热轧卷板)大连商品交易所(DCE)
# 大商所期货数据
df = get_futures_daily(
start_date="20240101",
end_date="20240131",
market="DCE"
)
# 主要品种:C(玉米), CS(淀粉), A(豆一), B(豆二), M(豆粕)
# Y(豆油), P(棕榈油), L(聚乙烯), V(聚氯乙烯), PP(聚丙烯)郑州商品交易所(CZCE)
# 郑商所期货数据
df = get_futures_daily(
start_date="20240101",
end_date="20240131",
market="CZCE"
)
# 主要品种:SR(白糖), CF(棉花), TA(PTA), OI(菜籽油), WH(强麦)
# RI(早籼稻), RS(油菜籽), RM(菜籽粕), JR(粳稻), LR(晚籼稻)特色数据
期货价格指数
# 获取期货价格指数
ak.futures_index_price_sina(symbol="IF") # 股指期货指数期货连续合约
# 获取期货连续合约
ak.futures_zh_daily_sina(symbol="IF0") # 股指期货连续期货主力连续
# 获取期货主力连续合约
ak.futures_main_contract_sina(symbol="IF")期货套利数据
# 获取期货套利数据
ak.futures_arbitrage_sina(symbol="CU")期货期权数据
# 获取期货期权数据
ak.futures_option_dce(symbol="豆粕期权") # 大商所期权
ak.futures_option_czce(symbol="白糖期权") # 郑商所期权
ak.futures_option_shfe(symbol="铜期权") # 上期所期权使用注意事项
1. 数据格式:
- 日期格式:YYYYMMDD
- 价格单位:根据不同品种而定
- 成交量单位:手
- 持仓量单位:手
2. 交易时间:
- 日盘:09:00-15:00
- 夜盘:21:00-02:30(部分品种)
- 注意节假日休市安排
3. 合约代码规则:
- 品种代码 + 年份 + 月份(如:IF2406)
- 连续合约:品种代码 + 0(如:IF0)
4. 数据延迟:
- 实时行情:可能有1-3秒延迟
- 历史数据:T+1更新
- 库存数据:每周更新
常见应用场景
1. 获取特定交易所数据
# 获取中金所期货数据
df_cffex = get_futures_daily(
start_date="20240101",
end_date="20240131",
market="CFFEX"
)
# 获取上期所期货数据
df_shfe = get_futures_daily(
start_date="20240101",
end_date="20240131",
market="SHFE"
)2. 分析期货主力合约
# 获取股指期货主力合约
main_contracts = ak.futures_main_sure_em(symbol="IF")
# 分析主力合约走势
df_main = get_futures_daily(
start_date="20240101",
end_date="20240131",
market="CFFEX"
)
# 筛选主力合约数据
df_main = df_main[df_main['symbol'].isin(main_contracts['symbol'])]3. 期货库存分析
# 获取多个品种库存数据
commodities = ["豆一", "豆粕", "玉米", "铁矿石"]
inventory_data = {}
for commodity in commodities:
try:
df = ak.futures_inventory_99(symbol=commodity)
inventory_data[commodity] = df
print(f"已获取 {commodity} 库存数据")
except Exception as e:
print(f"获取 {commodity} 数据失败: {e}")
# 分析库存变化趋势
for commodity, df in inventory_data.items():
if len(df) > 0:
latest = df.iloc[-1]
previous = df.iloc[-2] if len(df) > 1 else None
if previous is not None:
change = latest['库存'] - previous['库存']
print(f"{commodity} 库存变化: {change}")4. 期货技术分析
# 获取期货数据用于技术分析
df = get_futures_daily(
start_date="20240101",
end_date="20241231",
market="CFFEX"
)
# 筛选特定合约
df_if = df[df['symbol'] == 'IF2406'].copy()
# 计算技术指标
df_if["MA5"] = df_if["close"].rolling(window=5).mean()
df_if["MA10"] = df_if["close"].rolling(window=10).mean()
df_if["MA20"] = df_if["close"].rolling(window=20).mean()
# 计算波动率
df_if["returns"] = df_if["close"].pct_change()
df_if["volatility"] = df_if["returns"].rolling(window=20).std() * (252 ** 0.5)
# 分析持仓量变化
df_if["oi_change"] = df_if["open_interest"].diff()5. 跨期套利分析
# 获取同一品种不同月份合约
contracts = ["IF2406", "IF2409", "IF2412"]
contract_data = {}
for contract in contracts:
df = get_futures_daily(
start_date="20240101",
end_date="20240131",
market="CFFEX"
)
contract_df = df[df['symbol'] == contract]
if len(contract_df) > 0:
contract_data[contract] = contract_df
# 计算价差
if len(contract_data) >= 2:
near_contract = contract_data[contracts[0]]
far_contract = contract_data[contracts[1]]
# 计算价差
spread = far_contract["close"].values - near_contract["close"].values
# 分析价差统计特征
spread_mean = spread.mean()
spread_std = spread.std()
print(f"价差均值: {spread_mean:.2f}")
print(f"价差标准差: {spread_std:.2f}")错误处理
try:
df = get_futures_daily(
start_date="20240101",
end_date="20240131",
market="CFFEX"
)
if len(df) == 0:
print("警告: 未获取到数据,请检查参数")
except Exception as e:
print(f"数据获取失败: {e}")
# 重试或降级处理性能优化建议
1. 批量获取: 尽量一次性获取较长时间段的数据 2. 数据筛选: 在获取后立即筛选需要的合约 3. 缓存机制: 对历史数据建立本地缓存 4. 异步处理: 对多个品种使用异步获取
相关资源
AKShare 宏观经济数据 API 参考
主要功能
AKShare 提供全面的宏观经济数据获取功能,包括GDP、CPI、PMI、就业数据等国内外宏观经济指标。
核心API接口
中国宏观经济数据
GDP数据
# 获取中国GDP数据
ak.macro_china_gdp()
# 获取中国GDP年度数据
ak.macro_china_gdp_yearly()返回字段:
- 时间、GDP数值、同比增长率、环比增长率等
CPI数据
# 获取中国CPI数据
ak.macro_china_cpi()
# 获取中国CPI年度数据
ak.macro_china_cpi_yearly()返回字段:
- 时间、CPI数值、同比增长率、环比增长率等
PMI数据
# 获取中国PMI数据
ak.macro_china_pmi()返回字段:
- 时间、PMI数值、制造业PMI、非制造业PMI等
货币供应量
# 获取中国M2货币供应数据
ak.macro_china_m2()
# 获取中国M1货币供应数据
ak.macro_china_m1()
# 获取中国M0货币供应数据
ak.macro_china_m0()利率数据
# 获取中国存款基准利率
ak.macro_china_deposit_rate()
# 获取中国贷款基准利率
ak.macro_china_loan_rate()
# 获取中国存款准备金率
ak.macro_china_rrr()贸易数据
# 获取中国进出口贸易数据
ak.macro_china_trade()
# 获取中国贸易差额数据
ak.macro_china_trade_balance()投资数据
# 获取中国固定资产投资数据
ak.macro_china_fixed_investment()
# 获取中国房地产开发投资数据
ak.macro_china_real_estate()消费数据
# 获取中国社会消费品零售总额
ak.macro_china_consumption()
# 获取中国消费者信心指数
ak.macro_china_consumer_confidence()工业生产数据
# 获取中国工业增加值
ak.macro_china_industrial_production()
# 获取中国工业企业利润
ak.macro_china_industrial_profits()就业数据
# 获取中国就业数据
ak.macro_china_employment()
# 获取中国城镇登记失业率
ak.macro_china_unemployment_rate()美国宏观经济数据
就业数据
# 获取美国非农就业数据
ak.macro_usa_non_farm()
# 获取美国失业率数据
ak.macro_usa_unemployment()
# 获取美国就业成本指数
ak.macro_usa_employment_cost()通胀数据
# 获取美国CPI月度数据
ak.macro_usa_cpi_monthly()
# 获取美国CPI年度数据
ak.macro_usa_cpi_yearly()
# 获取美国PPI数据
ak.macro_usa_ppi()GDP数据
# 获取美国GDP月度数据
ak.macro_usa_gdp_monthly()
# 获取美国GDP年度数据
ak.macro_usa_gdp_yearly()利率数据
# 获取美国联邦基金利率
ak.macro_usa_interest_rate()
# 获取美国国债收益率
ak.macro_usa_treasury()消费数据
# 获取美国零售销售数据
ak.macro_usa_retail_sales()
# 获取美国消费者信心指数
ak.macro_usa_consumer_confidence()房地产数据
# 获取美国新屋开工数据
ak.macro_usa_housing_starts()
# 获取美国成屋销售数据
ak.macro_usa_existing_home_sales()制造业数据
# 获取美国制造业PMI
ak.macro_usa_manufacturing_pmi()
# 获取美国工业产出数据
ak.macro_usa_industrial_production()其他主要经济体数据
欧元区数据
# 获取欧元区GDP数据
ak.macro_euro_gdp()
# 获取欧元区CPI数据
ak.macro_euro_cpi()
# 获取欧元区PMI数据
ak.macro_euro_pmi()日本数据
# 获取日本GDP数据
ak.macro_japan_gdp()
# 获取日本CPI数据
ak.macro_japan_cpi()
# 获取日本PMI数据
ak.macro_japan_pmi()英国数据
# 获取英国GDP数据
ak.macro_uk_gdp()
# 获取英国CPI数据
ak.macro_uk_cpi()
# 获取英国PMI数据
ak.macro_uk_pmi()金融市场数据
汇率数据
# 获取美元兑人民币汇率
ak.forex_usd_cny()
# 获取主要货币汇率
ak.forex_hist(symbol="USD/CNY")商品价格
# 获取原油价格
ak.macro_oil_price()
# 获取黄金价格
ak.metals_gold()
# 获取白银价格
ak.metals_silver()债券收益率
# 获取中国国债收益率
ak.macro_china_bond_yield()
# 获取美国国债收益率
ak.macro_usa_treasury()使用注意事项
1. 数据频率:
- 月度数据:每月中旬发布上月数据
- 季度数据:每季度结束后1个月左右发布
- 年度数据:次年年初发布
2. 数据发布:
- 中国数据:国家统计局、央行等官方机构发布
- 美国数据:BLS、BEA、美联储等机构发布
- 数据可能有修正和更新
3. 数据格式:
- 时间格式:YYYY-MM-DD 或 YYYYMM
- 数值格式:浮点数或百分比
- 增长率:同比、环比、年化等
4. 数据延迟:
- 实时数据:可能有1-3天延迟
- 历史数据:T+1更新
- 修正数据:可能随时更新
常见应用场景
1. 宏观经济趋势分析
# 获取主要宏观经济指标
def get_macro_indicators():
indicators = {}
try:
# 中国主要指标
indicators['china_gdp'] = ak.macro_china_gdp()
indicators['china_cpi'] = ak.macro_china_cpi()
indicators['china_pmi'] = ak.macro_china_pmi()
indicators['china_m2'] = ak.macro_china_m2()
# 美国主要指标
indicators['usa_gdp'] = ak.macro_usa_gdp_monthly()
indicators['usa_cpi'] = ak.macro_usa_cpi_monthly()
indicators['usa_unemployment'] = ak.macro_usa_unemployment()
return indicators
except Exception as e:
print(f"获取宏观数据失败: {e}")
return None
# 分析宏观经济趋势
def analyze_macro_trends():
indicators = get_macro_indicators()
if indicators:
analysis = {}
# 分析中国GDP趋势
if len(indicators['china_gdp']) > 0:
gdp_data = indicators['china_gdp']
latest_gdp = gdp_data.iloc[-1]
analysis['china_gdp_trend'] = {
'current_value': latest_gdp.get('value', None),
'growth_rate': latest_gdp.get('growth_rate', None),
'trend': '上升' if latest_gdp.get('growth_rate', 0) > 0 else '下降'
}
# 分析CPI通胀趋势
if len(indicators['china_cpi']) > 0:
cpi_data = indicators['china_cpi']
latest_cpi = cpi_data.iloc[-1]
analysis['china_cpi_trend'] = {
'current_value': latest_cpi.get('value', None),
'inflation_level': '高通胀' if latest_cpi.get('value', 0) > 3 else '温和通胀'
}
return analysis
return None2. 中美经济对比分析
# 中美经济指标对比
def compare_china_usa_economy():
comparison = {}
try:
# 获取中美GDP数据
china_gdp = ak.macro_china_gdp()
usa_gdp = ak.macro_usa_gdp_monthly()
# 获取中美CPI数据
china_cpi = ak.macro_china_cpi()
usa_cpi = ak.macro_usa_cpi_monthly()
# 获取中美就业数据
china_employment = ak.macro_china_employment()
usa_unemployment = ak.macro_usa_unemployment()
# 对比分析
if len(china_gdp) > 0 and len(usa_gdp) > 0:
latest_china_gdp = china_gdp.iloc[-1]
latest_usa_gdp = usa_gdp.iloc[-1]
comparison['gdp_comparison'] = {
'china_growth': latest_china_gdp.get('growth_rate', None),
'usa_growth': latest_usa_gdp.get('growth_rate', None),
'relative_performance': '中国领先' if latest_china_gdp.get('growth_rate', 0) > latest_usa_gdp.get('growth_rate', 0) else '美国领先'
}
if len(china_cpi) > 0 and len(usa_cpi) > 0:
latest_china_cpi = china_cpi.iloc[-1]
latest_usa_cpi = usa_cpi.iloc[-1]
comparison['inflation_comparison'] = {
'china_inflation': latest_china_cpi.get('value', None),
'usa_inflation': latest_usa_cpi.get('value', None),
'inflation_gap': latest_china_cpi.get('value', 0) - latest_usa_cpi.get('value', 0)
}
return comparison
except Exception as e:
print(f"中美经济对比分析失败: {e}")
return None3. 经济周期分析
# 经济周期分析
def analyze_economic_cycle():
cycle_analysis = {}
try:
# 获取关键指标
gdp = ak.macro_china_gdp()
pmi = ak.macro_china_pmi()
m2 = ak.macro_china_m2()
cpi = ak.macro_china_cpi()
if len(gdp) > 0 and len(pmi) > 0:
# 获取最新数据
latest_gdp = gdp.iloc[-1]
latest_pmi = pmi.iloc[-1]
latest_m2 = m2.iloc[-1] if len(m2) > 0 else None
latest_cpi = cpi.iloc[-1] if len(cpi) > 0 else None
# 判断经济周期阶段
gdp_growth = latest_gdp.get('growth_rate', 0)
pmi_value = latest_pmi.get('value', 50)
if gdp_growth > 6 and pmi_value > 50:
cycle_stage = '扩张期'
elif gdp_growth > 3 and pmi_value > 50:
cycle_stage = '复苏期'
elif gdp_growth < 3 and pmi_value < 50:
cycle_stage = '衰退期'
else:
cycle_stage = '滞胀期'
cycle_analysis = {
'cycle_stage': cycle_stage,
'gdp_growth': gdp_growth,
'pmi_value': pmi_value,
'm2_growth': latest_m2.get('growth_rate', None) if latest_m2 else None,
'cpi_inflation': latest_cpi.get('value', None) if latest_cpi else None
}
return cycle_analysis
except Exception as e:
print(f"经济周期分析失败: {e}")
return None4. 通胀压力监测
# 通胀压力监测
def monitor_inflation_pressure():
inflation_monitor = {}
try:
# 获取通胀相关指标
cpi = ak.macro_china_cpi()
ppi = ak.macro_china_ppi() if hasattr(ak, 'macro_china_ppi') else None
m2 = ak.macro_china_m2()
commodity_prices = ak.macro_commodity_prices() if hasattr(ak, 'macro_commodity_prices') else None
if len(cpi) > 0:
latest_cpi = cpi.iloc[-1]
# 分析通胀水平
cpi_value = latest_cpi.get('value', 0)
if cpi_value > 3:
inflation_level = '高通胀'
risk_level = '高风险'
elif cpi_value > 2:
inflation_level = '温和通胀'
risk_level = '中等风险'
else:
inflation_level = '低通胀'
risk_level = '低风险'
inflation_monitor = {
'current_cpi': cpi_value,
'inflation_level': inflation_level,
'risk_level': risk_level,
'trend': analyze_inflation_trend(cpi)
}
# 分析货币供应对通胀的影响
if len(m2) > 0:
latest_m2 = m2.iloc[-1]
m2_growth = latest_m2.get('growth_rate', 0)
if m2_growth > 10 and cpi_value > 2:
inflation_monitor['monetary_pressure'] = '货币供应增长较快,存在通胀压力'
else:
inflation_monitor['monetary_pressure'] = '货币供应相对稳定'
return inflation_monitor
except Exception as e:
print(f"通胀压力监测失败: {e}")
return None
def analyze_inflation_trend(cpi_data):
"""分析通胀趋势"""
if len(cpi_data) >= 3:
recent_values = cpi_data.tail(3)['value'].tolist()
if recent_values[2] > recent_values[1] > recent_values[0]:
return '上升趋势'
elif recent_values[2] < recent_values[1] < recent_values[0]:
return '下降趋势'
else:
return '震荡趋势'
return '数据不足'5. 货币政策分析
# 货币政策分析
def analyze_monetary_policy():
policy_analysis = {}
try:
# 获取货币政策相关指标
deposit_rate = ak.macro_china_deposit_rate()
loan_rate = ak.macro_china_loan_rate()
rrr = ak.macro_china_rrr()
m2 = ak.macro_china_m2()
if len(deposit_rate) > 0 and len(m2) > 0:
latest_deposit_rate = deposit_rate.iloc[-1]
latest_loan_rate = loan_rate.iloc[-1] if len(loan_rate) > 0 else None
latest_rrr = rrr.iloc[-1] if len(rrr) > 0 else None
latest_m2 = m2.iloc[-1]
# 分析货币政策立场
current_deposit_rate = latest_deposit_rate.get('value', 0)
current_m2_growth = latest_m2.get('growth_rate', 0)
if current_deposit_rate < 2 and current_m2_growth > 10:
policy_stance = '宽松货币政策'
elif current_deposit_rate > 3 and current_m2_growth < 8:
policy_stance = '紧缩货币政策'
else:
policy_stance = '中性货币政策'
policy_analysis = {
'policy_stance': policy_stance,
'deposit_rate': current_deposit_rate,
'loan_rate': latest_loan_rate.get('value', None) if latest_loan_rate else None,
'rrr': latest_rrr.get('value', None) if latest_rrr else None,
'm2_growth': current_m2_growth
}
return policy_analysis
except Exception as e:
print(f"货币政策分析失败: {e}")
return None错误处理
try:
# 获取宏观经济数据
df = ak.macro_china_gdp()
if len(df) == 0:
print("警告: 未获取到GDP数据")
except Exception as e:
print(f"宏观数据获取失败: {e}")
# 重试或降级处理性能优化建议
1. 批量获取: 一次性获取多个相关指标 2. 数据缓存: 对历史数据建立本地缓存 3. 增量更新: 只获取最新的数据更新 4. 异步处理: 对多个指标使用异步获取
相关资源
#!/usr/bin/env python3
"""AKShare 债券数据获取脚本
支持可转债、债券报价等数据"""
import sys
import json
import argparse
import pandas as pd
import akshare as ak
def get_bond_convertible():
"""获取可转债列表"""
try:
df = ak.bond_zh_cov()
return {
"type": "bond_convertible",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取可转债列表失败: {str(e)}"}
def get_bond_convertible_hist(symbol="sz123456"):
"""获取可转债历史K线数据"""
try:
df = ak.bond_zh_hs_cov_daily(symbol=symbol)
return {
"type": "bond_convertible_hist",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取可转债历史数据失败: {str(e)}"}
def get_bond_spot_quote():
"""获取中国债券现货报价"""
try:
df = ak.bond_spot_quote()
return {
"type": "bond_spot_quote",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取债券现货报价失败: {str(e)}"}
def get_bond_cov_jsl():
"""获取集思录可转债数据"""
try:
df = ak.bond_cov_jsl()
return {
"type": "bond_cov_jsl",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取集思录可转债数据失败: {str(e)}"}
def get_bond_zh_hs_cov():
"""获取沪深可转债数据"""
try:
df = ak.bond_zh_hs_cov()
return {
"type": "bond_zh_hs_cov",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取沪深可转债数据失败: {str(e)}"}
def get_bond_treasure_issue():
"""获取国债发行数据"""
try:
df = ak.bond_treasure_issue()
return {
"type": "bond_treasure_issue",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取国债发行数据失败: {str(e)}"}
def get_bond_local_government_issue():
"""获取地方债发行数据"""
try:
df = ak.bond_local_government_issue()
return {
"type": "bond_local_government_issue",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取地方债发行数据失败: {str(e)}"}
def get_bond_corporate_issue():
"""获取企业债发行数据"""
try:
df = ak.bond_corporate_issue()
return {
"type": "bond_corporate_issue",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取企业债发行数据失败: {str(e)}"}
def main():
parser = argparse.ArgumentParser(description='AKShare 债券数据获取')
parser.add_argument('--type', required=True,
choices=['convertible', 'convertible_hist', 'spot_quote', 'cov_jsl',
'zh_hs_cov', 'treasure_issue', 'local_gov_issue', 'corporate_issue'],
help='数据类型')
parser.add_argument('--symbol', default='sz123456', help='债券代码')
args = parser.parse_args()
if args.type == 'convertible':
result = get_bond_convertible()
elif args.type == 'convertible_hist':
result = get_bond_convertible_hist(args.symbol)
elif args.type == 'spot_quote':
result = get_bond_spot_quote()
elif args.type == 'cov_jsl':
result = get_bond_cov_jsl()
elif args.type == 'zh_hs_cov':
result = get_bond_zh_hs_cov()
elif args.type == 'treasure_issue':
result = get_bond_treasure_issue()
elif args.type == 'local_gov_issue':
result = get_bond_local_government_issue()
elif args.type == 'corporate_issue':
result = get_bond_corporate_issue()
else:
result = {"error": f"未知类型: {args.type}"}
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""AKShare 加密货币数据获取脚本
支持加密货币价格、K线数据等"""
import sys
import json
import argparse
import pandas as pd
import akshare as ak
def get_crypto_symbols():
"""获取加密货币交易对列表"""
try:
df = ak.crypto_binance_symbols()
return {
"type": "crypto_symbols",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取加密货币交易对失败: {str(e)}"}
def get_crypto_price(symbol="BTC/USDT"):
"""获取加密货币实时价格"""
try:
symbol_map = {
"BTC/USDT": ak.crypto_binance_btc_usdt_spot,
"ETH/USDT": ak.crypto_binance_eth_usdt_spot,
"BNB/USDT": ak.crypto_binance_bnb_usdt_spot,
}
func = symbol_map.get(symbol, ak.crypto_binance_btc_usdt_spot)
df = func()
if df is not None and len(df) > 0:
latest = df.iloc[-1]
return {
"type": "crypto_price",
"symbol": symbol,
"price": float(latest.get('close', latest.get('price', 0))),
"volume": str(latest.get('volume', 'N/A')),
"timestamp": str(latest.get('date', pd.Timestamp.now()))
}
return {"error": "No data available"}
except Exception as e:
return {"error": f"获取加密货币价格失败: {str(e)}"}
def get_crypto_kline(symbol="BTC/USDT", period="daily"):
"""获取加密货币K线数据"""
try:
if symbol.upper() in ["BTC/USDT", "BTC", "btc"]:
df = ak.crypto_binance_btc_usdt_kline(period=period)
elif symbol.upper() in ["ETH/USDT", "ETH", "eth"]:
df = ak.crypto_binance_eth_usdt_kline(period=period)
else:
return {"error": f"不支持的交易对: {symbol}"}
return {
"type": "crypto_kline",
"symbol": symbol,
"period": period,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取加密货币K线失败: {str(e)}"}
def get_crypto_all_spot():
"""获取所有加密货币实时价格"""
try:
# 获取币安所有交易对
df = ak.crypto_binance_symbols()
symbols = df['symbol'].tolist()[:10] # 限制前10个避免请求过多
results = []
for symbol in symbols:
try:
price_data = get_crypto_price(f"{symbol}/USDT")
if "error" not in price_data:
results.append(price_data)
except:
continue
return {
"type": "crypto_all_spot",
"data": results,
"count": len(results)
}
except Exception as e:
return {"error": f"获取所有加密货币价格失败: {str(e)}"}
def get_crypto_market_cap():
"""获取加密货币市值信息"""
try:
df = ak.crypto_bitcoin_market_cap()
return {
"type": "crypto_market_cap",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取加密货币市值失败: {str(e)}"}
def get_crypto_global_index():
"""获取加密货币全球指数"""
try:
df = ak.crypto_bitcoin_global_index()
return {
"type": "crypto_global_index",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取加密货币全球指数失败: {str(e)}"}
def main():
parser = argparse.ArgumentParser(description='AKShare 加密货币数据获取')
parser.add_argument('--type', required=True,
choices=['symbols', 'price', 'kline', 'all_spot', 'market_cap', 'global_index'],
help='数据类型')
parser.add_argument('--symbol', default='BTC/USDT', help='加密货币交易对')
parser.add_argument('--period', default='daily',
choices=['daily', 'weekly', 'monthly'],
help='K线周期')
args = parser.parse_args()
if args.type == 'symbols':
result = get_crypto_symbols()
elif args.type == 'price':
result = get_crypto_price(args.symbol)
elif args.type == 'kline':
result = get_crypto_kline(args.symbol, args.period)
elif args.type == 'all_spot':
result = get_crypto_all_spot()
elif args.type == 'market_cap':
result = get_crypto_market_cap()
elif args.type == 'global_index':
result = get_crypto_global_index()
else:
result = {"error": f"未知类型: {args.type}"}
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""AKShare 外汇贵金属数据获取脚本
支持外汇行情、汇率数据、贵金属价格等"""
import sys
import json
import argparse
import pandas as pd
import akshare as ak
def get_forex_spot():
"""获取外汇实时行情"""
try:
df = ak.forex_spot_em()
return {
"type": "forex_spot",
"data": df.to_dict('records'),
"count": len(df),
"update_time": pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S")
}
except Exception as e:
return {"error": f"获取外汇实时行情失败: {str(e)}"}
def get_fx_spot_quote():
"""获取外汇即期报价"""
try:
df = ak.fx_spot_quote()
return {
"type": "fx_spot_quote",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取外汇即期报价失败: {str(e)}"}
def get_fx_swap_quote():
"""获取外汇掉期报价"""
try:
df = ak.fx_swap_quote()
return {
"type": "fx_swap_quote",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取外汇掉期报价失败: {str(e)}"}
def get_usd_cny():
"""获取美元兑人民币汇率"""
try:
df = ak.forex_usd_cny()
return {
"type": "usd_cny",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取美元兑人民币汇率失败: {str(e)}"}
def get_metals_gold():
"""获取国际金价"""
try:
df = ak.metals_gold()
return {
"type": "metals_gold",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取国际金价失败: {str(e)}"}
def get_metals_silver():
"""获取国际银价"""
try:
df = ak.metals_silver()
return {
"type": "metals_silver",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取国际银价失败: {str(e)}"}
def get_metals_shibor():
"""获取上海银行间拆借利率"""
try:
df = ak.metals_shibor()
return {
"type": "metals_shibor",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取上海银行间拆借利率失败: {str(e)}"}
def get_currency_pair_rate(pair="USD/CNY"):
"""获取指定货币对汇率"""
try:
# 根据货币对选择对应接口
if pair.upper() in ["USD/CNY", "USDCNY"]:
df = ak.forex_usd_cny()
elif pair.upper() in ["EUR/CNY", "EURCNY"]:
df = ak.forex_eur_cny()
elif pair.upper() in ["GBP/CNY", "GBPCNY"]:
df = ak.forex_gbp_cny()
elif pair.upper() in ["JPY/CNY", "JPYCNY"]:
df = ak.forex_jpy_cny()
else:
# 尝试通用外汇接口
df = ak.forex_hist(symbol=pair.replace("/", ""))
return {
"type": "currency_pair_rate",
"pair": pair,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取货币对汇率失败: {str(e)}"}
def get_forex_trading_calendar():
"""获取外汇交易日历"""
try:
df = ak.fx_trading_calendar()
return {
"type": "forex_trading_calendar",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取外汇交易日历失败: {str(e)}"}
def get_currency_rates_boc():
"""获取中国银行外汇牌价"""
try:
df = ak.currency_boc_sina()
return {
"type": "currency_rates_boc",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取中国银行外汇牌价失败: {str(e)}"}
def main():
parser = argparse.ArgumentParser(description='AKShare 外汇贵金属数据获取')
parser.add_argument('--type', required=True,
choices=['spot', 'spot_quote', 'swap_quote', 'usd_cny', 'gold',
'silver', 'shibor', 'pair_rate', 'calendar', 'boc_rates'],
help='数据类型')
parser.add_argument('--symbol', help='货币对或贵金属代码')
parser.add_argument('--pair', default='USD/CNY', help='货币对,如 USD/CNY')
args = parser.parse_args()
if args.type == 'spot':
result = get_forex_spot()
elif args.type == 'spot_quote':
result = get_fx_spot_quote()
elif args.type == 'swap_quote':
result = get_fx_swap_quote()
elif args.type == 'usd_cny':
result = get_usd_cny()
elif args.type == 'gold':
result = get_metals_gold()
elif args.type == 'silver':
result = get_metals_silver()
elif args.type == 'shibor':
result = get_metals_shibor()
elif args.type == 'pair_rate':
pair = args.pair if args.pair else "USD/CNY"
result = get_currency_pair_rate(pair)
elif args.type == 'calendar':
result = get_forex_trading_calendar()
elif args.type == 'boc_rates':
result = get_currency_rates_boc()
else:
result = {"error": f"未知类型: {args.type}"}
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""AKShare 基金数据获取脚本
支持ETF、开放式基金、基金评级等数据"""
import sys
import json
import argparse
import pandas as pd
import akshare as ak
def get_etf_spot():
"""获取ETF实时行情"""
try:
df = ak.fund_etf_spot_em()
return {
"type": "etf_spot",
"data": df.to_dict('records'),
"count": len(df),
"update_time": pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S")
}
except Exception as e:
return {"error": f"获取ETF实时行情失败: {str(e)}"}
def get_etf_hist(symbol, period="daily", start_date=None, end_date=None, adjust="qfq"):
"""获取ETF历史K线数据"""
try:
df = ak.fund_etf_hist_em(
symbol=symbol,
period=period,
start_date=start_date,
end_date=end_date,
adjust=adjust
)
return {
"type": "etf_hist",
"symbol": symbol,
"period": period,
"adjust": adjust,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取ETF历史数据失败: {str(e)}"}
def get_open_fund_daily(symbol):
"""获取开放式基金每日净值"""
try:
df = ak.fund_open_fund_daily_em(symbol=symbol)
return {
"type": "open_fund_daily",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取开放式基金净值失败: {str(e)}"}
def get_fund_rating():
"""获取基金评级"""
try:
df = ak.fund_rating_all()
return {
"type": "fund_rating",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取基金评级失败: {str(e)}"}
def get_fund_portfolio(symbol):
"""获取基金持仓信息"""
try:
df = ak.fund_portfolio_hold_em(symbol=symbol)
return {
"type": "fund_portfolio",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取基金持仓失败: {str(e)}"}
def get_fund_manager():
"""获取基金经理信息"""
try:
df = ak.fund_manager()
return {
"type": "fund_manager",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取基金经理信息失败: {str(e)}"}
def get_money_fund():
"""获取货币基金信息"""
try:
df = ak.fund_money_fund_em()
return {
"type": "money_fund",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取货币基金信息失败: {str(e)}"}
def get_fund_scale():
"""获取基金规模信息"""
try:
df = ak.fund_scale_open_em()
return {
"type": "fund_scale",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取基金规模信息失败: {str(e)}"}
def get_fund_new():
"""获取新发基金信息"""
try:
df = ak.fund_new_found_em()
return {
"type": "fund_new",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取新发基金信息失败: {str(e)}"}
def main():
parser = argparse.ArgumentParser(description='AKShare 基金数据获取')
parser.add_argument('--type', required=True,
choices=['etf_spot', 'etf_hist', 'open_fund', 'rating', 'portfolio',
'manager', 'money_fund', 'scale', 'new'],
help='数据类型')
parser.add_argument('--symbol', help='基金代码')
parser.add_argument('--period', default='daily',
choices=['daily', 'weekly', 'monthly'],
help='周期')
parser.add_argument('--start', help='开始日期 YYYYMMDD')
parser.add_argument('--end', help='结束日期 YYYYMMDD')
parser.add_argument('--adjust', default='qfq',
choices=['', 'qfq', 'hfq'],
help='复权类型')
args = parser.parse_args()
if args.type == 'etf_spot':
result = get_etf_spot()
elif args.type == 'etf_hist':
if not args.symbol:
result = {"error": "ETF历史数据需要指定symbol参数"}
else:
result = get_etf_hist(args.symbol, args.period, args.start, args.end, args.adjust)
elif args.type == 'open_fund':
if not args.symbol:
result = {"error": "开放式基金数据需要指定symbol参数"}
else:
result = get_open_fund_daily(args.symbol)
elif args.type == 'rating':
result = get_fund_rating()
elif args.type == 'portfolio':
if not args.symbol:
result = {"error": "基金持仓数据需要指定symbol参数"}
else:
result = get_fund_portfolio(args.symbol)
elif args.type == 'manager':
result = get_fund_manager()
elif args.type == 'money_fund':
result = get_money_fund()
elif args.type == 'scale':
result = get_fund_scale()
elif args.type == 'new':
result = get_fund_new()
else:
result = {"error": f"未知类型: {args.type}"}
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""AKShare 期货数据获取脚本
支持期货行情、历史K线、库存数据等"""
import sys
import json
import argparse
import pandas as pd
from akshare import get_futures_daily
import akshare as ak
def get_futures_daily_data(start_date, end_date, market="CFFEX"):
"""获取期货日线数据"""
try:
df = get_futures_daily(
start_date=start_date,
end_date=end_date,
market=market
)
return {
"market": market,
"start_date": start_date,
"end_date": end_date,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取期货日线数据失败: {str(e)}"}
def get_futures_spot():
"""获取期货实时行情"""
try:
df = ak.futures_zh_spot()
return {
"data": df.to_dict('records'),
"count": len(df),
"update_time": pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S")
}
except Exception as e:
return {"error": f"获取期货实时行情失败: {str(e)}"}
def get_futures_inventory(symbol="豆一"):
"""获取期货库存数据"""
try:
df = ak.futures_inventory_99(symbol=symbol)
return {
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取期货库存数据失败: {str(e)}"}
def get_cffex_daily(start_date, end_date):
"""获取中金所期货数据"""
return get_futures_daily_data(start_date, end_date, "CFFEX")
def get_shfe_daily(start_date, end_date):
"""获取上期所期货数据"""
return get_futures_daily_data(start_date, end_date, "SHFE")
def get_dce_daily(start_date, end_date):
"""获取大商所期货数据"""
return get_futures_daily_data(start_date, end_date, "DCE")
def get_czce_daily(start_date, end_date):
"""获取郑商所期货数据"""
return get_futures_daily_data(start_date, end_date, "CZCE")
def get_ine_daily(start_date, end_date):
"""获取上海国际能源交易中心期货数据"""
return get_futures_daily_data(start_date, end_date, "INE")
def get_gfex_daily(start_date, end_date):
"""获取广期所期货数据"""
return get_futures_daily_data(start_date, end_date, "GFEX")
def get_futures_contracts(exchange="CFFEX"):
"""获取期货合约列表"""
try:
# 获取实时行情来提取合约信息
df = ak.futures_zh_spot()
# 根据交易所筛选
if exchange == "CFFEX":
contracts = df[df['symbol'].str.contains('IF|IC|IH|T|TF|TS')]
elif exchange == "SHFE":
contracts = df[df['symbol'].str.contains('AU|AG|CU|AL|ZN|PB|NI|SN|RB|WR|HC')]
elif exchange == "DCE":
contracts = df[df['symbol'].str.contains('C|CS|A|M|Y|B|P|FB|BB|L|V|PP')]
elif exchange == "CZCE":
contracts = df[df['symbol'].str.contains('SR|CF|TA|OI|RI|WH|RS|RM|JR|LR|SF|SM')]
else:
contracts = df
return {
"exchange": exchange,
"contracts": contracts[['symbol', 'contract']].drop_duplicates().to_dict('records'),
"count": len(contracts)
}
except Exception as e:
return {"error": f"获取期货合约列表失败: {str(e)}"}
def get_futures_main_contract(symbol="IF"):
"""获取期货主力合约"""
try:
df = ak.futures_main_sure_em(symbol=symbol)
return {
"symbol": symbol,
"main_contract": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取期货主力合约失败: {str(e)}"}
def main():
parser = argparse.ArgumentParser(description='AKShare 期货数据获取')
parser.add_argument('--type', required=True,
choices=['daily', 'spot', 'inventory', 'contracts', 'main_contract',
'cffex', 'shfe', 'dce', 'czce', 'ine', 'gfex'],
help='数据类型')
parser.add_argument('--start', required=True, help='开始日期 YYYYMMDD')
parser.add_argument('--end', required=True, help='结束日期 YYYYMMDD')
parser.add_argument('--market', default='CFFEX',
choices=['CFFEX', 'SHFE', 'DCE', 'CZCE', 'INE', 'GFEX'],
help='交易所')
parser.add_argument('--symbol', help='期货品种或合约代码')
args = parser.parse_args()
if args.type == 'daily':
result = get_futures_daily_data(args.start, args.end, args.market)
elif args.type == 'spot':
result = get_futures_spot()
elif args.type == 'inventory':
symbol = args.symbol if args.symbol else "豆一"
result = get_futures_inventory(symbol)
elif args.type == 'contracts':
market = args.market if args.market else "CFFEX"
result = get_futures_contracts(market)
elif args.type == 'main_contract':
symbol = args.symbol if args.symbol else "IF"
result = get_futures_main_contract(symbol)
elif args.type == 'cffex':
result = get_cffex_daily(args.start, args.end)
elif args.type == 'shfe':
result = get_shfe_daily(args.start, args.end)
elif args.type == 'dce':
result = get_dce_daily(args.start, args.end)
elif args.type == 'czce':
result = get_czce_daily(args.start, args.end)
elif args.type == 'ine':
result = get_ine_daily(args.start, args.end)
elif args.type == 'gfex':
result = get_gfex_daily(args.start, args.end)
else:
result = {"error": f"未知类型: {args.type}"}
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""AKShare 指数数据获取脚本
支持A股指数、全球指数等数据"""
import sys
import json
import argparse
import pandas as pd
import akshare as ak
def get_index_daily(symbol="sh000001"):
"""获取A股指数日线数据"""
try:
df = ak.stock_zh_index_daily_em(symbol=symbol)
return {
"type": "index_daily",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取指数日线数据失败: {str(e)}"}
def get_index_component(symbol="000300"):
"""获取指数成分股"""
try:
df = ak.index_stock_cons_csindex(symbol=symbol)
return {
"type": "index_component",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取指数成分股失败: {str(e)}"}
def get_global_index():
"""获取全球指数数据"""
try:
df = ak.index_global_em()
return {
"type": "global_index",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as as e:
return {"error": f"获取全球指数失败: {str(e)}"}
def get_index_value(symbol="000300"):
"""获取指数估值数据"""
try:
df = ak.index_value_name_funddb()
# 筛选指定指数
if symbol:
df = df[df['指数代码'] == symbol]
return {
"type": "index_value",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取指数估值失败: {str(e)}"}
def get_index_weight(symbol="000300"):
"""获取指数权重数据"""
try:
df = ak.index_stock_weight_csindex(symbol=symbol)
return {
"type": "index_weight",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取指数权重失败: {str(e)}"}
def get_index_analysis(symbol="000300"):
"""获取指数分析数据"""
try:
df = ak.index_analysis_weekly(symbol=symbol)
return {
"type": "index_analysis",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取指数分析失败: {str(e)}"}
def main():
parser = argparse.ArgumentParser(description='AKShare 指数数据获取')
parser.add_argument('--type', required=True,
choices=['daily', 'component', 'global', 'value', 'weight', 'analysis'],
help='数据类型')
parser.add_argument('--symbol', default='000300', help='指数代码')
args = parser.parse_args()
if args.type == 'daily':
# 处理带前缀的指数代码
symbol = args.symbol
if not symbol.startswith(('sh', 'sz')):
if symbol.startswith('000'):
symbol = f"sh{symbol}"
elif symbol.startswith('399'):
symbol = f"sz{symbol}"
result = get_index_daily(symbol)
elif args.type == 'component':
result = get_index_component(args.symbol)
elif args.type == 'global':
result = get_global_index()
elif args.type == 'value':
result = get_index_value(args.symbol)
elif args.type == 'weight':
result = get_index_weight(args.symbol)
elif args.type == 'analysis':
result = get_index_analysis(args.symbol)
else:
result = {"error": f"未知类型: {args.type}"}
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""AKShare 宏观经济数据获取脚本
支持GDP、CPI、PMI等宏观经济指标"""
import sys
import json
import argparse
import pandas as pd
import akshare as ak
def get_macro_china_gdp():
"""获取中国GDP数据"""
try:
df = ak.macro_china_gdp()
return {
"type": "macro_china_gdp",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取中国GDP数据失败: {str(e)}"}
def get_macro_china_gdp_yearly():
"""获取中国GDP年度数据"""
try:
df = ak.macro_china_gdp_yearly()
return {
"type": "macro_china_gdp_yearly",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取中国GDP年度数据失败: {str(e)}"}
def get_macro_china_cpi():
"""获取中国CPI数据"""
try:
df = ak.macro_china_cpi()
return {
"type": "macro_china_cpi",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取中国CPI数据失败: {str(e)}"}
def get_macro_china_cpi_yearly():
"""获取中国CPI年度数据"""
try:
df = ak.macro_china_cpi_yearly()
return {
"type": "macro_china_cpi_yearly",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取中国CPI年度数据失败: {str(e)}"}
def get_macro_china_pmi():
"""获取中国PMI数据"""
try:
df = ak.macro_china_pmi()
return {
"type": "macro_china_pmi",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取中国PMI数据失败: {str(e)}"}
def get_macro_china_m2():
"""获取中国M2货币供应数据"""
try:
df = ak.macro_china_m2()
return {
"type": "macro_china_m2",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取中国M2数据失败: {str(e)}"}
def get_macro_usa_non_farm():
"""获取美国非农就业数据"""
try:
df = ak.macro_usa_non_farm()
return {
"type": "macro_usa_non_farm",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取美国非农就业数据失败: {str(e)}"}
def get_macro_usa_cpi_monthly():
"""获取美国CPI月度数据"""
try:
df = ak.macro_usa_cpi_monthly()
return {
"type": "macro_usa_cpi_monthly",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取美国CPI月度数据失败: {str(e)}"}
def get_macro_usa_gdp_monthly():
"""获取美国GDP月度数据"""
try:
df = ak.macro_usa_gdp_monthly()
return {
"type": "macro_usa_gdp_monthly",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取美国GDP月度数据失败: {str(e)}"}
def get_macro_usa_unemployment():
"""获取美国失业率数据"""
try:
df = ak.macro_usa_unemployment()
return {
"type": "macro_usa_unemployment",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取美国失业率数据失败: {str(e)}"}
def get_macro_summary():
"""获取宏观经济概览"""
try:
result = {}
# 中国主要指标
china_indicators = {
"gdp": get_macro_china_gdp(),
"cpi": get_macro_china_cpi(),
"pmi": get_macro_china_pmi(),
"m2": get_macro_china_m2()
}
# 美国主要指标
usa_indicators = {
"non_farm": get_macro_usa_non_farm(),
"cpi": get_macro_usa_cpi_monthly(),
"gdp": get_macro_usa_gdp_monthly(),
"unemployment": get_macro_usa_unemployment()
}
# 提取最新数据
for key, data in china_indicators.items():
if "error" not in data and len(data.get("data", [])) > 0:
latest = data["data"][-1]
result[f"china_{key}"] = {
"value": latest.get("value", latest.get("data", None)),
"date": latest.get("date", latest.get("time", None))
}
for key, data in usa_indicators.items():
if "error" not in data and len(data.get("data", [])) > 0:
latest = data["data"][-1]
result[f"usa_{key}"] = {
"value": latest.get("value", latest.get("data", None)),
"date": latest.get("date", latest.get("time", None))
}
return {
"type": "macro_summary",
"data": result,
"update_time": pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S")
}
except Exception as e:
return {"error": f"获取宏观经济概览失败: {str(e)}"}
def main():
parser = argparse.ArgumentParser(description='AKShare 宏观经济数据获取')
parser.add_argument('--type', required=True,
choices=['gdp', 'gdp_yearly', 'cpi', 'cpi_yearly', 'pmi', 'm2',
'usa_non_farm', 'usa_cpi', 'usa_gdp', 'usa_unemployment', 'summary'],
help='宏观经济指标类型')
args = parser.parse_args()
if args.type == 'gdp':
result = get_macro_china_gdp()
elif args.type == 'gdp_yearly':
result = get_macro_china_gdp_yearly()
elif args.type == 'cpi':
result = get_macro_china_cpi()
elif args.type == 'cpi_yearly':
result = get_macro_china_cpi_yearly()
elif args.type == 'pmi':
result = get_macro_china_pmi()
elif args.type == 'm2':
result = get_macro_china_m2()
elif args.type == 'usa_non_farm':
result = get_macro_usa_non_farm()
elif args.type == 'usa_cpi':
result = get_macro_usa_cpi_monthly()
elif args.type == 'usa_gdp':
result = get_macro_usa_gdp_monthly()
elif args.type == 'usa_unemployment':
result = get_macro_usa_unemployment()
elif args.type == 'summary':
result = get_macro_summary()
else:
result = {"error": f"未知类型: {args.type}"}
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""AKShare 期权数据获取脚本
支持期权历史数据、实时行情等"""
import sys
import json
import argparse
import pandas as pd
import akshare as ak
def get_option_hist_dce(symbol="豆粕期权"):
"""获取大商所期权历史数据"""
try:
df = ak.option_hist_dce(symbol=symbol)
return {
"type": "option_hist_dce",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取大商所期权历史数据失败: {str(e)}"}
def get_option_hist_czce(symbol="白糖期权"):
"""获取郑商所期权历史数据"""
try:
df = ak.option_hist_czce(symbol=symbol)
return {
"type": "option_hist_czce",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取郑商所期权历史数据失败: {str(e)}"}
def get_option_hist_shfe(symbol="铜期权"):
"""获取上期所期权历史数据"""
try:
df = ak.option_hist_shfe(symbol=symbol)
return {
"type": "option_hist_shfe",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取上期所期权历史数据失败: {str(e)}"}
def get_option_sse_spot_price(symbol="510050"):
"""获取上证50ETF期权实时行情"""
try:
df = ak.option_sse_spot_price(symbol=symbol)
return {
"type": "option_sse_spot",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取上证50ETF期权实时行情失败: {str(e)}"}
def get_option_sse_underlying_spot_price(symbol="510050"):
"""获取上证50ETF期权标的实时行情"""
try:
df = ak.option_sse_underlying_spot_price(symbol=symbol)
return {
"type": "option_sse_underlying_spot",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取期权标的实时行情失败: {str(e)}"}
def get_option_sse_minute_sina(symbol="510050"):
"""获取上证50ETF期权分钟数据"""
try:
df = ak.option_sse_minute_sina(symbol=symbol)
return {
"type": "option_sse_minute",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取期权分钟数据失败: {str(e)}"}
def get_option_sse_daily_sina(symbol="510050"):
"""获取上证50ETF期权日K线数据"""
try:
df = ak.option_sse_daily_sina(symbol=symbol)
return {
"type": "option_sse_daily",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取期权日K线数据失败: {str(e)}"}
def get_option_finance_board(symbol="510050"):
"""获取期权财务指标"""
try:
df = ak.option_finance_board(symbol=symbol)
return {
"type": "option_finance_board",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取期权财务指标失败: {str(e)}"}
def main():
parser = argparse.ArgumentParser(description='AKShare 期权数据获取')
parser.add_argument('--type', required=True,
choices=['hist_dce', 'hist_czce', 'hist_shfe', 'sse_spot',
'sse_underlying', 'sse_minute', 'sse_daily', 'finance_board'],
help='数据类型')
parser.add_argument('--symbol', default='510050', help='期权代码或名称')
args = parser.parse_args()
if args.type == 'hist_dce':
result = get_option_hist_dce(args.symbol)
elif args.type == 'hist_czce':
result = get_option_hist_czce(args.symbol)
elif args.type == 'hist_shfe':
result = get_option_hist_shfe(args.symbol)
elif args.type == 'sse_spot':
result = get_option_sse_spot_price(args.symbol)
elif args.type == 'sse_underlying':
result = get_option_sse_underlying_spot_price(args.symbol)
elif args.type == 'sse_minute':
result = get_option_sse_minute_sina(args.symbol)
elif args.type == 'sse_daily':
result = get_option_sse_daily_sina(args.symbol)
elif args.type == 'finance_board':
result = get_option_finance_board(args.symbol)
else:
result = {"error": f"未知类型: {args.type}"}
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""AKShare 特色数据获取脚本
支持龙虎榜、融资融券、北向资金、股东数据等"""
import sys
import json
import argparse
import pandas as pd
import akshare as ak
def get_stock_lhb_detail(start_date, end_date):
"""获取龙虎榜详细数据"""
try:
df = ak.stock_lhb_detail_em(start_date=start_date, end_date=end_date)
return {
"type": "lhb_detail",
"start_date": start_date,
"end_date": end_date,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取龙虎榜详细数据失败: {str(e)}"}
def get_stock_lhb_hyyyb(start_date, end_date):
"""获取龙虎榜营业部排名"""
try:
df = ak.stock_lhb_hyyyb_em(start_date=start_date, end_date=end_date)
return {
"type": "lhb_hyyyb",
"start_date": start_date,
"end_date": end_date,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取龙虎榜营业部排名失败: {str(e)}"}
def get_stock_margin_sse(start_date, end_date):
"""获取沪深融资融券汇总数据"""
try:
df = ak.stock_margin_sse(start_date=start_date, end_date=end_date)
return {
"type": "margin_sse",
"start_date": start_date,
"end_date": end_date,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取融资融券汇总数据失败: {str(e)}"}
def get_stock_margin_detail(date):
"""获取个股融资融券明细"""
try:
df = ak.stock_margin_detail_sse(date=date)
return {
"type": "margin_detail",
"date": date,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取融资融券明细失败: {str(e)}"}
def get_stock_hsgt_hist(symbol="北向资金"):
"""获取北向资金历史数据"""
try:
df = ak.stock_hsgt_hist_em(symbol=symbol)
return {
"type": "hsgt_hist",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取北向资金历史数据失败: {str(e)}"}
def get_stock_hsgt_hold_stock(market="北向", indicator="今日排行"):
"""获取北向资金持股明细"""
try:
df = ak.stock_hsgt_hold_stock_em(market=market, indicator=indicator)
return {
"type": "hsgt_hold_stock",
"market": market,
"indicator": indicator,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取北向资金持股明细失败: {str(e)}"}
def get_stock_gdfx_top_10(symbol, date):
"""获取前十大股东"""
try:
df = ak.stock_gdfx_top_10_em(symbol=symbol, date=date)
return {
"type": "gdfx_top_10",
"symbol": symbol,
"date": date,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取前十大股东失败: {str(e)}"}
def get_stock_gdfx_free_top_10(symbol, date):
"""获取前十大流通股东"""
try:
df = ak.stock_gdfx_free_top_10_em(symbol=symbol, date=date)
return {
"type": "gdfx_free_top_10",
"symbol": symbol,
"date": date,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取前十大流通股东失败: {str(e)}"}
def get_stock_board_industry():
"""获取行业板块行情"""
try:
df = ak.stock_board_industry_name_em()
return {
"type": "board_industry",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取行业板块行情失败: {str(e)}"}
def get_stock_board_concept():
"""获取概念板块行情"""
try:
df = ak.stock_board_concept_name_em()
return {
"type": "board_concept",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取概念板块行情失败: {str(e)}"}
def get_stock_board_industry_cons(symbol="银行"):
"""获取特定板块成分股"""
try:
df = ak.stock_board_industry_cons_em(symbol=symbol)
return {
"type": "board_industry_cons",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取板块成分股失败: {str(e)}"}
def get_stock_restricted_release(symbol="全部A股"):
"""获取限售解禁数据"""
try:
df = ak.stock_restricted_release_queue_em(symbol=symbol)
return {
"type": "restricted_release",
"symbol": symbol,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取限售解禁数据失败: {str(e)}"}
def get_stock_market_fund_flow():
"""获取大盘资金流向"""
try:
df = ak.stock_market_fund_flow()
return {
"type": "market_fund_flow",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取大盘资金流向失败: {str(e)}"}
def get_stock_individual_fund_flow(stock, market="sz"):
"""获取个股资金流向"""
try:
df = ak.stock_individual_fund_flow(stock=stock, market=market)
return {
"type": "individual_fund_flow",
"stock": stock,
"market": market,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取个股资金流向失败: {str(e)}"}
def main():
parser = argparse.ArgumentParser(description='AKShare 特色数据获取')
parser.add_argument('--type', required=True,
choices=['lhb_detail', 'lhb_hyyyb', 'margin_sse', 'margin_detail',
'hsgt_hist', 'hsgt_hold', 'gdfx_top10', 'gdfx_free_top10',
'board_industry', 'board_concept', 'board_cons', 'restricted_release',
'market_fund_flow', 'individual_fund_flow'],
help='数据类型')
parser.add_argument('--start', help='开始日期 YYYYMMDD')
parser.add_argument('--end', help='结束日期 YYYYMMDD')
parser.add_argument('--date', help='指定日期 YYYYMMDD')
parser.add_argument('--symbol', help='股票代码或板块名称')
parser.add_argument('--market', default='sz', help='市场类型')
parser.add_argument('--indicator', default='今日排行', help='指标类型')
args = parser.parse_args()
if args.type == 'lhb_detail':
if not args.start or not args.end:
result = {"error": "龙虎榜详细数据需要start和end参数"}
else:
result = get_stock_lhb_detail(args.start, args.end)
elif args.type == 'lhb_hyyyb':
if not args.start or not args.end:
result = {"error": "龙虎榜营业部排名需要start和end参数"}
else:
result = get_stock_lhb_hyyyb(args.start, args.end)
elif args.type == 'margin_sse':
if not args.start or not args.end:
result = {"error": "融资融券汇总数据需要start和end参数"}
else:
result = get_stock_margin_sse(args.start, args.end)
elif args.type == 'margin_detail':
if not args.date:
result = {"error": "融资融券明细需要date参数"}
else:
result = get_stock_margin_detail(args.date)
elif args.type == 'hsgt_hist':
symbol = args.symbol if args.symbol else "北向资金"
result = get_stock_hsgt_hist(symbol)
elif args.type == 'hsgt_hold':
market = args.market if args.market else "北向"
indicator = args.indicator if args.indicator else "今日排行"
result = get_stock_hsgt_hold_stock(market, indicator)
elif args.type == 'gdfx_top10':
if not args.symbol or not args.date:
result = {"error": "前十大股东需要symbol和date参数"}
else:
result = get_stock_gdfx_top_10(args.symbol, args.date)
elif args.type == 'gdfx_free_top10':
if not args.symbol or not args.date:
result = {"error": "前十大流通股东需要symbol和date参数"}
else:
result = get_stock_gdfx_free_top_10(args.symbol, args.date)
elif args.type == 'board_industry':
result = get_stock_board_industry()
elif args.type == 'board_concept':
result = get_stock_board_concept()
elif args.type == 'board_cons':
symbol = args.symbol if args.symbol else "银行"
result = get_stock_board_industry_cons(symbol)
elif args.type == 'restricted_release':
symbol = args.symbol if args.symbol else "全部A股"
result = get_stock_restricted_release(symbol)
elif args.type == 'market_fund_flow':
result = get_stock_market_fund_flow()
elif args.type == 'individual_fund_flow':
if not args.symbol:
result = {"error": "个股资金流向需要symbol参数"}
else:
market = args.market if args.market else "sz"
result = get_stock_individual_fund_flow(args.symbol, market)
else:
result = {"error": f"未知类型: {args.type}"}
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""AKShare 股票数据获取脚本
支持A股、港股、美股的历史K线、实时行情、财务数据等"""
import sys
import json
import argparse
import pandas as pd
import akshare as ak
def get_stock_hist(symbol, period="daily", start_date=None, end_date=None, adjust=""):
"""获取股票历史K线数据"""
try:
df = ak.stock_zh_a_hist(
symbol=symbol,
period=period,
start_date=start_date,
end_date=end_date,
adjust=adjust
)
return {
"symbol": symbol,
"period": period,
"adjust": adjust,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取历史数据失败: {str(e)}"}
def get_stock_hist_min(symbol, period="5", start_date=None, end_date=None, adjust=""):
"""获取股票分钟K线数据"""
try:
df = ak.stock_zh_a_hist_min_em(
symbol=symbol,
period=period,
start_date=start_date,
end_date=end_date,
adjust=adjust
)
return {
"symbol": symbol,
"period": f"{period}min",
"adjust": adjust,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取分钟数据失败: {str(e)}"}
def get_stock_spot():
"""获取全部A股实时行情"""
try:
df = ak.stock_zh_a_spot_em()
return {
"data": df.to_dict('records'),
"count": len(df),
"update_time": pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S")
}
except Exception as e:
return {"error": f"获取实时行情失败: {str(e)}"}
def get_stock_info(symbol):
"""获取个股基本信息"""
try:
df = ak.stock_individual_info_em(symbol=symbol)
return {
"symbol": symbol,
"info": df.to_dict('records')[0] if len(df) > 0 else {}
}
except Exception as e:
return {"error": f"获取个股信息失败: {str(e)}"}
def get_stock_fundamental(symbol):
"""获取股票基本面数据"""
try:
df = ak.stock_fundamental(symbol=symbol)
return {
"symbol": symbol,
"fundamental": df.to_dict('records')
}
except Exception as e:
return {"error": f"获取基本面数据失败: {str(e)}"}
def get_stock_valuation(symbol):
"""获取股票估值指标"""
try:
df = ak.stock_valuation(symbol=symbol)
return {
"symbol": symbol,
"valuation": df.to_dict('records')
}
except Exception as e:
return {"error": f"获取估值数据失败: {str(e)}"}
def get_hk_stock_hist(symbol, period="daily", start_date=None, end_date=None, adjust=""):
"""获取港股历史数据"""
try:
df = ak.stock_hk_hist(
symbol=symbol,
period=period,
start_date=start_date,
end_date=end_date,
adjust=adjust
)
return {
"symbol": symbol,
"market": "hk",
"period": period,
"adjust": adjust,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取港股历史数据失败: {str(e)}"}
def get_hk_stock_spot():
"""获取港股实时行情"""
try:
df = ak.stock_hk_spot_em()
return {
"market": "hk",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取港股实时行情失败: {str(e)}"}
def get_us_stock_hist(symbol, adjust="qfq"):
"""获取美股历史数据"""
try:
df = ak.stock_us_daily(symbol=symbol, adjust=adjust)
return {
"symbol": symbol,
"market": "us",
"adjust": adjust,
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取美股历史数据失败: {str(e)}"}
def get_us_stock_spot():
"""获取美股实时行情"""
try:
df = ak.stock_us_spot_em()
return {
"market": "us",
"data": df.to_dict('records'),
"count": len(df)
}
except Exception as e:
return {"error": f"获取美股实时行情失败: {str(e)}"}
def get_market_overview():
"""获取市场概览"""
try:
df = ak.stock_zh_a_spot_em()
# 计算市场统计
total_stocks = len(df)
up_stocks = len(df[df['涨跌幅'].astype(float) > 0])
down_stocks = len(df[df['涨跌幅'].astype(float) < 0])
flat_stocks = len(df[df['涨跌幅'].astype(float) == 0])
# 获取涨跌停股票
limit_up = len(df[df['涨跌幅'].astype(float) >= 9.5])
limit_down = len(df[df['涨跌幅'].astype(float) <= -9.5])
# 获取涨跌榜
df_sorted = df.sort_values('涨跌幅', ascending=False)
top_gainers = df_sorted.head(10)[['代码', '名称', '最新价', '涨跌幅']].to_dict('records')
top_losers = df_sorted.tail(10)[['代码', '名称', '最新价', '涨跌幅']].to_dict('records')
return {
"market_stats": {
"total_stocks": total_stocks,
"up_stocks": up_stocks,
"down_stocks": down_stocks,
"flat_stocks": flat_stocks,
"limit_up": limit_up,
"limit_down": limit_down
},
"top_gainers": top_gainers,
"top_losers": top_losers,
"update_time": pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S")
}
except Exception as e:
return {"error": f"获取市场概览失败: {str(e)}"}
def main():
parser = argparse.ArgumentParser(description='AKShare 股票数据获取')
parser.add_argument('--type', required=True,
choices=['hist', 'hist_min', 'spot', 'info', 'fundamental', 'valuation',
'hk_hist', 'hk_spot', 'us_hist', 'us_spot', 'overview'],
help='数据类型')
parser.add_argument('--symbol', help='股票代码')
parser.add_argument('--period', default='daily',
choices=['daily', 'weekly', 'monthly'],
help='周期')
parser.add_argument('--start', help='开始日期 YYYYMMDD')
parser.add_argument('--end', help='结束日期 YYYYMMDD')
parser.add_argument('--adjust', default='',
choices=['', 'qfq', 'hfq'],
help='复权类型')
args = parser.parse_args()
if args.type == 'hist':
result = get_stock_hist(args.symbol, args.period, args.start, args.end, args.adjust)
elif args.type == 'hist_min':
period = args.period if args.period in ['1', '5', '15', '30', '60'] else '5'
result = get_stock_hist_min(args.symbol, period, args.start, args.end, args.adjust)
elif args.type == 'spot':
result = get_stock_spot()
elif args.type == 'info':
result = get_stock_info(args.symbol)
elif args.type == 'fundamental':
result = get_stock_fundamental(args.symbol)
elif args.type == 'valuation':
result = get_stock_valuation(args.symbol)
elif args.type == 'hk_hist':
result = get_hk_stock_hist(args.symbol, args.period, args.start, args.end, args.adjust)
elif args.type == 'hk_spot':
result = get_hk_stock_spot()
elif args.type == 'us_hist':
result = get_us_stock_hist(args.symbol, args.adjust)
elif args.type == 'us_spot':
result = get_us_stock_spot()
elif args.type == 'overview':
result = get_market_overview()
else:
result = {"error": f"未知类型: {args.type}"}
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
if __name__ == "__main__":
main()