
Baostock
- 161 installs
- 169 repo stars
- Updated June 29, 2026
- lzwme/finance-quant-skills
Helps with ai & agent building tasks.
About
baostock is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- baostock
- AI & Agent Building
- AI-coding skill
Baostock by the numbers
- 161 all-time installs (skills.sh)
- +10 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #3,231 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 baostockAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 161 |
|---|---|
| repo stars | ★ 169 |
| Last updated | June 29, 2026 |
| Repository | lzwme/finance-quant-skills ↗ |
What it does
Helps with ai & agent building tasks.
Files
baostock A股数据获取
任务目标
- 本 Skill 用于:通过 BaoStock 接口获取 A 股市场数据、财务指标和股票信息
- 能力包含:历史 K 线、财务数据、股票信息、行业分类、指数成分股、交易日历
- 触发条件:用户提及 baostock 或需要获取 A 股免费数据、历史行情、财务信息时
前置准备
- 依赖说明:安装 baostock 库(已包含在 dependency 中)
- 凭证配置:BaoStock 无需注册或 API Key,直接调用即可使用
- 可选配置:支持通过环境变量自定义服务器地址(用于代理场景)
BAOSTOCK_SERVER_IP:自定义服务器 IP(用于 nginx 代理等场景)BAOSTOCK_SERVER_PORT:服务器端口,默认 10030
操作步骤
- 标准流程:
1. 确定数据需求 — 智能体理解用户意图(行情/K线/财务/股票信息等) 2. 调用对应脚本 — 根据数据类型选择脚本 3. 解析结果 — 智能体分析返回的 JSON 格式数据
- 脚本调用映射:
- K线/行情数据 →
python scripts/market_data.py --type kline --code sh.600000 --start 2024-01-01 --end 2024-01-31 - 财务数据 →
python scripts/financial_data.py --type profit --code sh.600000 --year 2023 --quarter 4 - 股票列表/信息 →
python scripts/stock_info.py --type all_stocks --date 2024-01-02 - 指数成分股 →
python scripts/stock_info.py --type index_stocks --index hs300 - 行业分类 →
python scripts/stock_info.py --type industry - 交易日历 →
python scripts/stock_info.py --type trade_dates --start 2024-01-01 --end 2024-12-31 - 可选分支:
- 当需要多只股票数据:使用逗号分隔多个代码,或使用
--file指定代码列表文件 - 当需要指定频率:使用
--frequency参数(d/w/m/5/15/30/60) - 当需要调整复权类型:使用
--adjust参数(1=后复权,2=前复权,3=不复权)
使用示例
- 示例1:获取股票日K线数据
- 场景/输入:用户说"查看贵州茅台最近一个月的K线数据"
- 预期产出:返回日期、开盘价、最高价、最低价、收盘价、成交量等 OHLCV 数据
- 关键要点:调用
python scripts/market_data.py --type kline --code sh.600519 --start 2024-03-01 --end 2024-03-31 --frequency d --adjust 2 - 示例2:查询财务指标
- 场景/输入:用户说"获取工商银行2023年的盈利能力指标"
- 预期产出:返回 ROE、净利润率、毛利率等财务指标
- 关键要点:调用
python scripts/financial_data.py --type profit --code sh.601398 --year 2023 --quarter 4 - 示例3:获取沪深300成分股
- 场景/输入:用户说"查询沪深300指数的成分股列表"
- 预期产出:返回沪深300指数的所有成分股代码和名称
- 关键要点:调用
python scripts/stock_info.py --type index_stocks --index hs300 - 示例4:批量下载多只股票数据
- 场景/输入:用户说"下载茅台、平安、招行的2024年日K线数据"
- 预期产出:返回多只股票的 K 线数据并保存为 CSV
- 关键要点:调用
python scripts/market_data.py --type kline --code sh.600519,sz.000001,sh.600036 --start 2024-01-01 --end 2024-12-31 --output stocks.csv
快速参考
常用代码示例
import baostock as bs
import pandas as pd
# 登录系统
lg = bs.login()
# 获取日K线数据
rs = bs.query_history_k_data_plus(
"sh.600519",
"date,code,open,high,low,close,volume,amount",
start_date='2024-01-01', end_date='2024-12-31',
frequency="d", adjustflag="2"
)
# 转换为 DataFrame
data_list = []
while (rs.error_code == '0') & rs.next():
data_list.append(rs.get_row_data())
df = pd.DataFrame(data_list, columns=rs.fields)
# 登出系统
bs.logout()与其他数据源对比
| 特性 | baostock | tushare | jqdatasdk | akshare |
|---|---|---|---|---|
| 费用 | 免费 | 免费/付费 | 需注册积分 | 免费 |
| 注册要求 | ❌ 不需要 | ✅ 需要 | ✅ 需要 | ❌ 不需要 |
| 数据范围 | A股为主 | 全面(含宏观) | A股+因子 | 全面(含加密货币) |
| K线数据 | ✅ | ✅ | ✅ | ✅ |
| 财务数据 | ✅ | ✅ | ✅ | ✅ |
| 分钟线 | ✅ | ✅ | ✅ | ✅ |
| 实时行情 | ❌ | ❌ | ❌ | ✅ |
| 特色数据 | 交易日历 | 宏观/Shibor | 因子数据 | 龙虎榜/北向/加密货币 |
资源索引
脚本:
- scripts/market_data.py(用途与参数:获取 K 线/行情数据,支持 --type/--code/--start/--end/--frequency/--adjust/--fields/--output)
- scripts/financial_data.py(用途与参数:获取财务数据,支持 --type/--code/--year/--quarter/--output)
- scripts/stock_info.py(用途与参数:获取股票列表/信息/行业/指数成分股,支持 --type/--date/--code/--index/--output)
- scripts/auth.py(用途与参数:认证模块,支持自定义服务器配置)
参考文档
- 常用API文档(何时读取:需要使用 BaoStock Python API、查看详细 API 参数说明时)
- 知识库文档目录(何时读取:需要查看更为全面详细 API 参数说明时)
注意事项
- BaoStock 无需注册或 API Key,直接调用
bs.login()即可使用 - BaoStock 股票代码格式:
sh.600000(上海)、sz.000001(深圳)、bj.430047(北京) - 部分数据(如财务数据)可能有延迟,建议在交易日 9:30-15:00 之外获取
- 脚本返回 JSON 格式数据,智能体负责解析并转换为用户友好的展示
- 每个会话必须以
bs.login()开始、bs.logout()结束 - K 线数据默认返回字符串类型,数值计算前需用
.astype(float)转换 - 非线程安全,并行下载请使用多进程而非多线程
- 财务数据按季度提供,报告期结束后约有 2 个月的延迟
BaoStock API 参考文档
本文档提供 BaoStock 所有 API 的详细说明和参数定义。
目录
1. 认证与配置 2. 行情数据 3. 财务数据 4. 股票信息 5. 行业与指数 6. 错误处理
---
认证与配置
bs.login()
登录 BaoStock 系统。每个会话必须以 login 开始。
lg = bs.login()返回: LoginResult 对象
error_code: 错误代码,"0" 表示成功error_msg: 错误信息
示例:
import baostock as bs
lg = bs.login()
if lg.error_code == "0":
print("登录成功")
else:
print(f"登录失败: {lg.error_msg}")bs.logout()
登出 BaoStock 系统。每个会话应以 logout 结束。
bs.logout()自定义服务器配置
支持通过环境变量或代码方式自定义服务器地址:
import os
import baostock as bs
import baostock.common.contants as cons
# 方式1:环境变量
os.environ['BAOSTOCK_SERVER_IP'] = 'your.server.ip'
os.environ['BAOSTOCK_SERVER_PORT'] = '10030'
# 方式2:代码设置
cons.BAOSTOCK_SERVER_IP = 'your.server.ip'
cons.BAOSTOCK_SERVER_PORT = 10030
# 然后登录
lg = bs.login()---
行情数据
query_history_k_data_plus()
获取历史 K 线数据(主要行情接口)。
rs = bs.query_history_k_data_plus(
code,
fields,
start_date=None,
end_date=None,
frequency='d',
adjustflag='3'
)参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| code | str | 是 | 股票代码,如 sh.600000、sz.000001 |
| fields | str | 是 | 字段列表,逗号分隔 |
| start_date | str | 否 | 开始日期,格式 YYYY-MM-DD |
| end_date | str | 否 | 结束日期,格式 YYYY-MM-DD |
| frequency | str | 否 | 频率:d(日线)、w(周线)、m(月线)、5/15/30/60(分钟线),默认 d |
| adjustflag | str | 否 | 复权类型:1(后复权)、2(前复权)、3(不复权),默认 3 |
日线可用字段:
| 字段 | 说明 |
|---|---|
| date | 日期 |
| code | 证券代码 |
| open | 开盘价 |
| high | 最高价 |
| low | 最低价 |
| close | 收盘价 |
| preclose | 昨收价 |
| volume | 成交量(股) |
| amount | 成交额(元) |
| adjustflag | 复权标志 |
| turn | 换手率(%) |
| tradestatus | 交易状态:0=停牌,1=正常交易 |
| pctChg | 涨跌幅(%) |
| peTTM | 滚动市盈率 |
| pbMRQ | 市净率 |
| psTTM | 滚动市销率 |
| pcfNcfTTM | 滚动市现率 |
| isST | 是否ST:0=否,1=是 |
分钟线可用字段:
| 字段 | 说明 |
|---|---|
| date | 日期 |
| time | 时间(格式:HHMMSS) |
| code | 证券代码 |
| open | 开盘价 |
| high | 最高价 |
| low | 最低价 |
| close | 收盘价 |
| volume | 成交量 |
| amount | 成交额 |
| adjustflag | 复权标志 |
返回: QueryResult 对象
error_code: 错误代码error_msg: 错误信息fields: 字段名列表next(): 获取下一行数据get_row_data(): 获取当前行数据列表
示例:
# 获取贵州茅台2024年日K线(前复权)
rs = bs.query_history_k_data_plus(
"sh.600519",
"date,code,open,high,low,close,volume,amount,pctChg",
start_date="2024-01-01",
end_date="2024-12-31",
frequency="d",
adjustflag="2"
)
data = []
while rs.next():
data.append(rs.get_row_data())
df = pd.DataFrame(data, columns=rs.fields)---
财务数据
query_profit_data()
获取盈利能力数据。
rs = bs.query_profit_data(code, year, quarter)参数:
code(str): 股票代码year(int): 年份,如 2023quarter(int): 季度,1/2/3/4
返回字段:
| 字段 | 说明 |
|---|---|
| code | 股票代码 |
| pubDate | 发布日期 |
| statDate | 统计日期 |
| roeAvg | 净资产收益率(平均) |
| npMargin | 销售净利率 |
| gpMargin | 销售毛利率 |
| netProfit | 净利润(万元) |
| epsTTM | 每股收益(TTM) |
| MBRevenue | 主营营业收入(万元) |
| totalShare | 总股本(万股) |
| liqaShare | 流通股本(万股) |
query_operation_data()
获取营运能力数据。
rs = bs.query_operation_data(code, year, quarter)返回字段:
| 字段 | 说明 |
|---|---|
| code | 股票代码 |
| pubDate | 发布日期 |
| statDate | 统计日期 |
| NRTurnRatio | 应收账款周转率(次) |
| NRTurnDays | 应收账款周转天数(天) |
| INVTurnRatio | 存货周转率(次) |
| INVTurnDays | 存货周转天数(天) |
| CATurnRatio | 流动资产周转率(次) |
| AssetTurnRatio | 总资产周转率(次) |
query_growth_data()
获取成长能力数据。
rs = bs.query_growth_data(code, year, quarter)返回字段:
| 字段 | 说明 |
|---|---|
| code | 股票代码 |
| pubDate | 发布日期 |
| statDate | 统计日期 |
| YOYEquity | 净资产同比增长率 |
| YOYAsset | 总资产同比增长率 |
| YOYNI | 净利润同比增长率 |
| YOYEPSBasic | 基本每股收益同比增长率 |
| YOYEPSDiluted | 稀释每股收益同比增长率 |
query_balance_data()
获取偿债能力数据。
rs = bs.query_balance_data(code, year, quarter)返回字段:
| 字段 | 说明 |
|---|---|
| code | 股票代码 |
| pubDate | 发布日期 |
| statDate | 统计日期 |
| currentRatio | 流动比率 |
| quickRatio | 速动比率 |
| cashRatio | 现金比率 |
| YOYLiability | 总负债同比增长率 |
| liabilityToAsset | 资产负债率 |
| assetToEquity | 权益乘数 |
query_cash_flow_data()
获取现金流量数据。
rs = bs.query_cash_flow_data(code, year, quarter)返回字段:
| 字段 | 说明 |
|---|---|
| code | 股票代码 |
| pubDate | 发布日期 |
| statDate | 统计日期 |
| CAToAsset | 流动资产占比 |
| NCAToAsset | 非流动资产占比 |
| tangibleAssetToAsset | 有形资产占比 |
| ebitToInterest | 已获利息倍数 |
| CFOToOR | 经营活动现金净流量与营业收入比率 |
| CFOToNP | 经营性现金净流量与净利润比率 |
| CFOToGr | 经营性现金净流量与营业总收入比率 |
query_dupont_data()
获取杜邦分析数据。
rs = bs.query_dupont_data(code, year, quarter)返回字段:
| 字段 | 说明 |
|---|---|
| code | 股票代码 |
| pubDate | 发布日期 |
| statDate | 统计日期 |
| dupontROE | 净资产收益率(杜邦分析) |
| dupontAssetStoEquity | 权益乘数 |
| dupontAssetTurn | 总资产周转率 |
| dupontPalm | 主营业务利润率 |
| dupontNetPalm | 销售净利率 |
| dupontTaxBurden | 税收负担率 |
| dupontIntBurden | 利息负担率 |
| dupontEBITToOR | 主营业务利润与营业收入比率 |
---
股票信息
query_all_stock()
获取全部证券列表。
rs = bs.query_all_stock(day=None)参数:
day(str): 查询日期,格式YYYY-MM-DD,默认今天
返回字段:
code: 证券代码tradeStatus: 交易状态(0=停牌,1=正常)code_name: 证券名称
query_stock_basic()
获取股票基本信息。
rs = bs.query_stock_basic(code=None)参数:
code(str): 股票代码,不传则返回全部
返回字段:
code: 股票代码code_name: 股票名称ipoDate: 上市日期outDate: 退市日期(如有)type: 类型(1=股票,2=指数,3=其他)status: 状态(0=退市,1=上市)
query_trade_dates()
获取交易日历。
rs = bs.query_trade_dates(start_date, end_date)参数:
start_date(str): 开始日期YYYY-MM-DDend_date(str): 结束日期YYYY-MM-DD
返回字段:
calendar_date: 日历日期is_trading_day: 是否交易日(0=否,1=是)
query_dividend_data()
获取分红信息。
rs = bs.query_dividend_data(code, year, yearType="report")参数:
code(str): 股票代码year(str): 年份,如 "2023"yearType(str): 类型,report(报告期) 或operate(实施期)
---
行业与指数
query_stock_industry()
获取行业分类数据。
rs = bs.query_stock_industry()返回字段:
updateDate: 更新日期code: 证券代码code_name: 证券名称industry: 所属行业industryClassification: 行业分类标准
query_hs300_stocks()
获取沪深300成分股。
rs = bs.query_hs300_stocks()返回字段:
code: 证券代码code_name: 证券名称
query_sz50_stocks()
获取上证50成分股。
rs = bs.query_sz50_stocks()query_zz500_stocks()
获取中证500成分股。
rs = bs.query_zz500_stocks()---
股票代码格式
| 市场 | 格式示例 | 说明 |
|---|---|---|
| 上海证券交易所 | sh.600000 | A股:sh.6xxxxx |
| 深圳证券交易所 | sz.000001 | 主板:sz.00xxxx |
| 深圳证券交易所 | sz.300750 | 创业板:sz.30xxxx |
| 北京证券交易所 | bj.430047 | 北交所:bj.xxxxxx |
| 上证指数 | sh.000001 | 上证综指 |
| 沪深300 | sh.000300 | 沪深300指数 |
| 上证50 | sh.000016 | 上证50指数 |
---
错误处理
常见错误代码
| 错误代码 | 说明 | 解决方法 |
|---|---|---|
| 0 | 成功 | - |
| 10001011 | IP 已加入黑名单 | 联系 BaoStock 官方解除 |
| -1 | 网络错误 | 检查网络连接 |
| -2 | 参数错误 | 检查参数格式和取值范围 |
| -3 | 无数据 | 检查日期范围和股票代码 |
错误处理示例
import baostock as bs
lg = bs.login()
if lg.error_code != "0":
if lg.error_code == "10001011":
print("IP 已被加入黑名单,请联系官方")
else:
print(f"登录失败: {lg.error_msg} ({lg.error_code})")
sys.exit(1)
# 查询数据
rs = bs.query_history_k_data_plus("sh.600000", "date,close")
if rs.error_code != '0':
print(f"查询失败: {rs.error_msg}")
else:
# 处理数据
pass
bs.logout()使用技巧
1. 数据类型转换: K线数据默认返回字符串,数值计算前需转换
df['close'] = df['close'].astype(float)2. 非线程安全: 并行下载请使用多进程而非多线程
from multiprocessing import Pool
# 使用 Pool 进行并行下载3. 财务数据延迟: 季度报告发布后约2个月才能在 BaoStock 获取
4. 分钟线限制: 指数无分钟级数据,仅股票支持
5. 复权选择:
- 前复权(2):适用于分析历史走势
- 后复权(1):适用于计算收益率
- 不复权(3):原始数据
存款利率
存款利率:query_deposit_rate_data()
方法说明:通过API接口获取存款利率,可以通过参数设置获取对应起止日期的数据。 返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取存款利率
rs = bs.query_deposit_rate_data(start_date="2015-01-01", end_date="2015-12-31")
print('query_deposit_rate_data respond error_code:'+rs.error_code)
print('query_deposit_rate_data respond error_msg:'+rs.error_msg)
# 打印结果集
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("D:/deposit_rate.csv", encoding="gbk", index=False)
print(result)
# 登出系统
bs.logout()参数含义:
- start_date:开始日期,格式XXXX-XX-XX,发布日期在这个范围内,可以为空;
- end_date:结束日期,格式XXXX-XX-XX,发布日期在这个范围内,可以为空。
返回示例数据
| pubDate | demandDepositRate | fixedDepositRate3Month | fixedDepositRate6Month | fixedDepositRate1Year | fixedDepositRate2Year | fixedDepositRate3Year |
|---|---|---|---|---|---|---|
| 2015-03-01 | 0.350000 | 2.100000 | 2.300000 | 2.500000 | 3.100000 | 3.750000 |
| 2015-05-11 | 0.350000 | 1.850000 | 2.050000 | 2.250000 | 2.850000 | 3.500000 |
返回示例数据
| fixedDepositRate5Year | installmentFixedDepositRate1Year | installmentFixedDepositRate3Year | installmentFixedDepositRate5Year |
|---|---|---|---|
| 2.100000 | 2.300000 | ||
| 1.850000 | 2.050000 |
返回数据说明
| 参数名称 | 参数描述 |
|---|---|
| pubDate | 发布日期 |
| demandDepositRate | 活期存款(不定期) |
| fixedDepositRate3Month | 定期存款(三个月) |
| fixedDepositRate6Month | 定期存款(半年) |
| fixedDepositRate1Year | 定期存款整存整取(一年) |
| fixedDepositRate2Year | 定期存款整存整取(二年) |
| fixedDepositRate3Year | 定期存款整存整取(三年) |
| fixedDepositRate5Year | 定期存款整存整取(五年) |
| installmentFixedDepositRate1Year | 零存整取、整存零取、存本取息定期存款(一年) |
| installmentFixedDepositRate3Year | 零存整取、整存零取、存本取息定期存款(三年) |
| installmentFixedDepositRate5Year | 零存整取、整存零取、存本取息定期存款(五年) |
除权除息信息
除权除息信息:query_dividend_data()
通过API接口获取除权除息信息数据(预披露、预案、正式都已通过)。示例数据:下载
import baostock as bs
import pandas as pd
#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
#### 查询除权除息信息####
# 查询2015年除权除息信息
rs_list = []
rs_dividend_2015 = bs.query_dividend_data(code="sh.600000", year="2015", yearType="report")
while (rs_dividend_2015.error_code == '0') & rs_dividend_2015.next():
rs_list.append(rs_dividend_2015.get_row_data())
# 查询2016年除权除息信息
rs_dividend_2016 = bs.query_dividend_data(code="sh.600000", year="2016", yearType="report")
while (rs_dividend_2016.error_code == '0') & rs_dividend_2016.next():
rs_list.append(rs_dividend_2016.get_row_data())
# 查询2017年除权除息信息
rs_dividend_2017 = bs.query_dividend_data(code="sh.600000", year="2017", yearType="report")
while (rs_dividend_2017.error_code == '0') & rs_dividend_2017.next():
rs_list.append(rs_dividend_2017.get_row_data())
result_dividend = pd.DataFrame(rs_list, columns=rs_dividend_2017.fields)
# 打印输出
print(result_dividend)
#### 结果集输出到csv文件 ####
result_dividend.to_csv("D:\\history_Dividend_data.csv", encoding="gbk",index=False)
#### 登出系统 ####
bs.logout()参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- year:年份,如:2017。此参数不可为空;
- yearType:年份类别,默认为"report":预案公告年份,可选项"operate":除权除息年份。此参数不可为空。
返回示例数据
| code | dividPreNoticeDate | dividAgmPumDate | dividPlanAnnounceDate | dividPlanDate | dividRegistDate | dividOperateDate | dividPayDate |
|---|---|---|---|---|---|---|---|
| sh.600000 | 2015-05-16 | 2015-03-19 | 2015-06-16 | 2015-06-19 | 2015-06-23 | 2015-06-23 | |
| sh.600000 | 2016-04-29 | 2016-04-07 | 2016-06-16 | 2016-06-22 | 2016-06-23 | 2016-06-23 | |
| sh.600000 | 2017-04-26 | 2017-04-01 | 2017-05-19 | 2017-05-24 | 2017-05-25 | 2017-05-25 |
返回示例数据
| dividStockMarketDate | dividCashPsBeforeTax | dividCashPsAfterTax | dividStocksPs | dividCashStock | dividReserveToStockPs |
|---|---|---|---|---|---|
| 0.757 | 0.6813或0.71915 | 0.000000 | 10派7.57元(含税,扣税后6.813或7.1915元) | ||
| 2016-06-24 | 0.515 | 0.4635或0.515 | 0.000000 | 10转1派5.15元(含税,扣税后4.635或5.15元) | 0.100000 |
| 2017-05-26 | 0.2 | 0.18或0.2 | 0.000000 | 10转3派2元(含税,扣税后1.8或2元) | 0.300000 |
返回数据说明
| 参数名称 | 参数描述 | 算法说明 |
|---|---|---|
| code | 证券代码 | |
| dividPreNoticeDate | 预批露公告日 | |
| dividAgmPumDate | 股东大会公告日期 | |
| dividPlanAnnounceDate | 预案公告日 | |
| dividPlanDate | 分红实施公告日 | |
| dividRegistDate | 股权登记告日 | |
| dividOperateDate | 除权除息日期 | |
| dividPayDate | 派息日 | |
| dividStockMarketDate | 红股上市交易日 | |
| dividCashPsBeforeTax | 每股股利税前 | 派息比例分子(税前)/派息比例分母 |
| dividCashPsAfterTax | 每股股利税后 | 派息比例分子(税后)/派息比例分母 |
| dividStocksPs | 每股红股 | |
| dividCashStock | 分红送转 | 每股派息数(税前)+每股送股数+每股转增股本数 |
| dividReserveToStockPs | 每股转增资本 |
复权因子信息
复权因子:query_adjust_factor()
通过API接口获取复权因子信息数据。示例数据:下载
BaoStock提供的是涨跌幅复权算法 复权因子,具体介绍见:[媒体文件:BaoStock复权因子简介.pdf](https://www.baostock.com/helpdocs/pdf/BaoStock%E5%A4%8D%E6%9D%83%E5%9B%A0%E5%AD%90%E7%AE%80%E4%BB%8B.pdf "BaoStock复权因子简介.pdf")。
基于BaoStock复权因子与本地BaoStock日K线数据生成复权行情,具体介绍见:<a href="localdatafactorInfo.md" style="color:#000; font-weight:bold;">利用本地Baostock日K线数据手动计算复权价格</a>。
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 查询2015至2017年复权因子
rs_list = []
rs_factor = bs.query_adjust_factor(code="sh.600000", start_date="2015-01-01", end_date="2017-12-31")
while (rs_factor.error_code == '0') & rs_factor.next():
rs_list.append(rs_factor.get_row_data())
result_factor = pd.DataFrame(rs_list, columns=rs_factor.fields)
# 打印输出
print(result_factor)
# 结果集输出到csv文件
result_factor.to_csv("D:\\adjust_factor_data.csv", encoding="gbk", index=False)
# 登出系统
bs.logout()参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- start_date:开始日期,为空时默认为2015-01-01,包含此日期;
- end_date:结束日期,为空时默认当前日期,包含此日期。
返回示例数据
| code | dividOperateDate | foreAdjustFactor | backAdjustFactor | adjustFactor |
|---|---|---|---|---|
| sh.600000 | 2015-06-23 | 0.663792 | 6.295967 | 6.295967 |
| sh.600000 | 2016-06-23 | 0.751598 | 7.128788 | 7.128788 |
| sh.600000 | 2017-05-25 | 0.989551 | 9.385732 | 9.385732 |
返回数据说明
| 参数名称 | 参数描述 | 算法说明 |
|---|---|---|
| code | 证券代码 | |
| dividOperateDate | 除权除息日期 | |
| foreAdjustFactor | 向前复权因子 | 除权除息日前一个交易日的收盘价/除权除息日最近的一个交易日的前收盘价 |
| backAdjustFactor | 向后复权因子 | 除权除息日最近的一个交易日的前收盘价/除权除息日前一个交易日的收盘价 |
| adjustFactor | 本次复权因子 |
平台介绍
证券宝`www.baostock.com`是一个免费、开源的证券数据平台(无需注册)。
- 提供大量准确、完整的证券历史行情数据、上市公司财务数据等。
- 通过python API获取证券数据信息,满足量化交易投资者、数量金融爱好者、计量经济从业者数据需求。
- 返回的数据格式:
- pandas DataFrame类型,以便于用pandas/NumPy/Matplotlib进行数据分析和可视化。
- 同时支持通过BaoStock的数据存储功能,将数据全部保存到本地后进行分析。
- 支持语言:目前版本BaoStock.com目前只支持Python3.5或Python3.6及以上(暂不支持python 2.x)。
- 持续更新:BaoStock.com还在不断的完善和优化,后续将逐步增加港股、期货、外汇和基金等方面的金融数据,为成为一个免费金融数据平台努力。
- 分享优化:请通过微信、网站博客或者知乎文章等方式分享给大家,使它能在大家的使用过程中逐步得到改进与提升,以便于更好地为大家提供免费服务。
- 平台麦克:证券宝BaoStock.com从发布到现在,已经帮助很多用户在数据方面减轻了工作量,同时也得到很多用户的反馈。它将一如既往的以免费、开源的形式分享出来,希望给有需要的朋友带来一些帮助。
联系方式:Baostock官方技术QQ群:1091604126(问题解答、技术交流);EMail:`baostock@163.com`。 免费证券数据平台证券宝www.baostock.com会逐步分享证券投资文章、投资观点及教程,希望能够帮助大家!
下载安装
方式1:pip install baostock
使用指定源安装:
pip install baostock -i https://pypi.org/simple方式2:访问 https://pypi.python.org/pypi/baostock 下载安装
python setup.py install或pip install xxx.whl注意:程序运行时,文件名、文件夹名不能是baostock。
版本升级
pip install --upgrade baostock -i https://pypi.org/simple使用前提:
安装Python
安装pandas(pip install pandas)
建议安装Anaconda,以免出现问题(Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项,下载地址https://www.anaconda.com/download/)。
每日最新数据更新时间:
- 当前交易日17:30,完成日K线数据入库;
- 当前交易日18:00,完成复权因子数据入库;
- 当前交易日20:00,完成分钟K线数据入库;
- 第二自然日1:30,完成前交易日“其它财务报告数据”入库;
- 周六17:30,完成周K线数据入库;
- 每月1号17:30,完成上月月K线数据入库;
每周数据更新时间:
- 每周一下午,完成上证50成份股、沪深300成份股、中证500成份股信息数据入库;
数据范围说明
股票数据
- 日、周、月K线数据,时间范围:1990-12-19至今。
- 5、15、30、60分钟K线数据,时间范围(近5年):2020-01-03至今。
ETF数据
- 日、周、月K线数据,时间范围:2026-01-05至今。
- 5、15、30、60分钟K线数据,时间范围:2026-01-05至今。
指数数据
- 日、周、月K线已经包含指数(不提供分钟K线数据):综合指数,规模指数,一级行业指数,二级行业指数,策略指数,成长指数,价值指数,主题指数,基金指数,债券指数。
- 时间范围:2006-01-01至今。
季频财务数据
- 已经包含的财务数据:部分上市公司资产负债信息、上市公司现金流量信息、上市公司利润信息、上市公司杜邦指标信息。
- 时间范围:2007年至今。
季频公司报告
- 上市公司业绩预告信息,时间范围:2003年至今。
- 上市公司业绩快报信息,时间范围:2006年至今。
版本信息
V0.9.1版本 2026/04/15
- 支持多节点服务请求。
V0.8.9版本 2024/05/31
- 修复退出时socket未关闭问题;调整Demo程序的位置。
V0.8.8版本 2019/01/25
- 新增接口get_data(),返回dataframe格式数据。
V0.8.7版本 2018/12/14
- 优化服务器、客户端之间的网络传输。
V0.8.5版本 2018/12/7
- 新增2019年交易日数据。
V0.8.5版本 2018/11/27
- 新增2006年01月-2018年09月指数成分股数据。
V0.8.5版本 2018/10/15
- 新增2006-2010年,日、周、月K线数据。
V0.8.5版本 2018/9/14
- 新增2011年,5分钟、15分钟、30分钟、60分钟、日、周、月K线数据。
- 新增“行业分类”接口:query_stock_industry()。
- 新增“上证50成分股”接口:query_sz50_stocks()。
- 新增“沪深300成分股”接口:query_hs300_stocks()。
- 新增“中证500成分股”接口:query_zz500_stocks()。
V0.8.1版本 2018/8/10
- 新增2012、2013年,5分钟、15分钟、30分钟、60分钟、日、周、月K线数据。
- 增强“历史A股K线数据”接口:query_history_k_data(),添加周、月线前后复权功能。
- 增强“证券代码查询”接口:query_all_stock(),查询结果添加证券名称。
- 增强“季频盈利能力”接口:query_profit_data(),查询结果添加总股本(totalShare)、流通股本(liqaShare)。
V0.8.0版本 2018/7/27
- 新增“证券基本资料”接口query_stock_basic()。
- 新增“存款利率”接口query_deposit_rate_data(),提供1990年至今数据。
- 新增“贷款利率”接口query_loan_rate_data(),提供1990年至今数据。
- 新增“存款准备金率”接口query_required_reserve_ratio_data(),提供1999年至今数据。
- 新增“货币供应量”接口query_money_supply_data_month(),提供1978年至今数据。
- 新增“货币供应量(年底余额)”接口query_money_supply_data_year(),提供1952年至今数据。
- 新增“银行间同业拆放利率”接口query_shibor_data(),提供2006-10-08至今数据。
V0.7.6.03版本 2018/6/1
- 新增2014年,5分钟、15分钟、30分钟、60分钟、日、周、月K线数据。
- 新增2014年交易日信息。
- 优化登陆逻辑。
V0.7.6.02版本 2018/5/14
- 新增2015-2016交易日信息。
- 优化获取K线前后复权数据的性能。
V0.7.5版本 2018/4/20
- 增强接口“获取历史A股K线数据”:query_history_k_data(),新增查询日K线、分钟线前后复权数据;周K线、月K线暂不支持。
V0.7.2版本 2018/4/13
- 新增接口“交易日查询”:query_trade_dates(),提供2017-2018年数据。
- 新增接口“证券代码查询”:query_all_stock(),提供2015年至今数据。
V0.7.0版本 2018/3/30
- 新增接口“盈利能力”接口query_profit_data(),提供2007至今的数据。
- 新增接口“营运能力”接口query_operation_data(),提供2007至今的数据。
- 新增接口“成长能力”接口query_growth_data(),提供2007至今的数据。
- 新增接口“偿债能力”接口query_balance_data(),提供2007至今的数据。
- 新增接口“现金流量”接口query_cash_flow_data(),提供2007至今的数据。
- 新增接口“杜邦指标”接口query_dupont_data(),提供2007至今的数据。
- 新增接口“公司业绩快报”接口query_performance_express_report(),提供2003至今的数据。
- 新增接口“公司业绩预告”接口query_forcast_report(),提供2006至今的数据。
- 新增web端下载示例数据。
V0.6.2版本 2018/3/16
- 新增'查询复权因子'接口query_adjust_factor(),提供1990至2017年数据。
- API性能优化,加快获取数据速度。
- 接口中忽略证券代码大小写。
- 接口中对指标参数大小写不敏感。
- 官网中提供搜索功能。
V0.6.1版本 2018/2/13
- 接口query_history_k_data(),新增"d=日k线、w=周k线、m=月k线"2015-01-01至今的规模指数、一级行业指数、二级行业指数、策略指数、成长指数、价值指数、主题指数。
- 接口query_history_k_data(),新增"d=日k线"滚动市盈率(peTTM)、市净率(pbMRQ)、滚动市销率(psTTM)、滚动市现率(pcfNcfTTM)。
- 接口query_history_k_data(),新增指数、股票"d=日k线、w=周k线、m=月k线"的涨跌幅(pctChg)。
- 接口query_history_k_data(),新增股票"d=日k线"的'是否ST(isST)'。
- 新增'查询除权除息信息'接口query_dividend_data(),提供1990年至2017年数据。
V0.5.5版本 2018/2/5
- 优化next()方法,获取大量数据时分批次获取。
V0.5.1版本 2018/1/11
- 新增获取历史K线数据接口query_history_k_data()。
- 提供2015-01-01至今的上交所A股、深交所A股,上交所指数(综合指数)、深交所指数(综合指数)d=日k线、w=周k线、m=月k线、5=5分钟、15=15分钟、30=30分钟、60=60分钟k线数据。
沪深300成分股
沪深300成分股:query_hs300_stocks()
方法说明:通过API接口获取沪深300成分股信息,更新频率:每周一更新。返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取沪深300成分股
rs = bs.query_hs300_stocks()
print('query_hs300 error_code:'+rs.error_code)
print('query_hs300 error_msg:'+rs.error_msg)
# 打印结果集
hs300_stocks = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
hs300_stocks.append(rs.get_row_data())
result = pd.DataFrame(hs300_stocks, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("D:/hs300_stocks.csv", encoding="gbk", index=False)
print(result)
# 登出系统
bs.logout()参数含义:
- date:查询日期,格式XXXX-XX-XX,为空时默认最新日期。
返回示例数据
| updateDate | code | code_name |
|---|---|---|
| 2018-11-26 | sh.600000 | 浦发银行 |
| 2018-11-26 | sh.600008 | 首创股份 |
返回数据说明
| 参数名称 | 参数描述 |
|---|---|
| updateDate | 更新日期 |
| code | 证券代码 |
| code_name | 证券名称 |
baostock 知识库目录
- 平台介绍
- Python API文档
- A股K线数据
- 指数数据
- 估值指标(日频)
- 除权除息信息
- 复权因子信息
- 本地计算前复权
- 季频盈利能力
- 季频营运能力
- 季频成长能力
- 季频偿债能力
- 季频现金流量
- 季频杜邦指数
- 季频业绩快报
- 季频业绩预告
- 证券基本资料
- 存款利率
- 贷款利率
- 存款准备金率
- 货币供应量
- 货币供应量余额
- 行业分类
- 上证50成分股
- 沪深300成分股
- 中证500成分股
- 证券元信息
- 公式与数据说明
指数数据
通过API接口获取指数(综合指数、规模指数、一级行业指数、二级行业指数、策略指数、成长指数、价值指数、主题指数)K线数据。
1. 综合指数,例如:sh.000001 上证指数,sz.399106 深证综指 等; 2. 规模指数,例如:sh.000016 上证50,sh.000300 沪深300,sh.000905 中证500,sz.399001 深证成指等; 3. 一级行业指数,例如:sh.000037 上证医药,sz.399433 国证交运 等; 4. 二级行业指数,例如:sh.000952 300地产,sz.399951 300银行 等; 5. 策略指数,例如:sh.000050 50等权,sh.000982 500等权 等; 6. 成长指数,例如:sz.399376 小盘成长 等; 7. 价值指数,例如:sh.000029 180价值 等; 8. 主题指数,例如:sh.000015 红利指数,sh.000063 上证周期 等; 9. 基金指数,例如:sh.000011 上证基金指数 等; 10. 债券指数,例如:sh.000012 上证国债指数 等;
沪深指数K线数据 示例
指数未提供分钟线数据。示例数据:下载
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取指数(综合指数、规模指数、一级行业指数、二级行业指数、策略指数、成长指数、价值指数、主题指数)K线数据
# 综合指数,例如:sh.000001 上证指数,sz.399106 深证综指 等;
# 规模指数,例如:sh.000016 上证50,sh.000300 沪深300,sh.000905 中证500,sz.399001 深证成指等;
# 一级行业指数,例如:sh.000037 上证医药,sz.399433 国证交运 等;
# 二级行业指数,例如:sh.000952 300地产,sz.399951 300银行 等;
# 策略指数,例如:sh.000050 50等权,sh.000982 500等权 等;
# 成长指数,例如:sz.399376 小盘成长 等;
# 价值指数,例如:sh.000029 180价值 等;
# 主题指数,例如:sh.000015 红利指数,sh.000063 上证周期 等;
# 详细指标参数,参见“历史行情指标参数”章节;“周月线”参数与“日线”参数不同。
# 周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg
rs = bs.query_history_k_data_plus("sh.000001",
"date,code,open,high,low,close,preclose,volume,amount,pctChg",
start_date='2017-01-01', end_date='2017-06-30', frequency="d")
print('query_history_k_data_plus respond error_code:'+rs.error_code)
print('query_history_k_data_plus respond error_msg:'+rs.error_msg)
# 打印结果集
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("D:\\history_Index_k_data.csv", index=False)
print(result)
# 登出系统
bs.logout()
参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- fields:指示简称,支持多指标输入,以半角逗号分隔,填写内容作为返回类型的列。详细指标列表见历史行情指标参数章节 。此参数不可为空;
- start:开始日期(包含),格式“YYYY-MM-DD”,为空时取2015-01-01;
- end:结束日期(不包含),格式“YYYY-MM-DD”,为空时取最近一个交易日;
- frequency:数据类型,默认为d,日k线;d=日k线、w=周、m=月、5=5分钟、15=15分钟、30=30分钟、60=60分钟k线数据,不区分大小写;指数没有分钟线数据;周线每周最后一个交易日才可以获取,月线第月最后一个交易日才可以获取。
返回示例数据
| date | code | open | high | low | close | preclose | volume | amount | pctChg |
|---|---|---|---|---|---|---|---|---|---|
| 2017-01-03 | sh.000001 | 3105.3080 | 3136.4550 | 3105.3080 | 3135.9200 | 3103.6370 | 14156718592 | 159887138816.0000 | 1.040200 |
| 2017-01-04 | sh.000001 | 3133.7870 | 3160.1020 | 3130.1140 | 3158.7940 | 3135.9200 | 16786085120 | 195914293248.0000 | 0.729400 |
返回数据说明
| 参数名称 | 参数描述 | 说明 |
|---|---|---|
| date | 交易所行情日期 | 格式:YYYY-MM-DD |
| code | 证券代码 | 格式:sh.600000。sh:上海,sz:深圳 |
| open | 今开盘价格 | 精度:小数点后4位;单位:人民币元 |
| high | 最高价 | 精度:小数点后4位;单位:人民币元 |
| low | 最低价 | 精度:小数点后4位;单位:人民币元 |
| close | 今收盘价 | 精度:小数点后4位;单位:人民币元 |
| preclose | 昨日收盘价 | 精度:小数点后4位;单位:人民币元 |
| volume | 成交数量 | 单位:股 |
| amount | 成交金额 | 精度:小数点后4位;单位:人民币元 |
| pctChg | 涨跌幅 | 精度:小数点后6位 |
贷款利率
贷款利率:query_loan_rate_data()
方法说明:通过API接口获取贷款利率,可以通过参数设置获取对应起止日期的数据。 返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取贷款利率
rs = bs.query_loan_rate_data(start_date="2010-01-01", end_date="2015-12-31")
print('query_loan_rate_data respond error_code:'+rs.error_code)
print('query_loan_rate_data respond error_msg:'+rs.error_msg)
# 打印结果集
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("D:/loan_rate.csv", encoding="gbk", index=False)
print(result)
# 登出系统
bs.logout()参数含义:
- start_date:开始日期,格式XXXX-XX-XX,发布日期在这个范围内,可以为空;
- end_date:结束日期,格式XXXX-XX-XX,发布日期在这个范围内,可以为空。
返回示例数据
| pubDate | loanRate6Month | loanRate6MonthTo1Year | loanRate1YearTo3Year | loanRate3YearTo5Year |
|---|---|---|---|---|
| 2010-10-20 | 5.100000 | 5.560000 | 5.600000 | 5.960000 |
| 2010-12-26 | 5.350000 | 5.810000 | 5.850000 | 6.220000 |
返回示例数据
| loanRateAbove5Year | mortgateRateBelow5Year | mortgateRateAbove5Year |
|---|---|---|
| 6.140000 | 3.500000 | 4.050000 |
| 6.400000 | 3.750000 | 4.300000 |
返回数据说明
| 参数名称 | 参数描述 |
|---|---|
| pubDate | 发布日期 |
| loanRate6Month | 6个月贷款利率 |
| loanRate6MonthTo1Year | 6个月至1年贷款利率 |
| loanRate1YearTo3Year | 1年至3年贷款利率 |
| loanRate3YearTo5Year | 3年至5年贷款利率 |
| loanRateAbove5Year | 5年以上贷款利率 |
| mortgateRateBelow5Year | 5年以下住房公积金贷款利率 |
| mortgateRateAbove5Year | 5年以上住房公积金贷款利率 |
利用本地Baostock日K线数据手动计算复权价格
在量化策略回测中,复权数据是保证价格连续性的基础。为避免频繁请求BaoStock API,可通过BaoStock复权因子(<a href="factorInfo.md">BaoStock复权因子获取方法见:query_adjust_factor()</a>)与本地存储的原始日K线数据(<a href="stockKData.md">日K线获取方法见:query_history_k_data_plus()</a>)自行计算复权价格(分钟线同理)。媒体文件:利用BaoStock本地日K线数据手动计算复权价格.pdf 本文以浦发银行(sh.600000)为例,展示 2014-01-01 至 2020-01-01 区间内,基于BaoStock复权因子计算前复权日 K 线的完整流程(后复权方法类似)。
import baostock as bs
import pandas as pd
# 初始化baostock
lg = bs.login()
# 定义股票代码和时间范围
stock_code = "sh.600000" # 浦发银行
start_date = "2014-01-01"
end_date = "2020-01-01"
# 1. 获取非复权日K线数据
print("\n1. 获取非复权日K线数据...")
# "sh600000_from_baostock.csv"是从baostock下载到本地的日K线数据(时间:2014-01-01到2020-01-01)
# "sh600000_from_baostock.csv"包含如下数据:date,open,high,low,close,volume
baostock_file_path = "sh600000_from_baostock.csv"
kline_df = pd.read_csv(baostock_file_path)
print(f"获取到 {len(kline_df)} 条非复权日K线数据")
# 转换数据类型
kline_df["open"] = kline_df["open"].astype(float)
kline_df["high"] = kline_df["high"].astype(float)
kline_df["low"] = kline_df["low"].astype(float)
kline_df["close"] = kline_df["close"].astype(float)
kline_df["volume"] = kline_df["volume"].astype(float)
kline_df['date'] = pd.to_datetime(kline_df['date'])
# 2. 获取复权因子数据
print("\n2. 获取复权因子数据...")
# 注意:需要获取更早的复权因子,因为前复权需要用到整个历史区间的因子
factor_start = "2010-01-01" # 扩大到2010年
factor_end = end_date
adjust_factor_data = bs.query_adjust_factor(
stock_code,
start_date=factor_start,
end_date=factor_end
)
adjust_factor_df = adjust_factor_data.get_data()
print(f"获取到 {len(adjust_factor_df)} 条复权因子数据")
print(adjust_factor_df[['dividOperateDate', 'foreAdjustFactor']])
# 转换数据类型
adjust_factor_df['dividOperateDate'] = pd.to_datetime(adjust_factor_df['dividOperateDate'])
adjust_factor_df['foreAdjustFactor'] = adjust_factor_df['foreAdjustFactor'].astype(float)
adjust_factor_df = adjust_factor_df.sort_values('dividOperateDate')
# 3. 正确的复权计算方法
print("\n3. 计算前复权数据...")
# 创建复权因子查找函数
def get_factor_for_date(trade_date):
"""
查找小于等于交易日期的最接近的复权因子
"""
mask = adjust_factor_df['dividOperateDate'] <= trade_date
if mask.any():
return adjust_factor_df.loc[mask, 'foreAdjustFactor'].iloc[-1]
else:
# 如果没有找到,返回最新的复权因子(用于前复权)
if not adjust_factor_df.empty:
return adjust_factor_df['foreAdjustFactor'].iloc[-1]
return 1.0
# 为每个交易日查找对应的复权因子
print("正在为每个交易日匹配复权因子...")
kline_df['adj_factor'] = kline_df['date'].apply(get_factor_for_date)
# 正确计算前复权数据:原始价格 / 复权因子
kline_df["adj_open"] = kline_df["open"] * kline_df["adj_factor"]
kline_df["adj_high"] = kline_df["high"] * kline_df["adj_factor"]
kline_df["adj_low"] = kline_df["low"] * kline_df["adj_factor"]
kline_df["adj_close"] = kline_df["close"] * kline_df["adj_factor"]
print("\n计算完成,复权后的数据:")
print(kline_df[['date', 'open', 'adj_open', 'close', 'adj_close', 'adj_factor']].head(10))
# 保存数据(可选)
kline_df.to_csv("sh600000_calculated.csv", index=False, float_format='%.6f')
print("\n数据已保存到CSV文件")
# 退出baostock
bs.logout()存款准备金率
存款准备金率:query_required_reserve_ratio_data()
方法说明:通过API接口获取存款准备金率,可以通过参数设置获取对应起止日期的数据。 返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取存款准备金率
rs = bs.query_required_reserve_ratio_data(start_date="2010-01-01", end_date="2015-12-31")
print('query_required_reserve_ratio_data respond error_code:'+rs.error_code)
print('query_required_reserve_ratio_data respond error_msg:'+rs.error_msg)
# 打印结果集
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("D:/required_reserve_ratio.csv", encoding="gbk", index=False)
print(result)
# 登出系统
bs.logout()参数含义:
- start_date:开始日期,格式XXXX-XX-XX,发布日期在这个范围内,可以为空;
- end_date:结束日期,格式XXXX-XX-XX,发布日期在这个范围内,可以为空;
- yearType:年份类别,默认为0,查询公告日期;1查询生效日期。
返回示例数据
| pubDate | effectiveDate | bigInstitutionsRatioPre | bigInstitutionsRatioAfter |
|---|---|---|---|
| 2010-01-12 | 2010-01-18 | 15.5 | 16.0 |
| 2010-02-12 | 2010-02-25 | 16.0 | 16.5 |
返回示例数据
| mediumInstitutionsRatioPre | mediumInstitutionsRatioAfter |
|---|---|
| 13.5 | 14.0 |
| 14.0 | 14.5 |
返回数据说明
| 参数名称 | 参数描述 |
|---|---|
| pubDate | 公告日期 |
| effectiveDate | 生效日期 |
| bigInstitutionsRatioPre | 人民币存款准备金率:大型存款类金融机构 调整前 |
| bigInstitutionsRatioAfter | 人民币存款准备金率:大型存款类金融机构 调整后 |
| mediumInstitutionsRatioPre | 人民币存款准备金率:中小型存款类金融机构 调整前 |
| mediumInstitutionsRatioAfter | 人民币存款准备金率:中小型存款类金融机构 调整后 |
季频偿债能力
季频偿债能力:query_balance_data()
方法说明:通过API接口获取季频偿债能力信息,可以通过参数设置获取对应年份、季度数据,提供2007年至今数据。 返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 偿债能力
balance_list = []
rs_balance = bs.query_balance_data(code="sh.600000", year=2017, quarter=2)
while (rs_balance.error_code == '0') & rs_balance.next():
balance_list.append(rs_balance.get_row_data())
result_balance = pd.DataFrame(balance_list, columns=rs_balance.fields)
# 打印输出
print(result_balance)
# 结果集输出到csv文件
result_balance.to_csv("D:\\balance_data.csv", encoding="gbk", index=False)
# 登出系统
bs.logout()参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- year:统计年份,为空时默认当前年;
- quarter:统计季度,为空时默认当前季度。不为空时只有4个取值:1,2,3,4。
返回示例数据
| code | pubDate | statDate | currentRatio | quickRatio | cashRatio | YOYLiability | liabilityToAsset | assetToEquity |
|---|---|---|---|---|---|---|---|---|
| sh.600000 | 2017-08-30 | 2017-06-30 | 0.100020 | 0.933703 | 15.083598 |
返回数据说明
| 参数名称 | 参数描述 | 算法说明 |
|---|---|---|
| code | 证券代码 | |
| pubDate | 公司发布财报的日期 | |
| statDate | 财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30 | |
| currentRatio | 流动比率 | 流动资产/流动负债 |
| quickRatio | 速动比率 | (流动资产-存货净额)/流动负债 |
| cashRatio | 现金比率 | (货币资金+交易性金融资产)/流动负债 |
| YOYLiability | 总负债同比增长率 | (本期总负债-上年同期总负债)/上年同期中负债的绝对值*100% |
| liabilityToAsset | 资产负债率 | 负债总额/资产总额 |
| assetToEquity | 权益乘数 | 资产总额/股东权益总额=1/(1-资产负债率) |
季频现金流量
季频现金流量:query_cash_flow_data()
方法说明:通过API接口获取季频现金流量信息,可以通过参数设置获取对应年份、季度数据,提供2007年至今数据。 返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 季频现金流量
cash_flow_list = []
rs_cash_flow = bs.query_cash_flow_data(code="sh.600000", year=2017, quarter=2)
while (rs_cash_flow.error_code == '0') & rs_cash_flow.next():
cash_flow_list.append(rs_cash_flow.get_row_data())
result_cash_flow = pd.DataFrame(cash_flow_list, columns=rs_cash_flow.fields)
# 打印输出
print(result_cash_flow)
# 结果集输出到csv文件
result_cash_flow.to_csv("D:\\cash_flow_data.csv", encoding="gbk", index=False)
# 登出系统
bs.logout()参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- year:统计年份,为空时默认当前年;
- quarter:统计季度,为空时默认当前季度。不为空时只有4个取值:1,2,3,4。
返回示例数据
| code | pubDate | statDate | CAToAsset | NCAToAsset | tangibleAssetToAsset | ebitToInterest | CFOToOR | CFOToNP | CFOToGr |
|---|---|---|---|---|---|---|---|---|---|
| sh.600000 | 2017-08-30 | 2017-06-30 | —3.071550 | —8.976439 | —3.071550 |
返回数据说明
| 参数名称 | 参数描述 | 算法说明 |
|---|---|---|
| code | 证券代码 | |
| pubDate | 公司发布财报的日期 | |
| statDate | 财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30 | |
| CAToAsset | 流动资产除以总资产 | |
| NCAToAsset | 非流动资产除以总资产 | |
| tangibleAssetToAsset | 有形资产除以总资产 | |
| ebitToInterest | 已获利息倍数 | 息税前利润/利息费用 |
| CFOToOR | 经营活动产生的现金流量净额除以营业收入 | |
| CFOToNP | 经营性现金净流量除以净利润 | |
| CFOToGr | 经营性现金净流量除以营业总收入 |
季频杜邦指数
季频杜邦指数:query_dupont_data()
方法说明:通过API接口获取季频杜邦指数信息,可以通过参数设置获取对应年份、季度数据,提供2007年至今数据。 返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 查询杜邦指数
dupont_list = []
rs_dupont = bs.query_dupont_data(code="sh.600000", year=2017, quarter=2)
while (rs_dupont.error_code == '0') & rs_dupont.next():
dupont_list.append(rs_dupont.get_row_data())
result_dupont = pd.DataFrame(dupont_list, columns=rs_dupont.fields)
# 打印输出
print(result_dupont)
# 结果集输出到csv文件
result_dupont.to_csv("D:\\dupont_data.csv", encoding="gbk", index=False)
# 登出系统
bs.logout()参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- year:统计年份,为空时默认当前年;
- quarter:统计季度,为空时默认当前季度。不为空时只有4个取值:1,2,3,4。
返回示例数据
| code | pubDate | statDate | dupontROE | dupontAssetStoEquity | dupontAssetTurn | dupontPnitoni |
|---|---|---|---|---|---|---|
| sh.600000 | 2017-08-30 | 2017-06-30 | 0.074617 | 15.594453 | 0.014161 | 0.987483 |
返回示例数据
| dupontNitogr | dupontTaxBurden | dupontIntburden | dupontEbittogr |
|---|---|---|---|
| 0.342179 | 0.776088 |
返回数据说明
| 参数名称 | 参数描述 | 算法说明 |
|---|---|---|
| code | 证券代码 | |
| pubDate | 公司发布财报的日期 | |
| statDate | 财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30 | |
| dupontROE | 净资产收益率 | 归属母公司股东净利润/[(期初归属母公司股东的权益+期末归属母公司股东的权益)/2]*100% |
| dupontAssetStoEquity | 权益乘数,反映企业财务杠杆效应强弱和财务风险 | 平均总资产/平均归属于母公司的股东权益 |
| dupontAssetTurn | 总资产周转率,反映企业资产管理效率的指标 | 营业总收入/[(期初资产总额+期末资产总额)/2] |
| dupontPnitoni | 归属母公司股东的净利润/净利润,反映母公司控股子公司百分比。如果企业追加投资,扩大持股比例,则本指标会增加。 | |
| dupontNitogr | 净利润/营业总收入,反映企业销售获利率 | |
| dupontTaxBurden | 净利润/利润总额,反映企业税负水平,该比值高则税负较低。净利润/利润总额=1-所得税/利润总额 | |
| dupontIntburden | 利润总额/息税前利润,反映企业利息负担,该比值高则税负较低。利润总额/息税前利润=1-利息费用/息税前利润 | |
| dupontEbittogr | 息税前利润/营业总收入,反映企业经营利润率,是企业经营获得的可供全体投资人(股东和债权人)分配的盈利占企业全部营收收入的百分比 |
季频业绩快报
季频公司业绩快报:query_performance_express_report()
方法说明:通过API接口获取季频公司业绩快报信息,可以通过参数设置获取起止年份数据,提供2006年至今数据。除几种特殊情况外,交易所未要求必须发布。
返回类型:pandas的DataFrame类型。
使用示例
import baostock as bs
import pandas as pd
#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
#### 获取公司业绩快报 ####
rs = bs.query_performance_express_report("sh.600000", start_date="2015-01-01", end_date="2017-12-31")
print('query_performance_express_report respond error_code:'+rs.error_code)
print('query_performance_express_report respond error_msg:'+rs.error_msg)
result_list = []
while (rs.error_code == '0') & rs.next():
result_list.append(rs.get_row_data())
# 获取一条记录,将记录合并在一起
result = pd.DataFrame(result_list, columns=rs.fields)
#### 结果集输出到csv文件 ####
result.to_csv("D:\\performance_express_report.csv", encoding="gbk", index=False)
print(result)
#### 登出系统 ####
bs.logout()参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- start_date:开始日期,发布日期或更新日期在这个范围内;
- end_date:结束日期,发布日期或更新日期在这个范围内。
返回示例数据
| code | performanceExpPubDate | performanceExpStatDate | performanceExpUpdateDate | performanceExpressTotalAsset | performanceExpressNetAsset |
|---|---|---|---|---|---|
| sh.600000 | 2015-01-06 | 2014-12-31 | 2015-01-06 | 4195602000000.000000 | 260011000000.000000 |
| sh.600000 | 2016-01-05 | 2015-12-31 | 2016-01-05 | 5043060000000.000000 | 285245000000.000000 |
| sh.600000 | 2017-01-04 | 2016-12-31 | 2017-01-04 | 5857263000000.000000 | 338027000000.000000 |
返回示例数据
| performanceExpressEPSChgPct | performanceExpressROEWa | performanceExpressEPSDiluted | performanceExpressGRYOY | performanceExpressOPYOY |
|---|---|---|---|---|
| 0.326910 | 21.020000 | 2.520000 | 0.228390 | 0.153803 |
| 0.191493 | 18.820000 | 2.660000 | 0.192395 | 0.069764 |
| 0.115412 | 16.350000 | 2.400000 | 0.097234 | 0.054384 |
返回数据说明
| 参数名称 | 参数描述 |
|---|---|
| code | 证券代码 |
| performanceExpPubDate | 业绩快报披露日 |
| performanceExpStatDate | 业绩快报统计日期 |
| performanceExpUpdateDate | 业绩快报披露日(最新) |
| performanceExpressTotalAsset | 业绩快报总资产 |
| performanceExpressNetAsset | 业绩快报净资产 |
| performanceExpressEPSChgPct | 业绩每股收益增长率 |
| performanceExpressROEWa | 业绩快报净资产收益率ROE-加权 |
| performanceExpressEPSDiluted | 业绩快报每股收益EPS-摊薄 |
| performanceExpressGRYOY | 业绩快报营业总收入同比 |
| performanceExpressOPYOY | 业绩快报营业利润同比 |
季频业绩预告
季频公司业绩预告:query_forecast_report()
方法说明:通过API接口获取季频公司业绩预告信息,可以通过参数设置获取起止年份数据,提供2003年至今数据。除几种特殊情况外,交易所未要求必须发布。
返回类型:pandas的DataFrame类型。
使用示例
import baostock as bs
import pandas as pd
#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
#### 获取公司业绩预告 ####
rs_forecast = bs.query_forecast_report("sh.600000", start_date="2010-01-01", end_date="2017-12-31")
print('query_forecast_reprot respond error_code:'+rs_forecast.error_code)
print('query_forecast_reprot respond error_msg:'+rs_forecast.error_msg)
rs_forecast_list = []
while (rs_forecast.error_code == '0') & rs_forecast.next():
# 分页查询,将每页信息合并在一起
rs_forecast_list.append(rs_forecast.get_row_data())
result_forecast = pd.DataFrame(rs_forecast_list, columns=rs_forecast.fields)
#### 结果集输出到csv文件 ####
result_forecast.to_csv("D:\\forecast_report.csv", encoding="gbk", index=False)
print(result_forecast)
#### 登出系统 ####
bs.logout()参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- start_date:开始日期,发布日期或更新日期在这个范围内;
- end_date:结束日期,发布日期或更新日期在这个范围内。
返回示例数据
| code | profitForcastExpPubDate | profitForcastExpStatDate | profitForcastType | profitForcastAbstract |
|---|---|---|---|---|
| sh.600000 | 2010-01-05 | 2009-12-31 | 略增 | 预计2009年归属于上市公司股东净利润1319500万元,同比增长5.43%。 |
| sh.600000 | 2011-01-05 | 2010-12-31 | 略增 | 预计公司2010年年度归属于上市公司股东净利润为190.76亿元,较上年同期增长44.33%。 |
| sh.600000 | 2012-01-05 | 2011-12-31 | 略增 | 预计2011年1月1日至2011年12月31日,归属于上市公司股东的净利润:盈利272.36亿元,与上年同期相比增加了42.02%。 |
返回示例数据
| profitForcastChgPctUp | profitForcastChgPctDwn |
|---|---|
| 5.430000 | 0.000000 |
| 44.330000 | 44.330000 |
| 42.020000 | 42.020000 |
返回数据说明
| 参数名称 | 参数描述 |
|---|---|
| code | 证券代码 |
| profitForcastExpPubDate | 业绩预告发布日期 |
| profitForcastExpStatDate | 业绩预告统计日期 |
| profitForcastType | 业绩预告类型 |
| profitForcastAbstract | 业绩预告摘要 |
| profitForcastChgPctUp | 预告归属于母公司的净利润增长上限(%) |
| profitForcastChgPctDwn | 预告归属于母公司的净利润增长下限(%) |
季频成长能力
季频成长能力:query_growth_data()
方法说明:通过API接口获取季频成长能力信息,可以通过参数设置获取对应年份、季度数据,提供2007年至今数据。 返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 成长能力
growth_list = []
rs_growth = bs.query_growth_data(code="sh.600000", year=2017, quarter=2)
while (rs_growth.error_code == '0') & rs_growth.next():
growth_list.append(rs_growth.get_row_data())
result_growth = pd.DataFrame(growth_list, columns=rs_growth.fields)
# 打印输出
print(result_growth)
# 结果集输出到csv文件
result_growth.to_csv("D:\\growth_data.csv", encoding="gbk", index=False)
# 登出系统
bs.logout()参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- year:统计年份,为空时默认当前年;
- quarter:统计季度,为空时默认当前季度。不为空时只有4个取值:1,2,3,4。
返回示例数据
| code | pubDate | statDate | YOYEquity | YOYAsset | YOYNI | YOYEPSBasic | YOYPNI |
|---|---|---|---|---|---|---|---|
| sh.600000 | 2017-08-30 | 2017-06-30 | 0.120243 | 0.101298 | 0.054808 | 0.021053 | 0.052111 |
返回数据说明
| 参数名称 | 参数描述 | 算法说明 |
|---|---|---|
| code | 证券代码 | |
| pubDate | 公司发布财报的日期 | |
| statDate | 财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30 | |
| YOYEquity | 净资产同比增长率 | (本期净资产-上年同期净资产)/上年同期净资产的绝对值*100% |
| YOYAsset | 总资产同比增长率 | (本期总资产-上年同期总资产)/上年同期总资产的绝对值*100% |
| YOYNI | 净利润同比增长率 | (本期净利润-上年同期净利润)/上年同期净利润的绝对值*100% |
| YOYEPSBasic | 基本每股收益同比增长率 | (本期基本每股收益-上年同期基本每股收益)/上年同期基本每股收益的绝对值*100% |
| YOYPNI | 归属母公司股东净利润同比增长率 | (本期归属母公司股东净利润-上年同期归属母公司股东净利润)/上年同期归属母公司股东净利润的绝对值*100% |
季频营运能力
季频营运能力:query_operation_data()
方法说明:通过API接口获取季频营运能力信息,可以通过参数设置获取对应年份、季度数据,提供2007年至今数据。
返回类型:pandas的DataFrame类型。
使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 营运能力
operation_list = []
rs_operation = bs.query_operation_data(code="sh.600000", year=2017, quarter=2)
while (rs_operation.error_code == '0') & rs_operation.next():
operation_list.append(rs_operation.get_row_data())
result_operation = pd.DataFrame(operation_list, columns=rs_operation.fields)
# 打印输出
print(result_operation)
# 结果集输出到csv文件
result_operation.to_csv("D:\\operation_data.csv", encoding="gbk", index=False)
# 登出系统
bs.logout()参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- year:统计年份,为空时默认当前年;
- quarter:统计季度,为空时默认当前季度。不为空时只有4个取值:1,2,3,4。
返回示例数据
| code | pubDate | statDate | NRTurnRatio | NRTurnDays | INVTurnRatio | INVTurnDays | CATurnRatio | AssetTurnRatio |
|---|---|---|---|---|---|---|---|---|
| sh.600000 | 2017-08-30 | 2017-06-30 | 0.014161 |
返回数据说明
| 参数名称 | 参数描述 | 算法说明 |
|---|---|---|
| code | 证券代码 | |
| pubDate | 公司发布财报的日期 | |
| statDate | 财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30 | |
| NRTurnRatio | 应收账款周转率(次) | 营业收入/[(期初应收票据及应收账款净额+期末应收票据及应收账款净额)/2] |
| NRTurnDays | 应收账款周转天数(天) | 季报天数/应收账款周转率(一季报:90天,中报:180天,三季报:270天,年报:360天) |
| INVTurnRatio | 存货周转率(次) | 营业成本/[(期初存货净额+期末存货净额)/2] |
| INVTurnDays | 存货周转天数(天) | 季报天数/存货周转率(一季报:90天,中报:180天,三季报:270天,年报:360天) |
| CATurnRatio | 流动资产周转率(次) | 营业总收入/[(期初流动资产+期末流动资产)/2] |
| AssetTurnRatio | 总资产周转率 | 营业总收入/[(期初资产总额+期末资产总额)/2] |
季频盈利能力
季频盈利能力:query_profit_data()
方法说明:通过API接口获取季频盈利能力信息,可以通过参数设置获取对应年份、季度数据,提供2007年至今数据。
返回类型:pandas的DataFrame类型。
使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 查询季频估值指标盈利能力
profit_list = []
rs_profit = bs.query_profit_data(code="sh.600000", year=2017, quarter=2)
while (rs_profit.error_code == '0') & rs_profit.next():
profit_list.append(rs_profit.get_row_data())
result_profit = pd.DataFrame(profit_list, columns=rs_profit.fields)
# 打印输出
print(result_profit)
# 结果集输出到csv文件
result_profit.to_csv("D:\\profit_data.csv", encoding="gbk", index=False)
# 登出系统
bs.logout()参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- year:统计年份,为空时默认当前年;
- quarter:统计季度,可为空,默认当前季度。不为空时只有4个取值:1,2,3,4。
返回示例数据
| code | pubDate | statDate | roeAvg | npMargin | gpMargin | netProfit | epsTTM | MBRevenue | totalShare | liqaShare |
|---|---|---|---|---|---|---|---|---|---|---|
| sh.600000 | 2017-08-30 | 2017-06-30 | 0.074617 | 0.342179 | 28522000000.000000 | 1.939029 | 83354000000.000000 | 28103763899.00 | 28103763899.00 |
返回数据说明
| 参数名称 | 参数描述 | 算法说明 |
|---|---|---|
| code | 证券代码 | |
| pubDate | 公司发布财报的日期 | |
| statDate | 财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30 | |
| roeAvg | 净资产收益率(平均)(%) | 归属母公司股东净利润/[(期初归属母公司股东的权益+期末归属母公司股东的权益)/2]*100% |
| npMargin | 销售净利率(%) | 净利润/营业收入*100% |
| gpMargin | 销售毛利率(%) | 毛利/营业收入100%=(营业收入-营业成本)/营业收入100% |
| netProfit | 净利润(元) | |
| epsTTM | 每股收益 | 归属母公司股东的净利润TTM/最新总股本 |
| MBRevenue | 主营营业收入(元) | |
| totalShare | 总股本 | |
| liqaShare | 流通股本 |
证券基本资料
证券基本资料:query_stock_basic()
方法说明:通过API接口获取证券基本资料,可以通过参数设置获取对应证券代码、证券名称的数据。 返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取证券基本资料
rs = bs.query_stock_basic(code="sh.600000")
# rs = bs.query_stock_basic(code_name="浦发银行") # 支持模糊查询
print('query_stock_basic respond error_code:'+rs.error_code)
print('query_stock_basic respond error_msg:'+rs.error_msg)
# 打印结果集
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("D:/stock_basic.csv", encoding="gbk", index=False)
print(result)
# 登出系统
bs.logout()参数含义:
- code:A股股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。可以为空;
- code_name:股票名称,支持模糊查询,可以为空。
- 当参数为空时,输出全部股票的基本信息。
返回示例数据
| code | code_name | ipoDate | outDate | type | status |
|---|---|---|---|---|---|
| sh.600000 | 浦发银行 | 1999-11-10 | 1 | 1 |
返回数据说明
| 参数名称 | 参数描述 |
|---|---|
| code | 证券代码 |
| code_name | 证券名称 |
| ipoDate | 上市日期 |
| outDate | 退市日期 |
| type | 证券类型,其中1:股票,2:指数,3:其它,4:可转债,5:ETF |
| status | 上市状态,其中1:上市,0:退市 |
证券元信息
获取交易日信息
import baostock as bs
import pandas as pd
#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
#### 获取交易日信息 ####
rs = bs.query_trade_dates(start_date="2017-01-01", end_date="2017-06-30")
print('query_trade_dates respond error_code:'+rs.error_code)
print('query_trade_dates respond error_msg:'+rs.error_msg)
#### 打印结果集 ####
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
#### 结果集输出到csv文件 ####
result.to_csv("D:\\trade_datas.csv", encoding="gbk", index=False)
print(result)
#### 登出系统 ####
bs.logout()获取某日所有证券信息
import baostock as bs
import pandas as pd
#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
#### 获取某日所有证券信息 ####
rs = bs.query_all_stock(day="2024-10-25") #当参数“day”为空时,默认取当天日期。闭市后日K线数据更新,该接口才会返回当天数据,否则返回空。
print('query_all_stock respond error_code:'+rs.error_code)
print('query_all_stock respond error_msg:'+rs.error_msg)
#### 打印结果集 ####
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
#### 结果集输出到csv文件 ####
result.to_csv("D:\\all_stock.csv", encoding="gbk", index=False)
print(result)
#### 登出系统 ####
bs.logout()A股K线数据
获取历史A股K线数据:query_history_k_data_plus()
方法说明:通过API接口获取A股历史交易数据,可以通过参数设置获取日k线、周k线、月k线,以及5分钟、15分钟、30分钟和60分钟k线数据,适合搭配均线数据进行选股和分析。
返回类型:pandas的DataFrame类型。
能获取1990-12-19至当前时间的数据;
可查询不复权、前复权、后复权数据。
示例数据:下载
日线使用示例:
import baostock as bs
import pandas as pd
#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
#### 获取沪深A股历史K线数据 ####
# 详细指标参数,参见“历史行情指标参数”章节;“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。
# 分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag
# 周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg
rs = bs.query_history_k_data_plus("sh.600000",
"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",
start_date='2024-07-01', end_date='2024-12-31',
frequency="d", adjustflag="3")
print('query_history_k_data_plus respond error_code:'+rs.error_code)
print('query_history_k_data_plus respond error_msg:'+rs.error_msg)
#### 打印结果集 ####
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
#### 结果集输出到csv文件 ####
result.to_csv("D:\\history_A_stock_k_data.csv", index=False)
print(result)
#### 登出系统 ####
bs.logout()
分钟线使用示例:
import baostock as bs
import pandas as pd
#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
#### 获取沪深A股历史K线数据 ####
# 详细指标参数,参见“历史行情指标参数”章节;“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。
# 分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag
# 周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg
rs = bs.query_history_k_data_plus("sh.600000",
"date,time,code,open,high,low,close,volume,amount,adjustflag",
start_date='2024-07-01', end_date='2024-12-31',
frequency="5", adjustflag="3")
print('query_history_k_data_plus respond error_code:'+rs.error_code)
print('query_history_k_data_plus respond error_msg:'+rs.error_msg)
#### 打印结果集 ####
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
#### 结果集输出到csv文件 ####
result.to_csv("D:\\history_A_stock_k_data.csv", index=False)
print(result)
#### 登出系统 ####
bs.logout()
参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- fields:指示简称,支持多指标输入,以半角逗号分隔,填写内容作为返回类型的列。详细指标列表见历史行情指标参数章节,日线与分钟线参数不同。此参数不可为空;
- start:开始日期(包含),格式“YYYY-MM-DD”,为空时取2015-01-01;
- end:结束日期(包含),格式“YYYY-MM-DD”,为空时取最近一个交易日;
- frequency:数据类型,默认为d,日k线;d=日k线、w=周、m=月、5=5分钟、15=15分钟、30=30分钟、60=60分钟k线数据,不区分大小写;指数没有分钟线数据;周线每周最后一个交易日才可以获取,月线每月最后一个交易日才可以获取。
- adjustflag:复权类型,默认不复权:3;1:后复权;2:前复权。已支持分钟线、日线、周线、月线前后复权。 BaoStock提供的是涨跌幅复权算法复权因子,具体介绍见[BaoStock复权因子简介](https://www.baostock.com/helpdocs/pdf/BaoStock%E5%A4%8D%E6%9D%83%E5%9B%A0%E5%AD%90%E7%AE%80%E4%BB%8B.pdf "BaoStock复权因子简介.pdf")。
注意:
- 股票停牌时,对于日线,开、高、低、收价都相同,且都为前一交易日的收盘价,成交量、成交额为0,换手率为空。
如果需要将换手率转为float类型,可使用如下方法转换:result["turn"] = [0 if x == "" else float(x) for x in result["turn"]]
关于复权数据的说明:
BaoStock使用“涨跌幅复权法”进行复权,详细说明参考上文“复权因子简介”。不同系统间采用复权方式可能不一致,导致数据不一致。
“涨跌幅复权法的”优点:可以计算出资金收益率,确保初始投入的资金运用率为100%,既不会因为分红而导致投资减少,也不会因为配股导致投资增加。
与同花顺、通达信等存在不同。
返回示例数据
| date | code | open | high | low | close | preclose | volume | amount | adjustflag | turn | tradestatus | pctChg | isST |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2017-07-03 | sh.600000 | 12.64 | 12.65 | 12.47 | 12.56 | 12.65 | 38778949 | 486264672 | 3 | 0.137985 | 1 | —0.711456 | 0 |
| 2017-07-04 | sh.600000 | 12.55 | 12.58 | 12.41 | 12.55 | 12.56 | 36659128 | 458434432 | 3 | 0.130442 | 1 | —0.07962 | 0 |
| 2017-07-05 | sh.600000 | 12.5 | 12.65 | 12.47 | 12.62 | 12.55 | 26470507 | 332542464 | 3 | 0.094188 | 1 | 0.557767 | 0 |
| 2017-07-06 | sh.600000 | 12.62 | 12.72 | 12.51 | 12.66 | 12.62 | 37414241 | 471582096 | 3 | 0.133129 | 1 | 0.316957 | 0 |
| 2017-07-07 | sh.600000 | 12.62 | 12.69 | 12.55 | 12.6 | 12.66 | 24667294 | 311101536 | 3 | 0.087772 | 1 | —0.473929 | 0 |
返回数据说明
| 参数名称 | 参数描述 | 算法说明 |
|---|---|---|
| date | 交易所行情日期 | |
| code | 证券代码 | |
| open | 开盘价 | |
| high | 最高价 | |
| low | 最低价 | |
| close | 收盘价 | |
| preclose | 前收盘价 | 见表格下方详细说明 |
| volume | 成交量(累计 单位:股) | |
| amount | 成交额(单位:人民币元) | |
| adjustflag | 复权状态(1:后复权, 2:前复权,3:不复权) | |
| turn | 换手率 | [指定交易日的成交量(股)/指定交易日的股票的流通股总股数(股)]\*100% |
| tradestatus | 交易状态(1:正常交易 0:停牌) | |
| pctChg | 涨跌幅(百分比) | 日涨跌幅=[(指定交易日的收盘价-指定交易日前收盘价)/指定交易日前收盘价]\*100% |
| peTTM | 滚动市盈率 | (指定交易日的股票收盘价/指定交易日的每股盈余TTM)=(指定交易日的股票收盘价\*截至当日公司总股本)/归属母公司股东净利润TTM |
| pbMRQ | 市净率 | (指定交易日的股票收盘价/指定交易日的每股净资产)=总市值/(最近披露的归属母公司股东的权益-其他权益工具) |
| psTTM | 滚动市销率 | (指定交易日的股票收盘价/指定交易日的每股销售额)=(指定交易日的股票收盘价\*截至当日公司总股本)/营业总收入TTM |
| pcfNcfTTM | 滚动市现率 | (指定交易日的股票收盘价/指定交易日的每股现金流TTM)=(指定交易日的股票收盘价\*截至当日公司总股本)/现金以及现金等价物净增加额TTM |
| isST | 是否ST股,1是,0否 |
注意“前收盘价”说明:
证券在指定交易日行情数据的前收盘价,当日发生除权除息时,“前收盘价”不是前一天的实际收盘价,而是根据股权登记日收盘价与分红现金的数量、配送股的数里和配股价的高低等结合起来算出来的价格。
具体计算方法如下:
1、计算除息价:
除息价=股息登记日的收盘价-每股所分红利现金额
2、计算除权价:
送红股后的除权价=股权登记日的收盘价/(1+每股送红股数)
配股后的除权价=(股权登记日的收盘价+配股价\*每股配股数)/(1+每股配股数)
3、计算除权除息价
除权除息价=(股权登记日的收盘价-每股所分红利现金额+配股价\*每股配股数)/(1+每股送红股数+每股配股数)
“前收盘价”由交易所计算并公布。首发日的“前收盘价”等于“首发价格”。
历史行情指标参数
日线指标参数(包含停牌证券)
| 参数名称 | 参数描述 | 说明 |
|---|---|---|
| date | 交易所行情日期 | 格式:YYYY-MM-DD |
| code | 证券代码 | 格式:sh.600000。sh:上海,sz:深圳 |
| open | 今开盘价格 | 精度:小数点后4位;单位:人民币元 |
| high | 最高价 | 精度:小数点后4位;单位:人民币元 |
| low | 最低价 | 精度:小数点后4位;单位:人民币元 |
| close | 今收盘价 | 精度:小数点后4位;单位:人民币元 |
| preclose | 昨日收盘价 | 精度:小数点后4位;单位:人民币元 |
| volume | 成交数量 | 单位:股 |
| amount | 成交金额 | 精度:小数点后4位;单位:人民币元 |
| adjustflag | 复权状态 | 不复权、前复权、后复权 |
| turn | 换手率 | 精度:小数点后6位;单位:% |
| tradestatus | 交易状态 | 1:正常交易 0:停牌 |
| pctChg | 涨跌幅(百分比) | 精度:小数点后6位 |
| peTTM | 滚动市盈率 | 精度:小数点后6位 |
| psTTM | 滚动市销率 | 精度:小数点后6位 |
| pcfNcfTTM | 滚动市现率 | 精度:小数点后6位 |
| pbMRQ | 市净率 | 精度:小数点后6位 |
| isST | 是否ST | 1是,0否 |
周、月线指标参数
| 参数名称 | 参数描述 | 说明 | 算法说明 |
|---|---|---|---|
| date | 交易所行情日期 | 格式:YYYY-MM-DD | |
| code | 证券代码 | 格式:sh.600000。sh:上海,sz:深圳 | |
| open | 开盘价格 | 精度:小数点后4位;单位:人民币元 | |
| high | 最高价 | 精度:小数点后4位;单位:人民币元 | |
| low | 最低价 | 精度:小数点后4位;单位:人民币元 | |
| close | 收盘价 | 精度:小数点后4位;单位:人民币元 | |
| volume | 成交数量 | 单位:股 | |
| amount | 成交金额 | 精度:小数点后4位;单位:人民币元 | |
| adjustflag | 复权状态 | 不复权、前复权、后复权 | |
| turn | 换手率 | 精度:小数点后6位;单位:% | |
| pctChg | 涨跌幅(百分比) | 精度:小数点后6位 | 涨跌幅=[(区间最后交易日收盘价-区间首个交易日前收盘价)/区间首个交易日前收盘价]\*100% |
5、15、30、60分钟线指标参数(不包含指数)
| 参数名称 | 参数描述 | 说明 |
|---|---|---|
| date | 交易所行情日期 | 格式:YYYY-MM-DD |
| time | 交易所行情时间 | 格式:YYYYMMDDHHMMSSsss |
| code | 证券代码 | 格式:sh.600000。sh:上海,sz:深圳 |
| open | 开盘价格 | 精度:小数点后4位;单位:人民币元 |
| high | 最高价 | 精度:小数点后4位;单位:人民币元 |
| low | 最低价 | 精度:小数点后4位;单位:人民币元 |
| close | 收盘价 | 精度:小数点后4位;单位:人民币元 |
| volume | 成交数量 | 单位:股; 时间范围内的累计成交数量 |
| amount | 成交金额 | 精度:小数点后4位;单位:人民币元; 时间范围内的累计成交金额 |
| adjustflag | 复权状态 | 不复权、前复权、后复权 |
行业分类
行业分类:query_stock_industry()
方法说明:通过API接口获取行业分类信息,更新频率:每周一更新。返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取行业分类数据
rs = bs.query_stock_industry()
# rs = bs.query_stock_basic(code_name="浦发银行")
print('query_stock_industry error_code:'+rs.error_code)
print('query_stock_industry respond error_msg:'+rs.error_msg)
# 打印结果集
industry_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
industry_list.append(rs.get_row_data())
result = pd.DataFrame(industry_list, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("D:/stock_industry.csv", encoding="gbk", index=False)
print(result)
# 登出系统
bs.logout()参数含义:
- code:A股股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。可以为空;
- date:查询日期,格式XXXX-XX-XX,为空时默认最新日期。
返回示例数据
| updateDate | code | code_name | industry | industryClassification |
|---|---|---|---|---|
| 2018-11-26 | sh.600000 | 浦发银行 | J66货币金融服务 | 证监会行业分类 |
| 2018-11-26 | sh.600001 | 邯郸钢铁 | 证监会行业分类 |
返回数据说明
| 参数名称 | 参数描述 |
|---|---|
| updateDate | 更新日期 |
| code | 证券代码 |
| code_name | 证券名称 |
| industry | 所属行业 |
| industryClassification | 所属行业类别 |
A股K线数据
获取历史A股K线数据:query_history_k_data_plus()
方法说明:通过API接口获取A股历史交易数据,可以通过参数设置获取日k线、周k线、月k线,以及5分钟、15分钟、30分钟和60分钟k线数据,适合搭配均线数据进行选股和分析。
返回类型:pandas的DataFrame类型。
能获取1990-12-19至当前时间的数据;
可查询不复权、前复权、后复权数据。
示例数据:下载
日线使用示例:
import baostock as bs
import pandas as pd
#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
#### 获取沪深A股历史K线数据 ####
# 详细指标参数,参见“历史行情指标参数”章节;“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。
# 分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag
# 周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg
rs = bs.query_history_k_data_plus("sh.600000",
"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",
start_date='2024-07-01', end_date='2024-12-31',
frequency="d", adjustflag="3")
print('query_history_k_data_plus respond error_code:'+rs.error_code)
print('query_history_k_data_plus respond error_msg:'+rs.error_msg)
#### 打印结果集 ####
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
#### 结果集输出到csv文件 ####
result.to_csv("D:\\history_A_stock_k_data.csv", index=False)
print(result)
#### 登出系统 ####
bs.logout()
分钟线使用示例:
import baostock as bs
import pandas as pd
#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
#### 获取沪深A股历史K线数据 ####
# 详细指标参数,参见“历史行情指标参数”章节;“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。
# 分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag
# 周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg
rs = bs.query_history_k_data_plus("sh.600000",
"date,time,code,open,high,low,close,volume,amount,adjustflag",
start_date='2024-07-01', end_date='2024-12-31',
frequency="5", adjustflag="3")
print('query_history_k_data_plus respond error_code:'+rs.error_code)
print('query_history_k_data_plus respond error_msg:'+rs.error_msg)
#### 打印结果集 ####
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
#### 结果集输出到csv文件 ####
result.to_csv("D:\\history_A_stock_k_data.csv", index=False)
print(result)
#### 登出系统 ####
bs.logout()
参数含义:
- code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
- fields:指示简称,支持多指标输入,以半角逗号分隔,填写内容作为返回类型的列。详细指标列表见历史行情指标参数章节,日线与分钟线参数不同。此参数不可为空;
- start:开始日期(包含),格式“YYYY-MM-DD”,为空时取2015-01-01;
- end:结束日期(包含),格式“YYYY-MM-DD”,为空时取最近一个交易日;
- frequency:数据类型,默认为d,日k线;d=日k线、w=周、m=月、5=5分钟、15=15分钟、30=30分钟、60=60分钟k线数据,不区分大小写;指数没有分钟线数据;周线每周最后一个交易日才可以获取,月线每月最后一个交易日才可以获取。
- adjustflag:复权类型,默认不复权:3;1:后复权;2:前复权。已支持分钟线、日线、周线、月线前后复权。 BaoStock提供的是涨跌幅复权算法复权因子,具体介绍见[BaoStock复权因子简介](https://www.baostock.com/helpdocs/pdf/BaoStock%E5%A4%8D%E6%9D%83%E5%9B%A0%E5%AD%90%E7%AE%80%E4%BB%8B.pdf "BaoStock复权因子简介.pdf")。
注意:
- 股票停牌时,对于日线,开、高、低、收价都相同,且都为前一交易日的收盘价,成交量、成交额为0,换手率为空。
如果需要将换手率转为float类型,可使用如下方法转换:result["turn"] = [0 if x == "" else float(x) for x in result["turn"]]
关于复权数据的说明:
BaoStock使用“涨跌幅复权法”进行复权,详细说明参考上文“复权因子简介”。不同系统间采用复权方式可能不一致,导致数据不一致。
“涨跌幅复权法的”优点:可以计算出资金收益率,确保初始投入的资金运用率为100%,既不会因为分红而导致投资减少,也不会因为配股导致投资增加。
与同花顺、通达信等存在不同。
返回示例数据
| date | code | open | high | low | close | preclose | volume | amount | adjustflag | turn | tradestatus | pctChg | isST |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2017-07-03 | sh.600000 | 12.64 | 12.65 | 12.47 | 12.56 | 12.65 | 38778949 | 486264672 | 3 | 0.137985 | 1 | —0.711456 | 0 |
| 2017-07-04 | sh.600000 | 12.55 | 12.58 | 12.41 | 12.55 | 12.56 | 36659128 | 458434432 | 3 | 0.130442 | 1 | —0.07962 | 0 |
| 2017-07-05 | sh.600000 | 12.5 | 12.65 | 12.47 | 12.62 | 12.55 | 26470507 | 332542464 | 3 | 0.094188 | 1 | 0.557767 | 0 |
| 2017-07-06 | sh.600000 | 12.62 | 12.72 | 12.51 | 12.66 | 12.62 | 37414241 | 471582096 | 3 | 0.133129 | 1 | 0.316957 | 0 |
| 2017-07-07 | sh.600000 | 12.62 | 12.69 | 12.55 | 12.6 | 12.66 | 24667294 | 311101536 | 3 | 0.087772 | 1 | —0.473929 | 0 |
返回数据说明
| 参数名称 | 参数描述 | 算法说明 |
|---|---|---|
| date | 交易所行情日期 | |
| code | 证券代码 | |
| open | 开盘价 | |
| high | 最高价 | |
| low | 最低价 | |
| close | 收盘价 | |
| preclose | 前收盘价 | 见表格下方详细说明 |
| volume | 成交量(累计 单位:股) | |
| amount | 成交额(单位:人民币元) | |
| adjustflag | 复权状态(1:后复权, 2:前复权,3:不复权) | |
| turn | 换手率 | [指定交易日的成交量(股)/指定交易日的股票的流通股总股数(股)]\*100% |
| tradestatus | 交易状态(1:正常交易 0:停牌) | |
| pctChg | 涨跌幅(百分比) | 日涨跌幅=[(指定交易日的收盘价-指定交易日前收盘价)/指定交易日前收盘价]\*100% |
| peTTM | 滚动市盈率 | (指定交易日的股票收盘价/指定交易日的每股盈余TTM)=(指定交易日的股票收盘价\*截至当日公司总股本)/归属母公司股东净利润TTM |
| pbMRQ | 市净率 | (指定交易日的股票收盘价/指定交易日的每股净资产)=总市值/(最近披露的归属母公司股东的权益-其他权益工具) |
| psTTM | 滚动市销率 | (指定交易日的股票收盘价/指定交易日的每股销售额)=(指定交易日的股票收盘价\*截至当日公司总股本)/营业总收入TTM |
| pcfNcfTTM | 滚动市现率 | (指定交易日的股票收盘价/指定交易日的每股现金流TTM)=(指定交易日的股票收盘价\*截至当日公司总股本)/现金以及现金等价物净增加额TTM |
| isST | 是否ST股,1是,0否 |
注意“前收盘价”说明:
证券在指定交易日行情数据的前收盘价,当日发生除权除息时,“前收盘价”不是前一天的实际收盘价,而是根据股权登记日收盘价与分红现金的数量、配送股的数里和配股价的高低等结合起来算出来的价格。
具体计算方法如下:
1、计算除息价:
除息价=股息登记日的收盘价-每股所分红利现金额
2、计算除权价:
送红股后的除权价=股权登记日的收盘价/(1+每股送红股数)
配股后的除权价=(股权登记日的收盘价+配股价\*每股配股数)/(1+每股配股数)
3、计算除权除息价
除权除息价=(股权登记日的收盘价-每股所分红利现金额+配股价\*每股配股数)/(1+每股送红股数+每股配股数)
“前收盘价”由交易所计算并公布。首发日的“前收盘价”等于“首发价格”。
历史行情指标参数
日线指标参数(包含停牌证券)
| 参数名称 | 参数描述 | 说明 |
|---|---|---|
| date | 交易所行情日期 | 格式:YYYY-MM-DD |
| code | 证券代码 | 格式:sh.600000。sh:上海,sz:深圳 |
| open | 今开盘价格 | 精度:小数点后4位;单位:人民币元 |
| high | 最高价 | 精度:小数点后4位;单位:人民币元 |
| low | 最低价 | 精度:小数点后4位;单位:人民币元 |
| close | 今收盘价 | 精度:小数点后4位;单位:人民币元 |
| preclose | 昨日收盘价 | 精度:小数点后4位;单位:人民币元 |
| volume | 成交数量 | 单位:股 |
| amount | 成交金额 | 精度:小数点后4位;单位:人民币元 |
| adjustflag | 复权状态 | 不复权、前复权、后复权 |
| turn | 换手率 | 精度:小数点后6位;单位:% |
| tradestatus | 交易状态 | 1:正常交易 0:停牌 |
| pctChg | 涨跌幅(百分比) | 精度:小数点后6位 |
| peTTM | 滚动市盈率 | 精度:小数点后6位 |
| psTTM | 滚动市销率 | 精度:小数点后6位 |
| pcfNcfTTM | 滚动市现率 | 精度:小数点后6位 |
| pbMRQ | 市净率 | 精度:小数点后6位 |
| isST | 是否ST | 1是,0否 |
周、月线指标参数
| 参数名称 | 参数描述 | 说明 | 算法说明 |
|---|---|---|---|
| date | 交易所行情日期 | 格式:YYYY-MM-DD | |
| code | 证券代码 | 格式:sh.600000。sh:上海,sz:深圳 | |
| open | 开盘价格 | 精度:小数点后4位;单位:人民币元 | |
| high | 最高价 | 精度:小数点后4位;单位:人民币元 | |
| low | 最低价 | 精度:小数点后4位;单位:人民币元 | |
| close | 收盘价 | 精度:小数点后4位;单位:人民币元 | |
| volume | 成交数量 | 单位:股 | |
| amount | 成交金额 | 精度:小数点后4位;单位:人民币元 | |
| adjustflag | 复权状态 | 不复权、前复权、后复权 | |
| turn | 换手率 | 精度:小数点后6位;单位:% | |
| pctChg | 涨跌幅(百分比) | 精度:小数点后6位 | 涨跌幅=[(区间最后交易日收盘价-区间首个交易日前收盘价)/区间首个交易日前收盘价]\*100% |
5、15、30、60分钟线指标参数(不包含指数)
| 参数名称 | 参数描述 | 说明 |
|---|---|---|
| date | 交易所行情日期 | 格式:YYYY-MM-DD |
| time | 交易所行情时间 | 格式:YYYYMMDDHHMMSSsss |
| code | 证券代码 | 格式:sh.600000。sh:上海,sz:深圳 |
| open | 开盘价格 | 精度:小数点后4位;单位:人民币元 |
| high | 最高价 | 精度:小数点后4位;单位:人民币元 |
| low | 最低价 | 精度:小数点后4位;单位:人民币元 |
| close | 收盘价 | 精度:小数点后4位;单位:人民币元 |
| volume | 成交数量 | 单位:股; 时间范围内的累计成交数量 |
| amount | 成交金额 | 精度:小数点后4位;单位:人民币元; 时间范围内的累计成交金额 |
| adjustflag | 复权状态 | 不复权、前复权、后复权 |
货币供应量
货币供应量:query_money_supply_data_month()
方法说明:通过API接口获取货币供应量,可以通过参数设置获取对应起止日期的数据。 返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取货币供应量
rs = bs.query_money_supply_data_month(start_date="2010-01", end_date="2015-12")
print('query_money_supply_data_month respond error_code:'+rs.error_code)
print('query_money_supply_data_month respond error_msg:'+rs.error_msg)
# 打印结果集
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("D:/money_supply_data_month.csv", encoding="gbk", index=False)
print(result)
# 登出系统
bs.logout()参数含义:
- start_date:开始日期,格式XXXX-XX,发布日期在这个范围内,可以为空;
- end_date:结束日期,格式XXXX-XX,发布日期在这个范围内,可以为空。
返回示例数据
| statYear | statMonth | m0Month | m0YOY | m0ChainRelative | m1Month | m1YOY | m1ChainRelative |
|---|---|---|---|---|---|---|---|
| 2010 | 01 | 40758.580000 | —0.790000 | 6.566809 | 229588.980000 | 38.960000 | 3.677276 |
| 2010 | 02 | 42865.790000 | 21.980000 | 5.169979 | 224286.950000 | 34.990000 | —2.309357 |
返回示例数据
| m2Month | m2YOY | m2ChainRelative |
|---|---|---|
| 625609.290000 | 25.980000 | 2.521165 |
| 636072.260000 | 25.520000 | 1.672445 |
返回数据说明
| 参数名称 | 参数描述 |
|---|---|
| statYear | 统计年度 |
| statMonth | 统计月份 |
| m0Month | 货币供应量M0(月) |
| m0YOY | 货币供应量M0(同比) |
| m0ChainRelative | 货币供应量M0(环比) |
| m1Month | 货币供应量M1(月) |
| m1YOY | 货币供应量M1(同比) |
| m1ChainRelative | 货币供应量M1(环比) |
| m2Month | 货币供应量M2(月) |
| m2YOY | 货币供应量M2(同比) |
| m2ChainRelative | 货币供应量M2(环比) |
货币供应量(年底余额)
货币供应量(年底余额):query_money_supply_data_year()
方法说明:通过API接口获取货币供应量(年底余额),可以通过参数设置获取对应起止日期的数据。 返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取货币供应量(年底余额)
rs = bs.query_money_supply_data_year(start_date="2010", end_date="2015")
print('query_money_supply_data_year respond error_code:'+rs.error_code)
print('query_money_supply_data_year respond error_msg:'+rs.error_msg)
# 打印结果集
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("D:/money_supply_data_year.csv", encoding="gbk", index=False)
print(result)
# 登出系统
bs.logout()参数含义:
- start_date:开始日期,格式XXXX,发布日期在这个范围内,可以为空;
- end_date:结束日期,格式XXXX,发布日期在这个范围内,可以为空。
返回示例数据
| statYear | m0Year | m0YearYOY | m1Year | m1YearYOY | m2Year | m2YearYOY |
|---|---|---|---|---|---|---|
| 2010 | 44628.170000 | 16.700000 | 266621.540000 | 21.200000 | 725851.800000 | 19.700000 |
| 2011 | 50748.460000 | 13.760000 | 289847.700000 | 7.850000 | 851590.900000 | 13.610000 |
返回数据说明
| 参数名称 | 参数描述 |
|---|---|
| statYear | 统计年度 |
| m0Year | 年货币供应量M0(亿元) |
| m0YearYOY | 年货币供应量M0(同比) |
| m1Year | 年货币供应量M1(亿元) |
| m1YearYOY | 年货币供应量M1(同比) |
| m2Year | 年货币供应量M2(亿元) |
| m2YearYOY | 年货币供应量M2(同比) |
上证50成分股
上证50成分股:query_sz50_stocks()
方法说明:通过API接口获取上证50成分股信息,更新频率:每周一更新。返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取上证50成分股
rs = bs.query_sz50_stocks()
print('query_sz50 error_code:'+rs.error_code)
print('query_sz50 error_msg:'+rs.error_msg)
# 打印结果集
sz50_stocks = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
sz50_stocks.append(rs.get_row_data())
result = pd.DataFrame(sz50_stocks, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("D:/sz50_stocks.csv", encoding="gbk", index=False)
print(result)
# 登出系统
bs.logout()参数含义:
- date:查询日期,格式XXXX-XX-XX,为空时默认最新日期。
返回示例数据
| updateDate | code | code_name |
|---|---|---|
| 2018-11-26 | sh.600000 | 浦发银行 |
| 2018-11-26 | sh.600016 | 民生银行 |
返回数据说明
| 参数名称 | 参数描述 |
|---|---|
| updateDate | 更新日期 |
| code | 证券代码 |
| code_name | 证券名称 |
估值指标(日频)
沪深A股估值指标(日频) 示例
通过query_history_k_data_plus()获取沪深A股估值指标(日频)数据(指数未提供估值数据),未提供周、月估值数据。示例数据:下载
import baostock as bs
import pandas as pd
#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
#### 获取沪深A股估值指标(日频)数据 ####
# peTTM 滚动市盈率
# psTTM 滚动市销率
# pcfNcfTTM 滚动市现率
# pbMRQ 市净率
rs = bs.query_history_k_data_plus("sh.600000",
"date,code,close,peTTM,pbMRQ,psTTM,pcfNcfTTM",
start_date='2015-01-01', end_date='2017-12-31',
frequency="d", adjustflag="3")
print('query_history_k_data_plus respond error_code:'+rs.error_code)
print('query_history_k_data_plus respond error_msg:'+rs.error_msg)
#### 打印结果集 ####
result_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
result_list.append(rs.get_row_data())
result = pd.DataFrame(result_list, columns=rs.fields)
#### 结果集输出到csv文件 ####
result.to_csv("D:\\history_A_stock_valuation_indicator_data.csv", encoding="gbk", index=False)
print(result)
#### 登出系统 ####
bs.logout()返回数据说明
| 参数名称 | 参数描述 | 说明 |
|---|---|---|
| date | 交易所行情日期 | 格式:YYYY-MM-DD |
| code | 证券代码 | 格式:sh.600000。sh:上海,sz:深圳 |
| close | 今收盘价 | 精度:小数点后4位;单位:人民币元 |
| peTTM | 滚动市盈率 | 精度:小数点后4位 |
| psTTM | 滚动市销率 | 精度:小数点后4位 |
| pcfNcfTTM | 滚动市现率 | 精度:小数点后4位 |
| pbMRQ | 市净率 | 精度:小数点后4位 |
中证500成分股
中证500成分股:query_zz500_stocks()
方法说明:通过API接口获取中证500成分股信息,更新频率:每周一更新。返回类型:pandas的DataFrame类型。 使用示例
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取中证500成分股
rs = bs.query_zz500_stocks()
print('query_zz500 error_code:'+rs.error_code)
print('query_zz500 error_msg:'+rs.error_msg)
# 打印结果集
zz500_stocks = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
zz500_stocks.append(rs.get_row_data())
result = pd.DataFrame(zz500_stocks, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("D:/zz500_stocks.csv", encoding="gbk", index=False)
print(result)
# 登出系统
bs.logout()参数含义:
- date:查询日期,格式XXXX-XX-XX,为空时默认最新日期。
返回示例数据
| updateDate | code | code_name |
|---|---|---|
| 2018-11-26 | sh.600004 | 白云机场 |
| 2018-11-26 | sh.600006 | 东风汽车 |
返回数据说明
| 参数名称 | 参数描述 |
|---|---|
| updateDate | 更新日期 |
| code | 证券代码 |
| code_name | 证券名称 |
baostock 详细 API 文档索引
目录
1. 常用核心 API 参考文档 2. 详细知识库文档目录
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
BaoStock 认证模块
支持自定义服务器 IP 和端口配置
"""
import json
import sys
import os
def auth_bs():
"""
登录并返回已认证的 baostock 模块
可选环境变量:
- BAOSTOCK_SERVER_IP: 自定义服务器地址(用于 nginx 代理等场景)
- BAOSTOCK_SERVER_PORT: 服务器端口,默认 10030
Returns:
module: 已认证的 baostock 模块
Exits:
如果登录失败,输出 JSON 错误信息并退出
"""
try:
import baostock as bs
import baostock.common.contants as cons
except ImportError:
print(json.dumps({
'status': 'error',
'message': 'baostock 库未安装,请先安装: pip install baostock'
}, ensure_ascii=False))
sys.exit(1)
# 获取可选的服务器配置
server_ip = os.getenv('BAOSTOCK_SERVER_IP')
server_port = os.getenv('BAOSTOCK_SERVER_PORT')
# 支持自定义 BaoStock 服务器配置(仅首次生效,后续 login 复用已有连接)
if server_ip:
cons.BAOSTOCK_SERVER_IP = server_ip
print(f"BaoStock server IP overridden: {server_ip}", file=sys.stderr)
if server_port:
try:
port = int(server_port)
if port != 10030:
cons.BAOSTOCK_SERVER_PORT = port
print(f"BaoStock server port overridden: {port}", file=sys.stderr)
except ValueError:
print(json.dumps({
'status': 'error',
'message': f'BAOSTOCK_SERVER_PORT 必须是有效的端口号: {server_port}'
}, ensure_ascii=False))
sys.exit(1)
# 执行登录
try:
lg = bs.login()
if lg.error_code != "0":
error_msg = lg.error_msg
error_code = lg.error_code
if error_code == "10001011":
error_msg = "IP 已加入黑名单,需联系 BaoStock 官方解除"
print(json.dumps({
'status': 'error',
'message': f'BaoStock 登录失败: {error_msg} (错误码: {error_code})'
}, ensure_ascii=False))
sys.exit(1)
return bs
except Exception as e:
print(json.dumps({
'status': 'error',
'message': f'BaoStock 登录异常: {str(e)}'
}, ensure_ascii=False))
sys.exit(1)
def logout_bs(bs):
"""
登出 BaoStock
Args:
bs: baostock 模块
"""
try:
bs.logout()
except Exception:
pass
if __name__ == '__main__':
# 测试认证
bs = auth_bs()
print(json.dumps({
'status': 'success',
'message': 'BaoStock 登录成功'
}, ensure_ascii=False))
logout_bs(bs)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
财务数据获取脚本
支持获取盈利能力、营运能力、成长能力、偿债能力、现金流、杜邦分析等数据
"""
import argparse
import json
import sys
import os
from datetime import datetime
# 添加脚本目录到 Python 路径,支持独立运行
script_dir = os.path.dirname(os.path.abspath(__file__))
if script_dir not in sys.path:
sys.path.insert(0, script_dir)
# 导入认证模块
from auth import auth_bs, logout_bs
def query_financial_data(bs, query_func, code, year, quarter):
"""
通用财务数据查询函数
Args:
bs: baostock 模块
query_func: 查询函数
code: 股票代码
year: 年份
quarter: 季度 1/2/3/4
Returns:
dict: 财务数据字典
"""
rs = query_func(code=code, year=year, quarter=quarter)
if rs.error_code == '0' and rs.next():
row = rs.get_row_data()
return dict(zip(rs.fields, row))
return None
def main():
parser = argparse.ArgumentParser(description='获取 BaoStock 财务数据')
parser.add_argument('--type', required=True,
choices=['profit', 'operation', 'growth', 'balance',
'cash_flow', 'dupont', 'all'],
help='财务数据类型: '
'profit-盈利能力, operation-营运能力, '
'growth-成长能力, balance-偿债能力, '
'cash_flow-现金流, dupont-杜邦分析, '
'all-获取全部财务指标')
parser.add_argument('--code', required=True,
help='股票代码,格式: sh.600000 或 sz.000001')
parser.add_argument('--year', required=True, type=int,
help='查询年份,如 2023')
parser.add_argument('--quarter', required=True, type=int,
choices=[1, 2, 3, 4],
help='查询季度: 1/2/3/4')
parser.add_argument('--output', help='输出CSV文件路径')
args = parser.parse_args()
try:
# 使用统一认证模块进行登录
bs = auth_bs()
result = {
'status': 'success',
'data_type': args.type,
'code': args.code,
'year': args.year,
'quarter': args.quarter,
'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
}
if args.type == 'profit' or args.type == 'all':
# 盈利能力
data = query_financial_data(
bs, bs.query_profit_data, args.code, args.year, args.quarter
)
if data:
result['profit'] = data
else:
result['profit_error'] = f'未获取到 {args.code} 的盈利能力数据'
if args.type == 'operation' or args.type == 'all':
# 营运能力
data = query_financial_data(
bs, bs.query_operation_data, args.code, args.year, args.quarter
)
if data:
result['operation'] = data
else:
result['operation_error'] = f'未获取到 {args.code} 的营运能力数据'
if args.type == 'growth' or args.type == 'all':
# 成长能力
data = query_financial_data(
bs, bs.query_growth_data, args.code, args.year, args.quarter
)
if data:
result['growth'] = data
else:
result['growth_error'] = f'未获取到 {args.code} 的成长能力数据'
if args.type == 'balance' or args.type == 'all':
# 偿债能力
data = query_financial_data(
bs, bs.query_balance_data, args.code, args.year, args.quarter
)
if data:
result['balance'] = data
else:
result['balance_error'] = f'未获取到 {args.code} 的偿债能力数据'
if args.type == 'cash_flow' or args.type == 'all':
# 现金流
data = query_financial_data(
bs, bs.query_cash_flow_data, args.code, args.year, args.quarter
)
if data:
result['cash_flow'] = data
else:
result['cash_flow_error'] = f'未获取到 {args.code} 的现金流数据'
if args.type == 'dupont' or args.type == 'all':
# 杜邦分析
data = query_financial_data(
bs, bs.query_dupont_data, args.code, args.year, args.quarter
)
if data:
result['dupont'] = data
else:
result['dupont_error'] = f'未获取到 {args.code} 的杜邦分析数据'
# 保存到 CSV
if args.output:
import pandas as pd
# 合并所有数据
all_data = {}
for key in ['profit', 'operation', 'growth', 'balance', 'cash_flow', 'dupont']:
if key in result:
all_data.update(result[key])
if all_data:
df = pd.DataFrame([all_data])
df.to_csv(args.output, index=False, encoding='utf-8-sig')
result['output_file'] = args.output
print(json.dumps(result, ensure_ascii=False, indent=2))
# 登出
logout_bs(bs)
except ImportError as e:
print(json.dumps({
'status': 'error',
'message': f'导入错误: {str(e)},请检查 baostock 是否已安装'
}, ensure_ascii=False))
sys.exit(1)
except Exception as e:
print(json.dumps({
'status': 'error',
'message': str(e),
'error_type': type(e).__name__
}, ensure_ascii=False))
sys.exit(1)
if __name__ == '__main__':
main()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
行情数据获取脚本
支持获取 K 线数据、批量下载、保存 CSV
"""
import argparse
import json
import sys
import os
from datetime import datetime, timedelta
# 添加脚本目录到 Python 路径,支持独立运行
script_dir = os.path.dirname(os.path.abspath(__file__))
if script_dir not in sys.path:
sys.path.insert(0, script_dir)
# 导入认证模块
from auth import auth_bs, logout_bs
def get_kline_data(bs, code, start_date, end_date, frequency='d', adjustflag='3', fields=None):
"""
获取单只股票 K 线数据
Args:
bs: baostock 模块
code: 股票代码,如 sh.600000
start_date: 开始日期 YYYY-MM-DD
end_date: 结束日期 YYYY-MM-DD
frequency: 频率 d/w/m/5/15/30/60
adjustflag: 复权类型 1=后复权, 2=前复权, 3=不复权
fields: 字段列表,逗号分隔
Returns:
list: K线数据字典列表
"""
# 默认字段
if fields is None:
fields = "date,code,open,high,low,close,volume,amount,pctChg"
rs = bs.query_history_k_data_plus(
code,
fields,
start_date=start_date,
end_date=end_date,
frequency=frequency,
adjustflag=adjustflag
)
data = []
if rs.error_code == '0':
while rs.next():
row = rs.get_row_data()
data.append(dict(zip(rs.fields, row)))
return data
def main():
parser = argparse.ArgumentParser(description='获取 BaoStock A股行情数据')
parser.add_argument('--type', required=False, choices=['kline', 'current'],
help='数据类型: kline-K线数据, current-当前无实时数据(baostock不提供实时)', default = 'kline')
parser.add_argument('--code', required=True,
help='股票代码,格式: sh.600000 或 sz.000001,多个用逗号分隔')
parser.add_argument('--start', help='开始日期,格式YYYY-MM-DD,如 2024-01-01')
parser.add_argument('--end', help='结束日期,格式YYYY-MM-DD,如 2024-01-31')
parser.add_argument('--frequency', default='d',
choices=['d', 'w', 'm', '5', '15', '30', '60'],
help='数据频率,默认d(日线): d=日线, w=周线, m=月线, 5/15/30/60=分钟线')
parser.add_argument('--adjust', default='3',
choices=['1', '2', '3'],
help='复权类型,默认3(不复权): 1=后复权, 2=前复权, 3=不复权')
parser.add_argument('--fields',
help='字段列表,逗号分隔,如 date,open,close,high,low,volume')
parser.add_argument('--output', help='输出CSV文件路径')
parser.add_argument('--file', help='股票代码列表文件路径,每行一个代码')
args = parser.parse_args()
try:
# 使用统一认证模块进行登录
bs = auth_bs()
result = {
'status': 'success',
'data_type': args.type,
'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
}
# 处理日期默认值
if not args.end:
args.end = datetime.now().strftime('%Y-%m-%d')
if not args.start:
# 默认获取最近 30 天
args.start = (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d')
# 获取股票代码列表
if args.file:
# 从文件读取代码列表
with open(args.file, 'r', encoding='utf-8') as f:
codes = [line.strip() for line in f if line.strip()]
else:
# 从命令行参数解析
codes = [c.strip() for c in args.code.split(',')]
if args.type == 'kline':
all_data = []
for code in codes:
data = get_kline_data(
bs, code, args.start, args.end,
args.frequency, args.adjust, args.fields
)
all_data.extend(data)
result['data'] = all_data
result['count'] = len(all_data)
result['codes'] = codes
result['frequency'] = args.frequency
result['adjust'] = args.adjust
# 保存到 CSV
if args.output and all_data:
import pandas as pd
df = pd.DataFrame(all_data)
df.to_csv(args.output, index=False, encoding='utf-8-sig')
result['output_file'] = args.output
elif args.type == 'current':
# baostock 不提供实时数据,返回提示
result['warning'] = 'BaoStock 不提供实时行情数据,建议使用 kline 类型获取历史数据'
result['data'] = []
result['count'] = 0
print(json.dumps(result, ensure_ascii=False, indent=2))
# 登出
logout_bs(bs)
except ImportError as e:
print(json.dumps({
'status': 'error',
'message': f'导入错误: {str(e)},请检查 baostock 是否已安装'
}, ensure_ascii=False))
sys.exit(1)
except Exception as e:
print(json.dumps({
'status': 'error',
'message': str(e),
'error_type': type(e).__name__
}, ensure_ascii=False))
sys.exit(1)
if __name__ == '__main__':
main()