baostock について
BaoStockは、中国A株の証券データを扱う無料のオープンソースプラットフォームです。統一されたPython APIを通じてデータを提供し、市場、企業、財務、マクロ経済データを必要とする分析者や開発者を対象とします。
主な機能
- 01日次、週次、月次、分足の過去相場
- 02株式、指数、業種の情報
- 03配当と調整係数のデータ
- 04四半期財務指標とレポート
- 05金利とマネーサプライのデータ
活用シーン
- 01A株の過去価格データセットの作成
- 02企業の財務指標の比較
- 03指数構成銘柄と業種分類の確認
- 04市場データと合わせたマクロ系列の分析
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ atompilot/ baostock-skill --skill baostockインストール後、Claude Code で/baostockを入力して読み込まれたか確認します。
詳細
BaoStock
概要
BaoStockは、中国A株向けの無料のオープンソース証券データプラットフォームです。統一されたPython APIを通じて、過去の相場データ、財務指標、マクロ経済データ、業種分類を提供し、pandas DataFrameを返します。
主な利点:無料で安定しており、長期間のデータ(1990年以降)を利用できます。レート制限やクレジットも必要ありません。
クイックスタート
インストール
pip install baostock
基本的な使用パターン
import baostock as bs
import pandas as pd
# 1. Login (required)
lg = bs.login()
# 2. Query data
rs = bs.query_history_k_data_plus(
"sh.600000",
"date,code,open,high,low,close,volume,amount",
start_date="2024-01-01",
end_date="2024-12-31",
frequency="d",
adjustflag="3",
)
# 3. Collect results (pandas 2.0+ compatible)
rows = []
while (rs.error_code == "0") and rs.next():
rows.append(rs.get_row_data())
df = pd.DataFrame(rows, columns=rs.fields)
# 4. Logout
bs.logout()
株式コードの形式
BaoStockではexchange.code形式を使用します(区切り文字はドットです)。
| 取引所 | 接頭辞 | 例 |
|---|---|---|
| 上海(SSE) | sh. | sh.600000(SPDB) |
| 深圳(SZSE) | sz. | sz.000001(Ping An Bank) |
パラメーターの規則
- 日付:
YYYY-MM-DD(例:2024-12-31) - 株式コード:
sh.600000、sz.000001 - 戻り値の形式:
rs.next()とrs.get_row_data()で反復処理し、DataFrameにまとめます - すべての戻り値は文字列です:数値列は手動で
pd.to_numeric()を実行する必要があります
API リファレンス全体
I. 市場データ
1. 過去のK線:query_history_k_data_plus()
最も重要なAPIです。調整機能付きの日足/週足/月足/分足に対応しています。
rs = bs.query_history_k_data_plus(
code="sh.600000", # Stock code
fields="date,code,...", # Return fields (comma-separated)
start_date="2024-01-01",# Start date, default 2015-01-01
end_date="2024-12-31", # End date, default latest trading day
frequency="d", # Frequency
adjustflag="3", # Adjustment type
)
frequencyの値:
| 値 | 頻度 | 備考 |
|---|---|---|
"d" | 日足 | デフォルト |
"w" | 週足 | |
"m" | 月足 | |
"5" | 5分足 | 指数は分足に対応していません |
"15" | 15分足 | |
"30" | 30分足 | |
"60" | 60分足 |
adjustflagの値:
| 値 | 意味 | 方法 |
|---|---|---|
"3" | 未調整 | デフォルト |
"1" | 後方調整 | 騰落率調整方式 |
"2" | 前方調整 | 騰落率調整方式 |
注:BaoStockは「騰落率調整方式」を使用しています。他のプラットフォーム(例:Tongdaxin)とは異なります。
日足/週足/月足のフィールド:
| フィールド | 説明 | 型 |
|---|---|---|
date | 取引日 | str |
code | 株式コード | str |
open | 始値 | str→float |
high | 高値 | str→float |
low | 安値 | str→float |
close | 終値 | str→float |
preclose | 前日終値 | str→float |
volume | 出来高(株) | str→float |
amount | 売買代金(人民元) | str→float |
adjustflag | 調整フラグ | str |
turn | 売買回転率(%) | str→float。取引停止中は空文字列 |
tradestatus | 取引状況 | str。"1"=通常、"0"=取引停止 |
pctChg | 騰落率(%) | str→float |
peTTM | PER(TTM) | str→float |
pbMRQ | PBR(MRQ) | str→float |
psTTM | PSR(TTM) | str→float |
pcfNcfTTM | PCFR(TTM) | str→float |
isST | ST株かどうか | str。"1"=はい、"0"=いいえ |
分足のフィールド:
| フィールド | 説明 |
|---|---|
date | 日付 |
time | 時刻(形式:YYYYMMDDHHmmssSSS) |
code | 株式コード |
open | 始値 |
high | 高値 |
low | 安値 |
close | 終値 |
volume | 出来高 |
amount | 売買代金 |
adjustflag | 調整フラグ |
分足には指数データやバリュエーション指標(peTTMなど)は含まれません。
2. 指数のK線
指数コードを指定し、同じquery_history_k_data_plus() APIを使用します。
| 指数 | コード |
|---|---|
| SSE総合指数 | sh.000001 |
| SZSE成分指数 | sz.399001 |
| CSI 300 | sh.000300 |
| CSI 500 | sh.000905 |
| ChiNext指数 | sz.399006 |
指数は分足に対応しておらず、日足/週足/月足のみ利用できます。
3. 指定日の全証券:query_all_stock()
rs = bs.query_all_stock(day="2024-12-31")
# Returns: code, tradeStatus columns
II. 基本情報
4. 株式の基本情報:query_stock_basic()
rs = bs.query_stock_basic(code="sh.600000") # Single stock
rs = bs.query_stock_basic() # All stocks
戻り値:code、code_name、ipoDate、outDate、type(1=株式、2=指数、3=その他、4=転換社債、5=ETF)、status(1=上場、0=上場廃止)
5. 業種分類:query_stock_industry()
rs = bs.query_stock_industry(date="2024-12-31") # Specific date
rs = bs.query_stock_industry() # Latest
戻り値:updateDate、code、code_name、industry、industryClassification
CSRC業種分類基準を使用します。
6. SSE 50 構成銘柄:query_sz50_stocks()
rs = bs.query_sz50_stocks(date="2024-12-31")
戻り値:updateDate、code、code_name
7. CSI 300 構成銘柄:query_hs300_stocks()
rs = bs.query_hs300_stocks(date="2024-12-31")
8. CSI 500 構成銘柄:query_zz500_stocks()
rs = bs.query_zz500_stocks(date="2024-12-31")
III. 配当と調整
9. 配当情報:query_dividend_data()
rs = bs.query_dividend_data(
code="sh.600000",
year="2024",
yearType="report", # "report"=announcement year, "operate"=ex-dividend year
)
戻り値:
| フィールド | 説明 |
|---|---|
dividPreNoticeDate | 事前告知日 |
dividAgmPumDate | 株主総会発表日 |
dividPlanAnnounceDate | 配当案発表日 |
dividPlanDate | 実施発表日 |
dividRegistDate | 権利確定日 |
dividOperateDate | 権利落ち日 |
dividPayDate | 支払日 |
dividStockMarketDate | 株式上場日 |
dividCashPsBeforeTax | 1株当たり現金配当(税引前) |
dividCashPsAfterTax | 1株当たり現金配当(税引後) |
dividStocksPs | 1株当たり株式配当 |
dividCashStock | 配当・振替情報 |
dividReserveToStockPs | 1株当たり準備金の株式転換額 |
10. 調整係数:query_adjust_factor()
rs = bs.query_adjust_factor(
code="sh.600000",
start_date="2015-01-01",
end_date="2024-12-31",
)
戻り値:code、dividOperateDate、foreAdjustFactor、backAdjustFactor、adjustFactor
IV. 四半期財務データ
すべての四半期 API で、同じパラメーターを使用します。
rs = bs.query_xxx_data(code="sh.600000", year=2024, quarter=2)
code:株式コードyear:会計年度(整数)quarter:四半期(1/2/3/4)
11. 収益性:query_profit_data()
戻り値:
| フィールド | 説明 |
|---|---|
code | 株式コード |
pubDate | 公表日 |
statDate | 統計期間終了日 |
roeAvg | ROE(平均、%) |
npMargin | 純利益率(%) |
gpMargin | 売上総利益率(%) |
netProfit | 純利益(CNY) |
epsTTM | 1株当たり利益 |
MBRevenue | 主力事業の売上高(CNY) |
totalShare | 発行済み株式総数 |
liqaShare | 流通株式数 |
12. 営業効率:query_operation_data()
戻り値:NRTurnRatio(売掛金回転率)、NRTurnDays、INVTurnRatio(在庫回転率)、INVTurnDays、CATurnRatio(流動資産回転率)、AssetTurnRatio(総資産回転率)
13. 成長性:query_growth_data()
戻り値:YOYEquity(株主資本の前年比)、YOYAsset(資産の前年比)、YOYNI(純利益の前年比)、YOYEPSBasic(基本 EPS の前年比)、YOYPNI(親会社株主に帰属する純利益の前年比)
14. 支払能力:query_balance_data()
戻り値:currentRatio、quickRatio、cashRatio、YOYLiability、liabilityToAsset、assetToEquity
15. キャッシュフロー:query_cash_flow_data()
戻り値:CAToAsset、NCAToAsset、tangibleAssetToAsset、ebitToInterest、CFOToOR、CFOToNP、CFOToGr
16. デュポン分析:query_dupont_data()
戻り値:dupontROE、dupontAssetSto498(株主資本倍率)、dupontAssetTurn、dupontPnitoni、dupontNitogr、dupontTaxBurden、dupontIntburden、dupontEbittogr
17. 業績速報:query_performance_express_report()
戻り値:performanceExpPubDate、performanceExpStatDate、performanceExpRevenue、performanceExpDeductedNP、performanceExpNetProfit、performanceExpEPSChgPct、performanceExpROEChgPct など
18. 業績予想:query_forecast_report()
戻り値:profitForcastExpPubDate、profitForcastExpStatDate、profitForcastType(増益/減益/黒字転換/初の赤字/黒字継続/赤字継続/小幅増益/小幅減益/不確実)、profitForcastAbstract、profitForcastChgPctUp、profitForcastChgPctDwn
V. マクロ経済データ
19. 預金金利:query_deposit_rate_data()
rs = bs.query_deposit_rate_data(start_date="2020-01-01", end_date="2024-12-31")
戻り値:pubDate、depositType、depositRate
20. 貸出金利:query_loan_rate_data()
rs = bs.query_loan_rate_data(start_date="2020-01-01", end_date="2024-12-31")
戻り値:pubDate、loanType、loanRate
21. 預金準備率:query_required_reserve_ratio_data()
rs = bs.query_required_reserve_ratio_data(start_date="2020-01-01", end_date="2024-12-31")
戻り値:pubDate、effectiveDate、deposit(大手機関)、smallDeposit(小規模機関)
22. マネーサプライ(月次):query_money_supply_data_month()
rs = bs.query_money_supply_data_month(start_date="2020-01", end_date="2024-12")
戻り値:statYear、statMonth、m0Month、m0YOY、m0ChainRelative、m1Month、m1YOY、m1ChainRelative、m2Month、m2YOY、m2ChainRelative
23. マネーサプライ(年次):query_money_supply_data_year()
rs = bs.query_money_supply_data_year(start_date="2020", end_date="2024")
戻り値:statYear、m0、m1、m2
よくある注意点
1. すべての戻り値は文字列です
BaoStock はすべてのフィールドを文字列として返します。手動で変換する必要があります。
df["close"] = pd.to_numeric(df["close"], errors="coerce")
2. 取引停止日は売買回転率が空文字列になります
取引停止日は売買回転率として "" が返されます。直接 float() に変換すると失敗します。
df["turn"] = pd.to_numeric(df["turn"], errors="coerce") # "" → NaN
3. pandas 2.0 以降との互換性
BaoStock は内部で、pandas 2.0 以降で削除された DataFrame.append() を使用しています。データを手動で収集する必要があります。
# BAD: rs.get_data() crashes on pandas 2.0+
df = rs.get_data()
# GOOD: Manual collection
rows = []
while (rs.error_code == "0") and rs.next():
rows.append(rs.get_row_data())
df = pd.DataFrame(rows, columns=rs.fields)
4. login/logout は標準出力にメッセージを表示します
BaoStock の login() と logout() は標準出力にメッセージを表示します。次のように抑制します。
import os, contextlib
with open(os.devnull, "w") as devnull:
with contextlib.redirect_stdout(devnull):
bs.login()
5. 分足の time フィールド形式
分足の time フィールドは YYYYMMDDHHmmssSSS(17 桁の文字列)です。
# "20240102093500000" → "2024-01-02 09:35:00"
t = "20240102093500000"
dt = f"{t[:4]}-{t[4:6]}-{t[6:8]} {t[8:10]}:{t[10:12]}:{t[12:14]}"
6. 調整方法は他のプラットフォームと異なります
BaoStock は騰落率による調整方法を使用しているため、Tongdaxin の固定小数点方式と比べて絶対価格にわずかな差が生じます。
7. 接続が切断された場合は再ログインが必要です
ネットワークの中断後や長時間アイドル状態が続いた後は、BaoStock の接続が失効することがあります。再試行と再ログインのロジックを追加します。
try:
rs = bs.query_history_k_data_plus(...)
except Exception:
bs.logout()
bs.login()
rs = bs.query_history_k_data_plus(...) # Retry
8. 指数は分足に対応していません
指数コード(例:sh.000001)は、分足の頻度ではエラーを返さずに空のデータを返します。
9. ETF の対応範囲は限定的です
BaoStock の ETF データの対応範囲は限定的です。ETF の相場情報には、pytdx または tushare の使用を検討してください。
公式リソース
- ウェブサイト:https://www.baostock.com
- API ドキュメント:https://www.baostock.com/mainContent?file=pythonAPI.md
- GitHub:https://github.com/baostock/baostock
- PyPI:
pip install baostock