Skill: jasonpro22/baostock-tt-skills (version 1.0.1)

--- name: BaoStock 金融数据 description: 获取A股历史K线数据、季频财务数据、宏观经济数据、板块成分股等 read_when: - 获取股票历史K线数据 - 查询财务数据基本面 - 获取宏观经济数据 - 查询板块成分股 metadata: {"clawdbot":{"emoji":"📈","requires":{"bins":["python3","pip"],"packages":["baostock"]}}} allowed-tools: Bash(baostock:*) --- # BaoStock 金融数据技能 > 调用免费开源的A股金融数据平台 - 无需注册即可获取历史K线、财务数据、宏观数据 ## 安装 ```bash pip install baostock ``` ## 快速开始 ```python 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线数据 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" ) # 转换为DataFrame data_list = [] while (rs.error_code == '0') & rs.next(): data_list.append(rs.get_row_data()) result = pd.DataFrame(data_list, columns=rs.fields) print(result) # 登出系统 bs.logout() ``` ## API 清单 ### 1. 登录与登出 | 函数 | 说明 | |------|------| | `login()` | 登录系统 | | `logout()` | 登出系统 | ### 2. 历史K线数据 | 函数 | 说明 | |------|------| | `query_history_k_data_plus()` | 获取历史A股K线数据（日/周/月/分钟线） | **参数说明：** - `code`: 股票代码（sh.600000 或 sz.000001） - `fields`: 指标列表，逗号分隔 - `start_date`: 开始日期（YYYY-MM-DD） - `end_date`: 结束日期（YYYY-MM-DD） - `frequency`: 数据类型（d=日线, w=周线, m=月线, 5/15/30/60=分钟线） - `adjustflag`: 复权类型（1=后复权, 2=前复权, 3=不复权） **常用指标：** ``` date,code,open,high,low,close,volume,amount,adjustflag,turn,tradestatus,pctChg peTTM,pbMRQ,psTTM,pcfNcfTTM,isST ``` ### 3. 除权除息信息 | 函数 | 说明 | |------|------| | `query_dividend_data()` | 查询除权除息信息 | **参数：** - `code`: 股票代码 - `year`: 年份 - `yearType`: 年份类型（report=预案公告年份, operate=除权除息年份） ### 4. 复权因子 | 函数 | 说明 | |------|------| | `query_adjust_factor()` | 查询复权因子信息 | **参数：** - `code`: 股票代码 - `start_date`: 开始日期 - `end_date`: 结束日期 ### 5. 季频财务数据 | 函数 | 说明 | |------|------| | `query_profit_data()` | 季频盈利能力 | | `query_operation_data()` | 季频营运能力 | | `query_growth_data()` | 季频成长能力 | | `query_balance_data()` | 季频偿债能力 | | `query_cash_flow_data()` | 季频现金流量 | | `query_dupont_data()` | 季频杜邦指数 | **参数：** - `code`: 股票代码 - `year`: 统计年份 - `quarter`: 统计季度（1/2/3/4） **主要返回字段：** - 盈利能力：roeAvg, npMargin, gpMargin, netProfit, epsTTM - 营运能力：NRTurnRatio, INVTurnRatio, CATurnRatio - 成长能力：YOYEquity, YOYNI, YOYEPSBasic - 偿债能力：currentRatio, quickRatio, cashRatio - 现金流量：CAToAsset, CFOToOR, CFOToNP ### 6. 季频公司报告 | 函数 | 说明 | |------|------| | `query_performance_express_report()` | 季频业绩快报 | | `query_forecast_report()` | 季频业绩预告 | ### 7. 证券基本资料 | 函数 | 说明 | |------|------| | `query_stock_basic()` | 证券基本资料 | **参数：** - `code`: 股票代码（可选） - `code_name`: 股票名称（支持模糊查询） **返回字段：** - code, code_name, ipoDate, outDate, type, status ### 8. 证券元信息 | 函数 | 说明 | |------|------| | `query_trade_dates()` | 交易日查询 | | `query_all_stock()` | 证券代码查询 | ### 9. 宏观经济数据 | 函数 | 说明 | |------|------| | `query_deposit_rate_data()` | 存款利率 | | `query_loan_rate_data()` | 贷款利率 | | `query_required_reserve_ratio_data()` | 存款准备金率 | | `query_money_supply_data_month()` | 货币供应量/月 | | `query_money_supply_data_year()` | 货币供应量/年 | ### 10. 板块数据 | 函数 | 说明 | |------|------| | `query_stock_industry()` | 行业分类 | | `query_sz50_stocks()` | 上证50成分股 | | `query_hs300_stocks()` | 沪深300成分股 | | `query_zz500_stocks()` | 中证500成分股 | ## 股票代码规则 - `sh.xxxxxx` - 上海证券交易所（6位数字） - `sz.xxxxxx` - 深圳证券交易所（6位数字） - `sh.000001` - 上证指数 - `sh.000300` - 沪深300指数 ## ⚠️ 股票筛选默认规则 (重要) > **"全市场扫描" = 全部A股股票 ，不包括沪深300/上证50/中证500等成分股** > > 除非特别指明"沪深300"、"上证50"，否则默认都是全部A股 | 字段 | 值 | 说明 | |------|-----|------| | `type` | `1` | 仅A股股票 (排除指数/ETF/可转债) | | `status` | `1` | 仅上市状态 (排除退市/停牌) | ```python # 获取上市中的A股股票列表 (全市场) rs = bs.query_stock_basic() data = [] while rs.next(): data.append(rs.get_row_data()) df = pd.DataFrame(data, columns=rs.fields) stocks = df[(df['type'] == '1') & (df['status'] == '1')] # 约 5,191 只A股 (全市场) # 仅沪深300成分股 (需特别指明) rs = bs.query_hs300_stocks() ``` ## ⚠️ 全市场扫描执行规则 > 全市场扫描 (5,000+股票) 耗时长，**必须提示用户确认后再执行** ### 执行流程 1. **提示用户** → 显示扫描范围、预估时间 2. **等待确认** → 用户确认后才开始执行 3. **分批执行** → 每50只显示进度，避免被限流 4. **完成后汇总** → 输出结果列表 ### 提示语示例 ``` ⚠️ 即将进行全市场扫描 - 扫描范围：全部A股股票 - 预估时间：约30-60分钟 - 扫描进行中，请稍候... ``` / ## 示例代码 ### 获取单只股票K线 ```python import baostock as bs import pandas as pd lg = bs.login() # 获取浦发银行日K线 rs = bs.query_history_k_data_plus( "sh.600000", "date,code,open,high,low,close,volume,amount,pctChg", start_date='2024-01-01', end_date='2024-12-31' ) data_list = [] while (rs.error_code == '0') & rs.next(): data_list.append(rs.get_row_data()) df = pd.DataFrame(data_list, columns=rs.fields) print(df) bs.logout() ``` ### 获取多只股票基本资料 ```python import baostock as bs lg = bs.login() # 获取所有股票 rs = bs.query_stock_basic() while rs.next(): print(rs.get_row_data()) bs.logout() ``` ### 获取财务数据 ```python import baostock as bs lg = bs.login() # 获取浦发银行2024年Q2盈利能力 rs = bs.query_profit_data(code="sh.600000", year=2024, quarter=2) while rs.next(): print(rs.get_row_data()) bs.logout() ``` ### 获取板块成分股 ```python import baostock as bs lg = bs.login() # 获取上证50成分股 rs = bs.query_sz50_stocks() while rs.next(): print(rs.get_row_data()) bs.logout() ``` ## 注意事项 1. **无需注册** - BaoStock 免费使用，无需注册 2. **数据范围** - 支持1990年至今的历史数据 3. **更新频率** - 日K线盘后更新 4. **复权说明** - 使用涨跌幅复权法，与同花顺/通达信可能有差异 5. **频率限制** - 请勿频繁请求，建议添加适当延时 --- ## 技术分析 (MyTT 集成) > 本技能集成了 MyTT 技术分析库，当用户说"分析xxx的技术面"时，自动调用技术分析功能。 ### 使用方式 | 用户输入 | 系统行为 | |----------|----------| | "分析中金黄金的技术面" | 调用 baostock + MyTT → 输出标准化技术分析报告 | | "查询中金黄金的K线数据" | 仅调用 baostock → 输出原始K线数据（不经过MyTT） | ### 标准分析报告格式 当用户要求技术分析时，必须输出以下标准化格式： #### 1. 均线系统 - MA5, MA10, MA20, MA30, MA60 - 均线方向判断（↗上涨/↘下跌/→持平） - 金叉/死叉/多头/空头信号 #### 2. MACD 指标 - DIF, DEA, MACD 三个值 - 金叉/死叉判断 - 多头/空头判断 #### 3. KDJ 指标 - K, D, J 三个值 - 超买/超卖判断（K>80超买，K<20超卖） - 金叉/死叉判断 #### 4. RSI 指标 - RSI 值 - 强弱判断（>70超买，<30超卖，50中性） #### 5. BOLL 布林带 - 上轨、中轨、下轨 - 股价位置判断（突破上轨/跌破下轨/在中轨附近） #### 6. 综合判断 - 短期评分 (1-5星) - 中期评分 (1-5星) - 操作建议 ### 技术分析脚本 ```bash # 命令行使用 python3 scripts/technical_analysis.py sh.600489 # 或指定其他股票 python3 scripts/technical_analysis.py sz.000001 ``` ### 输出示例 ``` 📈 中金黄金 (sh.600489) 技术分析报告 更新时间: 2026-03-14 22:13:42 ============================================================ 【均线系统】 ├── MA5: 31.47 元 (方向: ↘) ├── MA10: 32.17 元 (方向: ↘) ├── MA20: 31.39 元 (方向: ↗) ├── MA30: 32.28 元 (方向: ↗) ├── MA60: 28.35 元 (方向: ↗) └── 信号: MA5<MA10 死叉, MA20>MA60 多头 【MACD指标】 ├── DIF: 0.4310 ├── DEA: 0.7290 └── MACD: -0.5960 信号: 空头 死叉 【KDJ指标】 ├── K: 24.53 ├── D: 34.17 └── J: 5.26 信号: 死叉, 超卖 【RSI指标】 ├── RSI(6): 52.08 ├── RSI(12): 52.08 └── RSI(24): 52.08 信号: 偏强 【BOLL布林带】 ├── 上轨: 33.93 ├── 中轨: 31.39 └── 下轨: 28.84 信号: 在中轨附近 【综合判断】 ├── 短期: ⭐⭐ (2/5) ├── 中期: ⭐⭐⭐⭐ (4/5) └── 建议: 中性震荡 ============================================================ 数据来源: BaoStock + MyTT ``` ### 可用技术指标 (完整列表) 本技能集成了以下 MyTT 指标函数： | 分类 | 指标 | 说明 | |------|------|------| | 趋势 | MACD | 指数平滑异同移动平均线 | | 趋势 | DMI | 动向指标 | | 趋势 | TRIX | 三重指数平滑平均线 | | 趋势 | EXPMA | EMA指数平均数 | | 趋势 | BBI | 多空指标 | | 均线 | MA | 简单移动平均 | | 均线 | EMA | 指数移动平均 | | 均线 | SMA | 中国式SMA | | 超买超卖 | KDJ | 随机指标 | | 超买超卖 | RSI | 相对强弱指标 | | 超买超卖 | WR | 威廉指标 | | 超买超卖 | CCI |顺势指标 | | 超买超卖 | ROC | 变动率指标 | | 超买超卖 | MTM | 动量指标 | | 通道 | BOLL | 布林带 | | 通道 | KTN | 肯特纳交易通道 | | 通道 | TAQ | 唐安奇通道 | | 能量 | OBV | 能量潮 | | 能量 | VR | 容量比率 | | 能量 | MFI | 资金流量指标 | | 能量 | ASI | 振动升降指标 | | 能量 | EMV | 简易波动指标 | | 形态 | BRAR | 情绪指标 | | 形态 | PSY | 心理线 | | 形态 | DPO | 区间震荡线 |

path: README.md
content: # BaoStock 金融数据技能

调用免费开源的A股金融数据平台BaoStock，无需注册即可获取历史K线、财务数据、宏观数据。

## 功能

- 历史K线数据（日/周/月/分钟线）
- 季频财务数据（盈利、营运、成长、偿债、现金流、杜邦）
- 季频公司报告（业绩快报、业绩预告）
- 证券基本资料
- 交易日/证券代码查询
- 宏观经济数据（存贷款利率、准备金率、货币供应量）
- 板块数据（行业分类、指数成分股）

## 安装

```bash
pip install baostock
```

## 使用示例

### 获取股票K线

```python
import baostock as bs
import pandas as pd

lg = bs.login()
rs = bs.query_history_k_data_plus("sh.600000", "date,code,open,high,low,close", 
                                   start_date='2024-01-01', end_date='2024-12-31')
data_list = []
while (rs.error_code == '0') & rs.next():
    data_list.append(rs.get_row_data())
df = pd.DataFrame(data_list, columns=rs.fields)
print(df)
bs.logout()
```

### 获取财务数据

```python
import baostock as bs

lg = bs.login()
rs = bs.query_profit_data(code="sh.600000", year=2024, quarter=2)
while rs.next():
    print(rs.get_row_data())
bs.logout()
```

## 股票代码

- `sh.600000` - 上海股票
- `sz.000001` - 深圳股票
- `sh.000001` - 上证指数


path: requirements.txt
content: baostock>=0.8.0
pandas>=1.5.0

path: _meta.json
content: {
  "name": "baostock_tt_skills",
  "description": "BaoStock 金融数据API和 myTT公式函数 技能 - A股历史K线、财务数据、宏观经济数据获取",
  "metadata": {
    "version": "1.0.0",
    "author": "JacksonLiang",
    "tags": ["金融", "A股", "K线", "财报", "量化"],
    "requires": {
      "bins": ["python3", "pip"]
    }
  }
}


path: scripts/MyTT.py
content: # MyTT 麦语言-通达信-同花顺指标实现     https://github.com/mpquant/MyTT
# Python2老版本pandas特别的MyTT：      https://github.com/mpquant/MyTT/blob/main/MyTT_python2.py 
# V2.1 2021-6-6   新增 BARSLAST函数
# V2.2 2021-6-8   新增 SLOPE,FORCAST线性回归，和回归预测函数
# V2.3 2021-6-13  新增 TRIX,DPO,BRAR,DMA,MTM,MASS,ROC,VR,ASI等指标
# V2.4 2021-6-27  新增 EXPMA,OBV,MFI指标, 改进SMA核心函数(核心函数彻底无循环)
# V2.5 2021-8-14  修正 CROSS穿越函数逻辑和通达信一致
# V2.6 2021-10-23 修正 SMA函数 DMA函数
  
import numpy as np; import pandas as pd

#------------------ 0级：核心工具函数 --------------------------------------------      
def RD(N,D=3):   return np.round(N,D)        #四舍五入取3位小数 
def RET(S,N=1):  return np.array(S)[-N]      #返回序列倒数第N个值,默认返回最后一个
def ABS(S):      return np.abs(S)            #返回N的绝对值
def MAX(S1,S2):  return np.maximum(S1,S2)    #序列max
def MIN(S1,S2):  return np.minimum(S1,S2)    #序列min
         
def MA(S,N):              #求序列的N日平均值，返回序列                    
    return pd.Series(S).rolling(N).mean().values    

def REF(S, N=1):          #对序列整体下移动N,返回序列(shift后会产生NAN)    
    return pd.Series(S).shift(N).values  

def DIFF(S, N=1):         #前一个值减后一个值,前面会产生nan 
    return pd.Series(S).diff(N)  #np.diff(S)直接删除nan，会少一行

def STD(S,N):             #求序列的N日标准差，返回序列    
    return  pd.Series(S).rolling(N).std(ddof=0).values     

def IF(S_BOOL,S_TRUE,S_FALSE):   #序列布尔判断 return=S_TRUE if S_BOOL==True  else  S_FALSE
    return np.where(S_BOOL, S_TRUE, S_FALSE)

def SUM(S, N):            #对序列求N天累计和，返回序列    N=0对序列所有依次求和         
    return pd.Series(S).rolling(N).sum().values if N>0 else pd.Series(S).cumsum()  

def HHV(S,N):             # HHV(C, 5)  # 最近5天收盘最高价        
    return pd.Series(S).rolling(N).max().values     

def LLV(S,N):             # LLV(C, 5)  # 最近5天收盘最低价     
    return pd.Series(S).rolling(N).min().values    

def EMA(S,N):             #指数移动平均,为了精度 S>4*N  EMA至少需要120周期     alpha=2/(span+1)    
    return pd.Series(S).ewm(span=N, adjust=False).mean().values     

def SMA(S, N, M=1):       #中国式的SMA,至少需要120周期才精确 (雪球180周期)    alpha=1/(1+com)    
    return pd.Series(S).ewm(alpha=M/N,adjust=True).mean().values           #com=N-M/M

def DMA(S, A):            #求S的动态移动平均，A作平滑因子   (此为核心函数，非指标）
    return pd.Series(S).ewm(alpha=A, adjust=False).mean().values
  
def AVEDEV(S,N):           #平均绝对偏差  (序列与其平均值的绝对差的平均值)   
    return pd.Series(S).rolling(N).apply(lambda x: (np.abs(x - x.mean())).mean()).values 

def SLOPE(S,N,RS=False):    #返S序列N周期回线性回归斜率 (默认只返回斜率,不返回整个直线序列)
    M=pd.Series(S[-N:]);   poly = np.polyfit(M.index, M.values,deg=1);    Y=np.polyval(poly, M.index); 
    if RS: return Y[1]-Y[0],Y
    return Y[1]-Y[0]

  
#------------------   1级：应用层函数(通过0级核心函数实现） ----------------------------------
def COUNT(S_BOOL, N):                  # COUNT(CLOSE>O, N):  最近N天满足S_BOO的天数  True的天数
    return SUM(S_BOOL,N)    

def EVERY(S_BOOL, N):                  # EVERY(CLOSE>O, 5)   最近N天是否都是True
    R=SUM(S_BOOL, N)
    return  IF(R==N, True, False)
  
def LAST(S_BOOL, A, B):                #从前A日到前B日一直满足S_BOOL条件   
    if A<B: A=B                        #要求A>B    例：LAST(CLOSE>OPEN,5,3)  5天前到3天前是否都收阳线     
    return S_BOOL[-A:-B].sum()==(A-B)  #返回单个布尔值    

def EXIST(S_BOOL, N=5):                # EXIST(CLOSE>3010, N=5)  n日内是否存在一天大于3000点
    R=SUM(S_BOOL,N)    
    return IF(R>0, True ,False)

def BARSLAST(S_BOOL):                  #上一次条件成立到当前的周期  
    M=np.argwhere(S_BOOL);             # BARSLAST(CLOSE/REF(CLOSE)>=1.1) 上一次涨停到今天的天数
    return len(S_BOOL)-int(M[-1])-1  if M.size>0 else -1

def FORCAST(S,N):                      #返S序列N周期回线性回归后的预测值
    K,Y=SLOPE(S,N,RS=True)
    return Y[-1]+K
  
def CROSS(S1,S2):                      #判断向上金叉穿越 CROSS(MA(C,5),MA(C,10))     判断向下死叉穿越 CROSS(MA(C,10),MA(C,5))
    CROSS_BOOL=IF(S1>S2, True ,False) 
    return (COUNT(CROSS_BOOL>0,2)==1)*CROSS_BOOL #上穿：昨天0 今天1   下穿：昨天1 今天0

  
#------------------   2级：技术指标函数(全部通过0级，1级函数实现） ------------------------------
def MACD(CLOSE,SHORT=12,LONG=26,M=9):             # EMA的关系，S取120日，和雪球小数点2位相同
    DIF = EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);  
    DEA = EMA(DIF,M);      MACD=(DIF-DEA)*2
    return RD(DIF),RD(DEA),RD(MACD)

def KDJ(CLOSE,HIGH,LOW, N=9,M1=3,M2=3):           # KDJ指标
    RSV = (CLOSE - LLV(LOW, N)) / (HHV(HIGH, N) - LLV(LOW, N)) * 100
    K = EMA(RSV, (M1*2-1));    D = EMA(K,(M2*2-1));        J=K*3-D*2
    return K, D, J

def RSI(CLOSE, N=24):                           # RSI指标,和通达信小数点2位相同
    DIF = CLOSE-REF(CLOSE,1) 
    return RD(SMA(MAX(DIF,0), N) / SMA(ABS(DIF), N) * 100)  

def WR(CLOSE, HIGH, LOW, N=10, N1=6):            #W&R 威廉指标
    WR = (HHV(HIGH, N) - CLOSE) / (HHV(HIGH, N) - LLV(LOW, N)) * 100
    WR1 = (HHV(HIGH, N1) - CLOSE) / (HHV(HIGH, N1) - LLV(LOW, N1)) * 100
    return RD(WR), RD(WR1)

def BIAS(CLOSE,L1=6, L2=12, L3=24):              # BIAS乖离率
    BIAS1 = (CLOSE - MA(CLOSE, L1)) / MA(CLOSE, L1) * 100
    BIAS2 = (CLOSE - MA(CLOSE, L2)) / MA(CLOSE, L2) * 100
    BIAS3 = (CLOSE - MA(CLOSE, L3)) / MA(CLOSE, L3) * 100
    return RD(BIAS1), RD(BIAS2), RD(BIAS3)

def BOLL(CLOSE,N=20, P=2):                       #BOLL指标，布林带    
    MID = MA(CLOSE, N); 
    UPPER = MID + STD(CLOSE, N) * P
    LOWER = MID - STD(CLOSE, N) * P
    return RD(UPPER), RD(MID), RD(LOWER)    

def PSY(CLOSE,N=12, M=6):  
    PSY=COUNT(CLOSE>REF(CLOSE,1),N)/N*100
    PSYMA=MA(PSY,M)
    return RD(PSY),RD(PSYMA)

def CCI(CLOSE,HIGH,LOW,N=14):  
    TP=(HIGH+LOW+CLOSE)/3
    return (TP-MA(TP,N))/(0.015*AVEDEV(TP,N))
        
def ATR(CLOSE,HIGH,LOW, N=20):                    #真实波动N日平均值
    TR = MAX(MAX((HIGH - LOW), ABS(REF(CLOSE, 1) - HIGH)), ABS(REF(CLOSE, 1) - LOW))
    return MA(TR, N)

def BBI(CLOSE,M1=3,M2=6,M3=12,M4=20):             #BBI多空指标   
    return (MA(CLOSE,M1)+MA(CLOSE,M2)+MA(CLOSE,M3)+MA(CLOSE,M4))/4    

def DMI(CLOSE,HIGH,LOW,M1=14,M2=6):               #动向指标：结果和同花顺，通达信完全一致
    TR = SUM(MAX(MAX(HIGH - LOW, ABS(HIGH - REF(CLOSE, 1))), ABS(LOW - REF(CLOSE, 1))), M1)
    HD = HIGH - REF(HIGH, 1);     LD = REF(LOW, 1) - LOW
    DMP = SUM(IF((HD > 0) & (HD > LD), HD, 0), M1)
    DMM = SUM(IF((LD > 0) & (LD > HD), LD, 0), M1)
    PDI = DMP * 100 / TR;         MDI = DMM * 100 / TR
    ADX = MA(ABS(MDI - PDI) / (PDI + MDI) * 100, M2)
    ADXR = (ADX + REF(ADX, M2)) / 2
    return PDI, MDI, ADX, ADXR  

def TAQ(HIGH,LOW,N):                               #唐安奇通道(海龟)交易指标，大道至简，能穿越牛熊
    UP=HHV(HIGH,N);    DOWN=LLV(LOW,N);    MID=(UP+DOWN)/2
    return UP,MID,DOWN

def KTN(CLOSE,HIGH,LOW,N=20,M=10):                 #肯特纳交易通道, N选20日，ATR选10日
    MID=EMA((HIGH+LOW+CLOSE)/3,N)
    ATRN=ATR(CLOSE,HIGH,LOW,M)
    UPPER=MID+2*ATRN;   LOWER=MID-2*ATRN
    return UPPER,MID,LOWER       
  
def TRIX(CLOSE,M1=12, M2=20):                      #三重指数平滑平均线
    TR = EMA(EMA(EMA(CLOSE, M1), M1), M1)
    TRIX = (TR - REF(TR, 1)) / REF(TR, 1) * 100
    TRMA = MA(TRIX, M2)
    return TRIX, TRMA

def VR(CLOSE,VOL,M1=26):                            #VR容量比率
    LC = REF(CLOSE, 1)
    return SUM(IF(CLOSE > LC, VOL, 0), M1) / SUM(IF(CLOSE <= LC, VOL, 0), M1) * 100

def EMV(HIGH,LOW,VOL,N=14,M=9):                     #简易波动指标 
    VOLUME=MA(VOL,N)/VOL;       MID=100*(HIGH+LOW-REF(HIGH+LOW,1))/(HIGH+LOW)
    EMV=MA(MID*VOLUME*(HIGH-LOW)/MA(HIGH-LOW,N),N);    MAEMV=MA(EMV,M)
    return EMV,MAEMV


def DPO(CLOSE,M1=20, M2=10, M3=6):                  #区间震荡线
    DPO = CLOSE - REF(MA(CLOSE, M1), M2);    MADPO = MA(DPO, M3)
    return DPO, MADPO

def BRAR(OPEN,CLOSE,HIGH,LOW,M1=26):                 #BRAR-ARBR 情绪指标  
    AR = SUM(HIGH - OPEN, M1) / SUM(OPEN - LOW, M1) * 100
    BR = SUM(MAX(0, HIGH - REF(CLOSE, 1)), M1) / SUM(MAX(0, REF(CLOSE, 1) - LOW), M1) * 100
    return AR, BR

def DFMA(CLOSE,N1=10,N2=50,M=10):                    #平行线差指标 
    DIF=MA(CLOSE,N1)-MA(CLOSE,N2); DIFMA=MA(DIF,M)   #通达信指标叫DMA 同花顺叫新DMA
    return DIF,DIFMA

def MTM(CLOSE,N=12,M=6):                             #动量指标
    MTM=CLOSE-REF(CLOSE,N);         MTMMA=MA(MTM,M)
    return MTM,MTMMA

def MASS(HIGH,LOW,N1=9,N2=25,M=6):                   # 梅斯线
    MASS=SUM(MA(HIGH-LOW,N1)/MA(MA(HIGH-LOW,N1),N1),N2)
    MA_MASS=MA(MASS,M)
    return MASS,MA_MASS
  
def ROC(CLOSE,N=12,M=6):                             #变动率指标
    ROC=100*(CLOSE-REF(CLOSE,N))/REF(CLOSE,N);    MAROC=MA(ROC,M)
    return ROC,MAROC  

def EXPMA(CLOSE,N1=12,N2=50):                        #EMA指数平均数指标
    return EMA(CLOSE,N1),EMA(CLOSE,N2);

def OBV(CLOSE,VOL):                                  #能量潮指标
    return SUM(IF(CLOSE>REF(CLOSE,1),VOL,IF(CLOSE<REF(CLOSE,1),-VOL,0)),0)/10000

def MFI(CLOSE,HIGH,LOW,VOL,N=14):                    #MFI指标是成交量的RSI指标
    TYP = (HIGH + LOW + CLOSE)/3
    V1=SUM(IF(TYP>REF(TYP,1),TYP*VOL,0),N)/SUM(IF(TYP<REF(TYP,1),TYP*VOL,0),N)  
    return 100-(100/(1+V1))     
  
def ASI(OPEN,CLOSE,HIGH,LOW,M1=26,M2=10):            #振动升降指标
    LC=REF(CLOSE,1);      AA=ABS(HIGH-LC);     BB=ABS(LOW-LC);
    CC=ABS(HIGH-REF(LOW,1));   DD=ABS(LC-REF(OPEN,1));
    R=IF( (AA>BB) & (AA>CC),AA+BB/2+DD/4,IF( (BB>CC) & (BB>AA),BB+AA/2+DD/4,CC+DD/4));
    X=(CLOSE-LC+(CLOSE-OPEN)/2+LC-REF(OPEN,1));
    SI=16*X/R*MAX(AA,BB);   ASI=SUM(SI,M1);   ASIT=MA(ASI,M2);
    return ASI,ASIT   

  
  #望大家能提交更多指标和函数  https://github.com/mpquant/MyTT

  
  


path: scripts/technical_analysis.py
content: #!/usr/bin/env python3
"""
BaoStock + MyTT 技术分析集成脚本
标准化输出：MA(5,10,20,30,60) + MACD + KDJ + RSI + BOLL
"""
import baostock as bs
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import sys
import os

# 添加当前目录到路径以便导入 MyTT
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from MyTT import MA, EMA, MACD as MyMACD, KDJ as MyKDJ, RSI as MyRSI, BOLL as MyBOLL, REF, HHV, LLV

def get_stock_name(code):
    """获取股票名称"""
    lg = bs.login()
    rs = bs.query_stock_basic(code=code)
    name = code
    while rs.next():
        name = rs.get_row_data()[1]
    bs.logout()
    return name

def get_kline_data(code, days=120):
    """获取K线数据"""
    end_date = datetime.now().strftime('%Y-%m-%d')
    start_date = (datetime.now() - timedelta(days=days+30)).strftime('%Y-%m-%d')
    
    lg = bs.login()
    
    rs = bs.query_history_k_data_plus(
        code,
        "date,open,high,low,close,volume",
        start_date=start_date,
        end_date=end_date,
        frequency="d",
        adjustflag="3"
    )
    
    data_list = []
    while (rs.error_code == '0') & rs.next():
        data_list.append(rs.get_row_data())
    
    bs.logout()
    
    if not data_list:
        return None
    
    df = pd.DataFrame(data_list, columns=['date', 'open', 'high', 'low', 'close', 'volume'])
    
    # 转换为数值类型
    for col in ['open', 'high', 'low', 'close', 'volume']:
        df[col] = pd.to_numeric(df[col], errors='coerce')
    
    return df

def calculate_ma(close):
    """计算均线"""
    ma5 = MA(close, 5)
    ma10 = MA(close, 10)
    ma20 = MA(close, 20)
    ma30 = MA(close, 30)
    ma60 = MA(close, 60)
    return {
        'MA5': ma5[-1] if not np.isnan(ma5[-1]) else None,
        'MA10': ma10[-1] if not np.isnan(ma10[-1]) else None,
        'MA20': ma20[-1] if not np.isnan(ma20[-1]) else None,
        'MA30': ma30[-1] if not np.isnan(ma30[-1]) else None,
        'MA60': ma60[-1] if not np.isnan(ma60[-1]) else None,
    }

def calculate_macd(close):
    """计算MACD"""
    dif, dea, macd = MyMACD(close)
    return {
        'DIF': dif[-1],
        'DEA': dea[-1],
        'MACD': macd[-1]
    }

def calculate_kdj(close, high, low):
    """计算KDJ"""
    k, d, j = MyKDJ(close, high, low)
    return {
        'K': k[-1],
        'D': d[-1],
        'J': j[-1]
    }

def calculate_rsi(close):
    """计算RSI"""
    rsi = MyRSI(close)
    return {
        'RSI6': rsi[-1] if not np.isnan(rsi[-1]) else None,
        'RSI12': rsi[-1] if not np.isnan(rsi[-1]) else None,  # MyTT RSI只有24周期
        'RSI24': rsi[-1] if not np.isnan(rsi[-1]) else None
    }

def calculate_boll(close):
    """计算BOLL"""
    upper, mid, lower = MyBOLL(close)
    return {
        'UPPER': upper[-1],
        'MID': mid[-1],
        'LOWER': lower[-1]
    }

def get_direction(current, previous):
    """判断均线方向"""
    if current is None or previous is None:
        return "→"
    if current > previous:
        return "↗"
    elif current < previous:
        return "↘"
    return "→"

def analyze(code):
    """技术分析主函数"""
    # 获取股票名称
    stock_name = get_stock_name(code)
    print(f"📈 {stock_name} ({code}) 技术分析报告")
    print(f"更新时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print("=" * 60)
    
    # 获取数据
    df = get_kline_data(code)
    if df is None or len(df) < 60:
        print("数据获取失败或数据不足")
        return
    
    close = df['close'].values
    high = df['high'].values
    low = df['low'].values
    
    # ===== 1. 均线系统 =====
    ma = calculate_ma(close)
    ma_prev = {
        'MA5': MA(close, 5)[-2],
        'MA10': MA(close, 10)[-2],
        'MA20': MA(close, 20)[-2],
        'MA30': MA(close, 30)[-2],
        'MA60': MA(close, 60)[-2],
    }
    
    print("\n【均线系统】")
    for key in ['MA5', 'MA10', 'MA20', 'MA30', 'MA60']:
        if ma[key]:
            direction = get_direction(ma[key], ma_prev.get(key))
            print(f"├── {key}: {ma[key]:.2f} 元 (方向: {direction})")
    
    # 均线信号判断
    latest_close = close[-1]
    ma_signals = []
    if ma['MA5'] and ma['MA10'] and ma['MA5'] > ma['MA10']:
        ma_signals.append("MA5>MA10 金叉")
    elif ma['MA5'] and ma['MA10'] and ma['MA5'] < ma['MA10']:
        ma_signals.append("MA5<MA10 死叉")
    if ma['MA20'] and ma['MA60'] and ma['MA20'] > ma['MA60']:
        ma_signals.append("MA20>MA60 多头")
    elif ma['MA20'] and ma['MA60'] and ma['MA20'] < ma['MA60']:
        ma_signals.append("MA20<MA60 空头")
    signal_text = ", ".join(ma_signals) if ma_signals else "震荡整理"
    print(f"└── 信号: {signal_text}")
    
    # ===== 2. MACD =====
    macd = calculate_macd(close)
    print("\n【MACD指标】")
    print(f"├── DIF: {macd['DIF']:.4f}")
    print(f"├── DEA: {macd['DEA']:.4f}")
    print(f"└── MACD: {macd['MACD']:.4f}")
    
    macd_signal = []
    if macd['MACD'] > 0:
        macd_signal.append("多头")
    else:
        macd_signal.append("空头")
    if macd['DIF'] > macd['DEA']:
        macd_signal.append("金叉")
    else:
        macd_signal.append("死叉")
    print(f"    信号: {' '.join(macd_signal)}")
    
    # ===== 3. KDJ =====
    kdj = calculate_kdj(close, high, low)
    print("\n【KDJ指标】")
    print(f"├── K: {kdj['K']:.2f}")
    print(f"├── D: {kdj['D']:.2f}")
    print(f"└── J: {kdj['J']:.2f}")
    
    kdj_signal = []
    if kdj['K'] > kdj['D']:
        kdj_signal.append("金叉")
    else:
        kdj_signal.append("死叉")
    if kdj['J'] > 80:
        kdj_signal.append("超买")
    elif kdj['J'] < 20:
        kdj_signal.append("超卖")
    print(f"    信号: {', '.join(kdj_signal)}")
    
    # ===== 4. RSI =====
    rsi = calculate_rsi(close)
    print("\n【RSI指标】")
    print(f"├── RSI(6): {rsi['RSI6']:.2f}")
    print(f"├── RSI(12): {rsi['RSI12']:.2f}")
    print(f"└── RSI(24): {rsi['RSI24']:.2f}")
    
    avg_rsi = (rsi['RSI6'] + rsi['RSI12'] + rsi['RSI24']) / 3
    if avg_rsi > 70:
        rsi_signal = "超买"
    elif avg_rsi < 30:
        rsi_signal = "超卖"
    elif avg_rsi > 50:
        rsi_signal = "偏强"
    else:
        rsi_signal = "偏弱"
    print(f"    信号: {rsi_signal}")
    
    # ===== 5. BOLL =====
    boll = calculate_boll(close)
    print("\n【BOLL布林带】")
    print(f"├── 上轨: {boll['UPPER']:.2f}")
    print(f"├── 中轨: {boll['MID']:.2f}")
    print(f"└── 下轨: {boll['LOWER']:.2f}")
    
    if latest_close > boll['UPPER']:
        boll_signal = "突破上轨"
    elif latest_close < boll['LOWER']:
        boll_signal = "跌破下轨"
    else:
        boll_signal = "在中轨附近"
    print(f"    信号: {boll_signal}")
    
    # ===== 6. 综合评分 =====
    print("\n【综合判断】")
    
    # 短期评分
    short_score = 0
    if ma['MA5'] and ma['MA10'] and ma['MA5'] > ma['MA10']:
        short_score += 1
    if macd['MACD'] > 0:
        short_score += 1
    if kdj['J'] < 20:
        short_score += 1
    elif kdj['J'] > 80:
        short_score -= 1
    if rsi['RSI6'] > 50:
        short_score += 1
    
    # 中期评分
    mid_score = 0
    if ma['MA20'] and ma['MA60'] and ma['MA20'] > ma['MA60']:
        mid_score += 2
    if macd['DIF'] > 0:
        mid_score += 1
    if avg_rsi > 50:
        mid_score += 1
    if latest_close > boll['MID']:
        mid_score += 1
    
    short_stars = "⭐" * max(1, min(5, short_score))
    mid_stars = "⭐" * max(1, min(5, mid_score))
    
    print(f"├── 短期: {short_stars} ({short_score}/5)")
    print(f"├── 中期: {mid_stars} ({mid_score}/5)")
    
    # 操作建议
    if short_score >= 4 and mid_score >= 4:
        advice = "积极看多"
    elif short_score >= 3 and mid_score >= 3:
        advice = "谨慎看多"
    elif short_score <= 1 and mid_score <= 2:
        advice = "观望为主，等待企稳"
    elif short_score >= 3 and mid_score <= 2:
        advice = "短期反弹，注意风险"
    else:
        advice = "中性震荡"
    
    print(f"└── 建议: {advice}")
    
    print("\n" + "=" * 60)
    print("数据来源: BaoStock + MyTT")

if __name__ == "__main__":
    # 默认分析中金黄金
    code = sys.argv[1] if len(sys.argv) > 1 else "sh.600489"
    analyze(code)


path: scripts/test_stock.py
content: #!/usr/bin/env python3
"""
BaoStock 测试脚本 - 分析股票日K线走势和财务基本面
"""
import baostock as bs
import pandas as pd
from datetime import datetime, timedelta

# 登录系统
print("=" * 60)
print("BaoStock 金融数据测试")
print("=" * 60)

lg = bs.login()
print(f'登录返回: error_code={lg.error_code}, error_msg={lg.error_msg}')

# ============ 1. 获取日K线数据 ============
print("\n" + "=" * 60)
print("一、日K线走势分析 (最近30个交易日)")
print("=" * 60)

# 获取最近30个交易日的数据
end_date = datetime.now().strftime('%Y-%m-%d')
start_date = (datetime.now() - timedelta(days=45)).strftime('%Y-%m-%d')

rs = bs.query_history_k_data_plus(
    "sh.600000",  # 浦发银行
    "date,code,open,high,low,close,volume,amount,pctChg,turn",
    start_date=start_date,
    end_date=end_date,
    frequency="d",
    adjustflag="3"
)

data_list = []
while (rs.error_code == '0') & rs.next():
    data_list.append(rs.get_row_data())

df = pd.DataFrame(data_list, columns=rs.fields)

# 转换为数值类型
for col in ['open', 'high', 'low', 'close', 'volume', 'pctChg', 'turn']:
    df[col] = pd.to_numeric(df[col], errors='coerce')

# 显示最近30个交易日
print(f"\n股票代码: {df['code'].iloc[0]}")
print(f"数据范围: {df['date'].iloc[0]} 至 {df['date'].iloc[-1]}")
print(f"\n最近30个交易日K线数据:")
print(df.tail(30).to_string(index=False))

# 计算技术指标
print("\n--- 技术指标分析 ---")
latest = df.iloc[-1]
prev = df.iloc[-2] if len(df) > 1 else latest

# 涨跌幅
pct_change = latest['pctChg']
print(f"最新收盘价: {latest['close']:.2f}")
print(f"涨跌幅: {pct_change:+.2f}%")

# 成交量变化
vol_change = ((latest['volume'] - prev['volume']) / prev['volume'] * 100) if prev['volume'] > 0 else 0
print(f"成交量: {latest['volume']:,.0f} (较昨日 {vol_change:+.1f}%)")

# 5日/10日均线
if len(df) >= 5:
    ma5 = df['close'].tail(5).mean()
    print(f"5日均线: {ma5:.2f}")
if len(df) >= 10:
    ma10 = df['close'].tail(10).mean()
    print(f"10日均线: {ma10:.2f}")

# 最高/最低
print(f"30日最高: {df['high'].max():.2f}")
print(f"30日最低: {df['low'].min():.2f}")

# ============ 2. 获取财务基本面 ============
print("\n" + "=" * 60)
print("二、财务基本面分析 (最新季度)")
print("=" * 60)

# 获取最新季度财务数据
current_year = datetime.now().year
current_quarter = (datetime.now().month - 1) // 3
if current_quarter == 0:
    current_quarter = 4
    current_year -= 1

print(f"\n查询年份: {current_year}年第{current_quarter}季")

# 盈利能力
print("\---盈利能力---")
rs = bs.query_profit_data(code="sh.600000", year=current_year, quarter=current_quarter)
while rs.next():
    row = rs.get_row_data()
    print(f"净资产收益率(ROE): {row[3]}%")
    print(f"销售净利率: {row[4]}%")
    print(f"销售毛利率: {row[5]}%")
    print(f"净利润: {row[6]}元")
    print(f"每股收益TTM: {row[7]}")

# 成长能力
print("\n---成长能力---")
rs = bs.query_growth_data(code="sh.600000", year=current_year, quarter=current_quarter)
while rs.next():
    row = rs.get_row_data()
    print(f"净资产同比增长率: {row[3]}%")
    print(f"净利润同比增长率: {row[5]}%")
    print(f"基本每股收益同比增长率: {row[6]}%")

# 偿债能力
print("\n---偿债能力---")
rs = bs.query_balance_data(code="sh.600000", year=current_year, quarter=current_quarter)
while rs.next():
    row = rs.get_row_data()
    print(f"流动比率: {row[3]}")
    print(f"速动比率: {row[4]}")
    print(f"现金比率: {row[5]}")
    print(f"资产负债率: {row[8]}%")

# 营运能力
print("\n---营运能力---")
rs = bs.query_operation_data(code="sh.600000", year=current_year, quarter=current_quarter)
while rs.next():
    row = rs.get_row_data()
    print(f"总资产周转率: {row[7]}")

# ============ 3. 证券基本信息 ============
print("\n" + "=" * 60)
print("三、证券基本信息")
print("=" * 60)

rs = bs.query_stock_basic(code="sh.600000")
while rs.next():
    row = rs.get_row_data()
    print(f"证券代码: {row[0]}")
    print(f"证券名称: {row[1]}")
    print(f"上市日期: {row[2]}")
    print(f"退市日期: {row[3]}")
    print(f"证券类型: {row[4]} (1=股票, 2=指数)")
    print(f"上市状态: {row[5]} (1=上市, 0=退市)")

# 登出系统
bs.logout()
print("\n" + "=" * 60)
print("测试完成")
print("=" * 60)


path: docs/python_api_full.txt
content: "首页\nBaostock知识库\n交易技术商城\n统计与数据\n登录\n注册\n平台介绍\nPython API文档\n--A股K线数据\n--PY开发资源\n--指数数据\n--估值指标(日频)\n--除权除息信息\n--复权因子信息\n--季频盈利能力\n--季频营运能力\n--季频成长能力\n--季频偿债能力\n--季频现金流量\n--季频杜邦指数\n--季频业绩快报\n--季频业绩预告\n--证券基本资料\n--存款利率\n--贷款利率\n--存款准备金率\n--货币供应量\n--货币供应量余额\n--行业分类\n--上证50成分股\n--沪深300成分股\n--中证500成分股\n--证券元信息\n公式与数据说明\n数据调整记录\n好文章\n黑名单\nPython API文档\n目录\n1 入门示例\n1.1 HelloWorld\n2 登录\n2.1 login()\n3 登出\n3.1 logout()\n4 获取历史A股K线数据\n4.1 获取历史A股K线数据：query_history_k_data_plus()\n4.2 历史行情指标参数\n5 查询除权除息信息\n5.1 除权除息信息：query_dividend_data()\n6 查询复权因子信息\n6.1 复权因子：query_adjust_factor()\n7 查询季频财务数据信息\n7.1 季频盈利能力：query_profit_data()\n7.2 季频营运能力：query_operation_data()\n7.3 季频成长能力：query_growth_data()\n7.4 季频偿债能力：query_balance_data()\n7.5 季频现金流量：query_cash_flow_data()\n7.6 季频杜邦指数：query_dupont_data()\n8 查询季频公司报告信息\n8.1 季频公司业绩快报：query_performance_express_report()\n8.2 季频公司业绩预告：query_forecast_report()\n9 证券基本资料\n9.1 证券基本资料：query_stock_basic()\n10 获取证券元信息\n10.1 交易日查询：query_trade_dates()\n10.2 证券代码查询：query_all_stock()\n11 宏观经济数据\n11.1 存款利率：query_deposit_rate_data()\n11.2 贷款利率：query_loan_rate_data()\n11.3 存款准备金率：query_required_reserve_ratio_data()\n11.4 货币供应量：query_money_supply_data_month()\n11.5 货币供应量(年底余额)：query_money_supply_data_year()\n12 板块数据\n12.1 行业分类：query_stock_industry()\n12.2 上证50成分股：query_sz50_stocks()\n12.3 沪深300成分股：query_hs300_stocks()\n12.4 中证500成分股：query_zz500_stocks()\n13 示例程序\n13.1 获取指定日期全部股票的日K线数据：query_history_k_data_plus()\n入门示例\nHelloWorld\n\n此篇为平台入门示例，安装baostock后，可导入包运行此示例。示例数据：下载\n\n\nimport baostock as bs\nimport pandas as pd\n\n#### 登陆系统 ####\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n#### 获取历史K线数据 ####\n# 详细指标参数，参见“历史行情指标参数”章节\nrs = bs.query_history_k_data_plus(\"sh.600000\",\n    \"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,pbMRQ,psTTM,pcfNcfTTM,isST\",\n    start_date='2017-06-01', end_date='2017-12-31', \n    frequency=\"d\", adjustflag=\"3\") #frequency=\"d\"取日k线，adjustflag=\"3\"默认不复权\nprint('query_history_k_data_plus respond error_code:'+rs.error_code)\nprint('query_history_k_data_plus respond  error_msg:'+rs.error_msg)\n\n#### 打印结果集 ####\ndata_list = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    data_list.append(rs.get_row_data())\nresult = pd.DataFrame(data_list, columns=rs.fields)\n#### 结果集输出到csv文件 ####\nresult.to_csv(\"D:/history_k_data.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n#### 登出系统 ####\nbs.logout()\n\n\n登录\nlogin()\n\n方法说明：登录系统。\n\n使用示例：lg = login()\n\n返回信息：\n\nlg.error_code：错误代码，当为“0”时表示成功，当为非0时表示失败；\nlg.error_msg：错误信息，对错误的详细解释。\n登出\nlogout()\n\n方法说明：登出系统\n\n使用示例：lg = logout()\n\n返回信息：\n\nlg.error_code：错误代码，当为“0”时表示成功，当为非0时表示失败；\nlg.error_msg：错误信息，对错误的详细解释。\n获取历史A股K线数据\n获取历史A股K线数据：query_history_k_data_plus()\n\n方法说明：通过API接口获取A股历史交易数据，可以通过参数设置获取日k线、周k线、月k线，以及5分钟、15分钟、30分钟和60分钟k线数据，适合搭配均线数据进行选股和分析。\n\n返回类型：pandas的DataFrame类型。\n\n能获取1990-12-19至当前时间的数据；\n\n可查询不复权、前复权、后复权数据。\n\n示例数据：下载\n\n日线使用示例：\n\n\nimport baostock as bs\nimport pandas as pd\n\n#### 登陆系统 ####\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n#### 获取沪深A股历史K线数据 ####\n# 详细指标参数，参见“历史行情指标参数”章节；“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。\n# 分钟线指标：date,time,code,open,high,low,close,volume,amount,adjustflag\n# 周月线指标：date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg\nrs = bs.query_history_k_data_plus(\"sh.600000\",\n    \"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST\",\n    start_date='2024-07-01', end_date='2024-12-31',\n    frequency=\"d\", adjustflag=\"3\")\nprint('query_history_k_data_plus respond error_code:'+rs.error_code)\nprint('query_history_k_data_plus respond  error_msg:'+rs.error_msg)\n\n#### 打印结果集 ####\ndata_list = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    data_list.append(rs.get_row_data())\nresult = pd.DataFrame(data_list, columns=rs.fields)\n\n#### 结果集输出到csv文件 ####   \nresult.to_csv(\"D:\\\\history_A_stock_k_data.csv\", index=False)\nprint(result)\n\n#### 登出系统 ####\nbs.logout()\n\n\n分钟线使用示例：\n\n\nimport baostock as bs\nimport pandas as pd\n\n#### 登陆系统 ####\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n#### 获取沪深A股历史K线数据 ####\n# 详细指标参数，参见“历史行情指标参数”章节；“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。\n# 分钟线指标：date,time,code,open,high,low,close,volume,amount,adjustflag\n# 周月线指标：date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg\nrs = bs.query_history_k_data_plus(\"sh.600000\",\n    \"date,time,code,open,high,low,close,volume,amount,adjustflag\",\n    start_date='2024-07-01', end_date='2024-12-31',\n    frequency=\"5\", adjustflag=\"3\")\nprint('query_history_k_data_plus respond error_code:'+rs.error_code)\nprint('query_history_k_data_plus respond  error_msg:'+rs.error_msg)\n\n#### 打印结果集 ####\ndata_list = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    data_list.append(rs.get_row_data())\nresult = pd.DataFrame(data_list, columns=rs.fields)\n\n#### 结果集输出到csv文件 ####   \nresult.to_csv(\"D:\\\\history_A_stock_k_data.csv\", index=False)\nprint(result)\n\n#### 登出系统 ####\nbs.logout()\n\n\n参数含义：\n\ncode：股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。此参数不可为空；\nfields：指示简称，支持多指标输入，以半角逗号分隔，填写内容作为返回类型的列。详细指标列表见历史行情指标参数章节，日线与分钟线参数不同。此参数不可为空；\nstart：开始日期（包含），格式“YYYY-MM-DD”，为空时取2015-01-01；\nend：结束日期（包含），格式“YYYY-MM-DD”，为空时取最近一个交易日；\nfrequency：数据类型，默认为d，日k线；d=日k线、w=周、m=月、5=5分钟、15=15分钟、30=30分钟、60=60分钟k线数据，不区分大小写；指数没有分钟线数据；周线每周最后一个交易日才可以获取，月线每月最后一个交易日才可以获取。\nadjustflag：复权类型，默认不复权：3；1：后复权；2：前复权。已支持分钟线、日线、周线、月线前后复权。 BaoStock提供的是涨跌幅复权算法复权因子，具体介绍见：BaoStock复权因子简介。\n\n注意：\n\n股票停牌时，对于日线，开、高、低、收价都相同，且都为前一交易日的收盘价，成交量、成交额为0，换手率为空。\n\n如果需要将换手率转为float类型，可使用如下方法转换：result[\"turn\"] = [0 if x == \"\" else float(x) for x in result[\"turn\"]]\n\n关于复权数据的说明：\n\nBaoStock使用“涨跌幅复权法”进行复权，详细说明参考上文“复权因子简介”。不同系统间采用复权方式可能不一致，导致数据不一致。\n\n“涨跌幅复权法的”优点：可以计算出资金收益率，确保初始投入的资金运用率为100%，既不会因为分红而导致投资减少，也不会因为配股导致投资增加。\n\n与同花顺、通达信等存在不同。\n\n返回示例数据\n\ndate\tcode\topen\thigh\tlow\tclose\tpreclose\tvolume\tamount\tadjustflag\tturn\ttradestatus\tpctChg\tisST\n2017-07-03\tsh.600000\t12.64\t12.65\t12.47\t12.56\t12.65\t38778949\t486264672\t3\t0.137985\t1\t-0.711456\t0\n2017-07-04\tsh.600000\t12.55\t12.58\t12.41\t12.55\t12.56\t36659128\t458434432\t3\t0.130442\t1\t-0.07962\t0\n2017-07-05\tsh.600000\t12.5\t12.65\t12.47\t12.62\t12.55\t26470507\t332542464\t3\t0.094188\t1\t0.557767\t0\n2017-07-06\tsh.600000\t12.62\t12.72\t12.51\t12.66\t12.62\t37414241\t471582096\t3\t0.133129\t1\t0.316957\t0\n2017-07-07\tsh.600000\t12.62\t12.69\t12.55\t12.6\t12.66\t24667294\t311101536\t3\t0.087772\t1\t-0.473929\t0\n\n返回数据说明\n\n参数名称\t参数描述\t算法说明\ndate\t交易所行情日期\t\ncode\t证券代码\t\nopen\t开盘价\t\nhigh\t最高价\t\nlow\t最低价\t\nclose\t收盘价\t\npreclose\t前收盘价\t见表格下方详细说明\nvolume\t成交量（累计，单位：股）\t\namount\t成交额（单位：人民币元）\t\nadjustflag\t复权状态（1：后复权，2：前复权，3：不复权）\t\nturn\t换手率\t[指定交易日的成交量(股)/指定交易日的股票的流通股总数(股)]*100%\ntradestatus\t交易状态（1：正常交易，0：停牌）\t\npctChg\t涨跌幅（百分比）\t日涨跌幅=[(指定交易日的收盘价-指定交易日前收盘价)/指定交易日前收盘价]*100%\npeTTM\t滚动市盈率\t(指定交易日的股票收盘价/指定交易日的每股盈余TTM)=(指定交易日的股票收盘价*截至当日公司总股本)/归属母公司股东净利润TTM\npbMRQ\t市净率\t(指定交易日的股票收盘价/指定交易日的每股净资产)=总市值/(最近披露的归属母公司股东的权益-其他权益工具)\npsTTM\t滚动市销率\t(指定交易日的股票收盘价/指定交易日的每股销售额)=(指定交易日的股票收盘价*截至当日公司总股本)/营业总收入TTM\npcfNcfTTM\t滚动市现率\t(指定交易日的股票收盘价/指定交易日的每股现金流TTM)=(指定交易日的股票收盘价*截至当日公司总股本)/现金以及现金等价物净增加额TTM\nisST\t是否ST股,1：是，0：否\t\n\n注意“前收盘价”说明：\n\n证券在指定交易日行情数据的前收盘价，当日发生除权除息时，“前收盘价”不是前一天的实际收盘价，而是根据股权登记日收盘价与分红现金的数量、配送股的数里和配股价的高低等结合起来算出来的价格。\n\n具体计算方法如下:\n\n1、计算除息价:\n\n除息价=股息登记日的收盘价-每股所分红利现金额\n\n2、计算除权价:\n\n送红股后的除权价=股权登记日的收盘价/(1+每股送红股数)\n\n配股后的除权价=(股权登记日的收盘价+配股价*每股配股数)/(1+每股配股数)\n\n3、计算除权除息价\n\n除权除息价=(股权登记日的收盘价-每股所分红利现金额+配股价*每股配股数)/(1+每股送红股数+每股配股数)\n\n“前收盘价”由交易所计算并公布。首发日的“前收盘价”等于“首发价格”。\n\n历史行情指标参数\n\n日线指标参数（包含停牌证券）\n\n参数名称\t参数描述\t说明\ndate\t交易所行情日期\t格式：YYYY-MM-DD\ncode\t证券代码\t格式：sh.600000。sh：上海，sz：深圳\nopen\t今开盘价格\t精度：小数点后4位；单位：人民币元\nhigh\t最高价\t精度：小数点后4位；单位：人民币元\nlow\t最低价\t精度：小数点后4位；单位：人民币元\nclose\t今收盘价\t精度：小数点后4位；单位：人民币元\npreclose\t昨日收盘价\t精度：小数点后4位；单位：人民币元\nvolume\t成交数量\t单位：股\namount\t成交金额\t精度：小数点后4位；单位：人民币元\nadjustflag\t复权状态\t不复权、前复权、后复权\nturn\t换手率\t精度：小数点后6位；单位：%\ntradestatus\t交易状态\t1：正常交易 0：停牌\npctChg\t涨跌幅（百分比）\t精度：小数点后6位\npeTTM\t滚动市盈率\t精度：小数点后6位\npsTTM\t滚动市销率\t精度：小数点后6位\npcfNcfTTM\t滚动市现率\t精度：小数点后6位\npbMRQ\t市净率\t精度：小数点后6位\nisST\t是否ST\t1是，0否\n\n周、月线指标参数\n\n参数名称\t参数描述\t说明\t算法说明\ndate\t交易所行情日期\t格式：YYYY-MM-DD\t\ncode\t证券代码\t格式：sh.600000。sh：上海，sz：深圳\t\nopen\t开盘价格\t精度：小数点后4位；单位：人民币元\t\nhigh\t最高价\t精度：小数点后4位；单位：人民币元\t\nlow\t最低价\t精度：小数点后4位；单位：人民币元\t\nclose\t收盘价\t精度：小数点后4位；单位：人民币元\t\nvolume\t成交数量\t单位：股\t\namount\t成交金额\t精度：小数点后4位；单位：人民币元\t\nadjustflag\t复权状态\t不复权、前复权、后复权\t\nturn\t换手率\t精度：小数点后6位；单位：%\t\npctChg\t涨跌幅（百分比）\t精度：小数点后6位\t涨跌幅=[(区间最后交易日收盘价-区间首个交易日前收盘价)/区间首个交易日前收盘价]*100%\n\n5、15、30、60分钟线指标参数(不包含指数)\n\n参数名称\t参数描述\t说明\ndate\t交易所行情日期\t格式：YYYY-MM-DD\ntime\t交易所行情时间\t格式：YYYYMMDDHHMMSSsss\ncode\t证券代码\t格式：sh.600000。sh：上海，sz：深圳\nopen\t开盘价格\t精度：小数点后4位；单位：人民币元\nhigh\t最高价\t精度：小数点后4位；单位：人民币元\nlow\t最低价\t精度：小数点后4位；单位：人民币元\nclose\t收盘价\t精度：小数点后4位；单位：人民币元\nvolume\t成交数量\t单位：股； 时间范围内的累计成交数量\namount\t成交金额\t精度：小数点后4位；单位：人民币元； 时间范围内的累计成交金额\nadjustflag\t复权状态\t不复权、前复权、后复权\n查询除权除息信息\n除权除息信息：query_dividend_data()\n\n通过API接口获取除权除息信息数据（预披露、预案、正式都已通过）。示例数据：下载\n\n\nimport baostock as bs\nimport pandas as pd\n\n#### 登陆系统 ####\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n#### 查询除权除息信息####\n# 查询2015年除权除息信息\nrs_list = []\nrs_dividend_2015 = bs.query_dividend_data(code=\"sh.600000\", year=\"2015\", yearType=\"report\")\nwhile (rs_dividend_2015.error_code == '0') & rs_dividend_2015.next():\n    rs_list.append(rs_dividend_2015.get_row_data())\n\n# 查询2016年除权除息信息\nrs_dividend_2016 = bs.query_dividend_data(code=\"sh.600000\", year=\"2016\", yearType=\"report\")\nwhile (rs_dividend_2016.error_code == '0') & rs_dividend_2016.next():\n    rs_list.append(rs_dividend_2016.get_row_data())\n\n# 查询2017年除权除息信息\nrs_dividend_2017 = bs.query_dividend_data(code=\"sh.600000\", year=\"2017\", yearType=\"report\")\nwhile (rs_dividend_2017.error_code == '0') & rs_dividend_2017.next():\n    rs_list.append(rs_dividend_2017.get_row_data())\n\nresult_dividend = pd.DataFrame(rs_list, columns=rs_dividend_2017.fields)\n# 打印输出\nprint(result_dividend)\n\n#### 结果集输出到csv文件 ####   \nresult_dividend.to_csv(\"D:\\\\history_Dividend_data.csv\", encoding=\"gbk\",index=False)\n\n#### 登出系统 ####\nbs.logout()\n\n\n\n参数含义：\n\ncode：股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。此参数不可为空；\nyear：年份，如：2017。此参数不可为空；\nyearType：年份类别，默认为\"report\":预案公告年份，可选项\"operate\":除权除息年份。此参数不可为空。\n\n返回示例数据\n\ncode\tdividPreNoticeDate\tdividAgmPumDate\tdividPlanAnnounceDate\tdividPlanDate\tdividRegistDate\tdividOperateDate\tdividPayDate\nsh.600000\t\t2015-05-16\t2015-03-19\t2015-06-16\t2015-06-19\t2015-06-23\t2015-06-23\nsh.600000\t\t2016-04-29\t2016-04-07\t2016-06-16\t2016-06-22\t2016-06-23\t2016-06-23\nsh.600000\t\t2017-04-26\t2017-04-01\t2017-05-19\t2017-05-24\t2017-05-25\t2017-05-25\n\n返回示例数据\n\ndividStockMarketDate\tdividCashPsBeforeTax\tdividCashPsAfterTax\tdividStocksPs\tdividCashStock\tdividReserveToStockPs\n\t0.757\t0.6813或0.71915\t0.000000\t10派7.57元（含税，扣税后6.813或7.1915元）\t\n2016-06-24\t0.515\t0.4635或0.515\t0.000000\t10转1派5.15元（含税，扣税后4.635或5.15元）\t0.100000\n2017-05-26\t0.2\t0.18或0.2\t0.000000\t10转3派2元（含税，扣税后1.8或2元）\t0.300000\n\n返回数据说明\n\n参数名称\t参数描述\t算法说明\ncode\t证券代码\t\ndividPreNoticeDate\t预批露公告日\t\ndividAgmPumDate\t股东大会公告日期\t\ndividPlanAnnounceDate\t预案公告日\t\ndividPlanDate\t分红实施公告日\t\ndividRegistDate\t股权登记告日\t\ndividOperateDate\t除权除息日期\t\ndividPayDate\t派息日\t\ndividStockMarketDate\t红股上市交易日\t\ndividCashPsBeforeTax\t每股股利税前\t派息比例分子(税前)/派息比例分母\ndividCashPsAfterTax\t每股股利税后\t派息比例分子(税后)/派息比例分母\ndividStocksPs\t每股红股\t\ndividCashStock\t分红送转\t每股派息数(税前)+每股送股数+每股转增股本数\ndividReserveToStockPs\t每股转增资本\t\n查询复权因子信息\n复权因子：query_adjust_factor()\n\n通过API接口获取复权因子信息数据。示例数据：下载\n\nBaoStock提供的是涨跌幅复权算法复权因子，具体介绍见： 媒体文件:BaoStock复权因子简介.pdf。\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 查询2015至2017年复权因子\nrs_list = []\nrs_factor = bs.query_adjust_factor(code=\"sh.600000\", start_date=\"2015-01-01\", end_date=\"2017-12-31\")\nwhile (rs_factor.error_code == '0') & rs_factor.next():\n    rs_list.append(rs_factor.get_row_data())\nresult_factor = pd.DataFrame(rs_list, columns=rs_factor.fields)\n# 打印输出\nprint(result_factor)\n\n# 结果集输出到csv文件\nresult_factor.to_csv(\"D:\\\\adjust_factor_data.csv\", encoding=\"gbk\", index=False)\n\n# 登出系统\nbs.logout()\n\n\n参数含义：\n\ncode：股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。此参数不可为空；\nstart_date：开始日期，为空时默认为2015-01-01，包含此日期；\nend_date：结束日期，为空时默认当前日期，包含此日期。\n\n返回示例数据\n\ncode\tdividOperateDate\tforeAdjustFactor\tbackAdjustFactor\tadjustFactor\nsh.600000\t2015-06-23\t0.663792\t6.295967\t6.295967\nsh.600000\t2016-06-23\t0.751598\t7.128788\t7.128788\nsh.600000\t2017-05-25\t0.989551\t9.385732\t9.385732\n\n返回数据说明\n\n参数名称\t参数描述\t算法说明\ncode\t证券代码\t\ndividOperateDate\t除权除息日期\t\nforeAdjustFactor\t向前复权因子\t除权除息日前一个交易日的收盘价/除权除息日最近的一个交易日的前收盘价\nbackAdjustFactor\t向后复权因子\t除权除息日最近的一个交易日的前收盘价/除权除息日前一个交易日的收盘价\nadjustFactor\t本次复权因子\t\n查询季频财务数据信息\n季频盈利能力：query_profit_data()\n\n方法说明：通过API接口获取季频盈利能力信息，可以通过参数设置获取对应年份、季度数据，提供2007年至今数据。\n\n返回类型：pandas的DataFrame类型。\n\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 查询季频估值指标盈利能力\nprofit_list = []\nrs_profit = bs.query_profit_data(code=\"sh.600000\", year=2017, quarter=2)\nwhile (rs_profit.error_code == '0') & rs_profit.next():\n    profit_list.append(rs_profit.get_row_data())\nresult_profit = pd.DataFrame(profit_list, columns=rs_profit.fields)\n# 打印输出\nprint(result_profit)\n# 结果集输出到csv文件\nresult_profit.to_csv(\"D:\\\\profit_data.csv\", encoding=\"gbk\", index=False)\n\n# 登出系统\nbs.logout()\n\n\n参数含义：\n\ncode：股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。此参数不可为空；\nyear：统计年份，为空时默认当前年；\nquarter：统计季度，可为空，默认当前季度。不为空时只有4个取值：1，2，3，4。\n\n返回示例数据\n\ncode\tpubDate\tstatDate\troeAvg\tnpMargin\tgpMargin\tnetProfit\tepsTTM\tMBRevenue\ttotalShare\tliqaShare\nsh.600000\t2017-08-30\t2017-06-30\t0.074617\t0.342179\t\t28522000000.000000\t1.939029\t83354000000.000000\t28103763899.00\t28103763899.00\n\n返回数据说明\n\n参数名称\t参数描述\t算法说明\ncode\t证券代码\t\npubDate\t公司发布财报的日期\t\nstatDate\t财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30\t\nroeAvg\t净资产收益率(平均)(%)\t归属母公司股东净利润/[(期初归属母公司股东的权益+期末归属母公司股东的权益)/2]*100%\nnpMargin\t销售净利率(%)\t净利润/营业收入*100%\ngpMargin\t销售毛利率(%)\t毛利/营业收入*100%=(营业收入-营业成本)/营业收入*100%\nnetProfit\t净利润(元)\t\nepsTTM\t每股收益\t归属母公司股东的净利润TTM/最新总股本\nMBRevenue\t主营营业收入(元)\t\ntotalShare\t总股本\t\nliqaShare\t流通股本\t\n季频营运能力：query_operation_data()\n\n方法说明：通过API接口获取季频营运能力信息，可以通过参数设置获取对应年份、季度数据，提供2007年至今数据。\n\n返回类型：pandas的DataFrame类型。\n\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 营运能力\noperation_list = []\nrs_operation = bs.query_operation_data(code=\"sh.600000\", year=2017, quarter=2)\nwhile (rs_operation.error_code == '0') & rs_operation.next():\n    operation_list.append(rs_operation.get_row_data())\nresult_operation = pd.DataFrame(operation_list, columns=rs_operation.fields)\n# 打印输出\nprint(result_operation)\n# 结果集输出到csv文件\nresult_operation.to_csv(\"D:\\\\operation_data.csv\", encoding=\"gbk\", index=False)\n\n# 登出系统\nbs.logout()\n\n\n参数含义：\n\ncode：股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。此参数不可为空；\nyear：统计年份，为空时默认当前年；\nquarter：统计季度，为空时默认当前季度。不为空时只有4个取值：1，2，3，4。\n\n返回示例数据\n\ncode\tpubDate\tstatDate\tNRTurnRatio\tNRTurnDays\tINVTurnRatio\tINVTurnDays\tCATurnRatio\tAssetTurnRatio\nsh.600000\t2017-08-30\t2017-06-30\t\t\t\t\t\t0.014161\n\n返回数据说明\n\n参数名称\t参数描述\t算法说明\ncode\t证券代码\t\npubDate\t公司发布财报的日期\t\nstatDate\t财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30\t\nNRTurnRatio\t应收账款周转率(次)\t营业收入/[(期初应收票据及应收账款净额+期末应收票据及应收账款净额)/2]\nNRTurnDays\t应收账款周转天数(天)\t季报天数/应收账款周转率(一季报：90天，中报：180天，三季报：270天，年报：360天)\nINVTurnRatio\t存货周转率(次)\t营业成本/[(期初存货净额+期末存货净额)/2]\nINVTurnDays\t存货周转天数(天)\t季报天数/存货周转率(一季报：90天，中报：180天，三季报：270天，年报：360天)\nCATurnRatio\t流动资产周转率(次)\t营业总收入/[(期初流动资产+期末流动资产)/2]\nAssetTurnRatio\t总资产周转率\t营业总收入/[(期初资产总额+期末资产总额)/2]\n季频成长能力：query_growth_data()\n\n方法说明：通过API接口获取季频成长能力信息，可以通过参数设置获取对应年份、季度数据，提供2007年至今数据。\n返回类型：pandas的DataFrame类型。\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 成长能力\ngrowth_list = []\nrs_growth = bs.query_growth_data(code=\"sh.600000\", year=2017, quarter=2)\nwhile (rs_growth.error_code == '0') & rs_growth.next():\n    growth_list.append(rs_growth.get_row_data())\nresult_growth = pd.DataFrame(growth_list, columns=rs_growth.fields)\n# 打印输出\nprint(result_growth)\n# 结果集输出到csv文件\nresult_growth.to_csv(\"D:\\\\growth_data.csv\", encoding=\"gbk\", index=False)\n\n# 登出系统\nbs.logout()\n\n\n\n参数含义：\n\ncode：股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。此参数不可为空；\nyear：统计年份，为空时默认当前年；\nquarter：统计季度，为空时默认当前季度。不为空时只有4个取值：1，2，3，4。\n\n返回示例数据\n\ncode\tpubDate\tstatDate\tYOYEquity\tYOYAsset\tYOYNI\tYOYEPSBasic\tYOYPNI\nsh.600000\t2017-08-30\t2017-06-30\t0.120243\t0.101298\t0.054808\t0.021053\t0.052111\n\n返回数据说明\n\n参数名称\t参数描述\t算法说明\ncode\t证券代码\t\npubDate\t公司发布财报的日期\t\nstatDate\t财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30\t\nYOYEquity\t净资产同比增长率\t(本期净资产-上年同期净资产)/上年同期净资产的绝对值*100%\nYOYAsset\t总资产同比增长率\t(本期总资产-上年同期总资产)/上年同期总资产的绝对值*100%\nYOYNI\t净利润同比增长率\t(本期净利润-上年同期净利润)/上年同期净利润的绝对值*100%\nYOYEPSBasic\t基本每股收益同比增长率\t(本期基本每股收益-上年同期基本每股收益)/上年同期基本每股收益的绝对值*100%\nYOYPNI\t归属母公司股东净利润同比增长率\t(本期归属母公司股东净利润-上年同期归属母公司股东净利润)/上年同期归属母公司股东净利润的绝对值*100%\n季频偿债能力：query_balance_data()\n\n方法说明：通过API接口获取季频偿债能力信息，可以通过参数设置获取对应年份、季度数据，提供2007年至今数据。\n返回类型：pandas的DataFrame类型。\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 偿债能力\nbalance_list = []\nrs_balance = bs.query_balance_data(code=\"sh.600000\", year=2017, quarter=2)\nwhile (rs_balance.error_code == '0') & rs_balance.next():\n    balance_list.append(rs_balance.get_row_data())\nresult_balance = pd.DataFrame(balance_list, columns=rs_balance.fields)\n# 打印输出\nprint(result_balance)\n# 结果集输出到csv文件\nresult_balance.to_csv(\"D:\\\\balance_data.csv\", encoding=\"gbk\", index=False)\n\n# 登出系统\nbs.logout()\n\n\n参数含义：\n\ncode：股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。此参数不可为空；\nyear：统计年份，为空时默认当前年；\nquarter：统计季度，为空时默认当前季度。不为空时只有4个取值：1，2，3，4。\n\n返回示例数据\n\ncode\tpubDate\tstatDate\tcurrentRatio\tquickRatio\tcashRatio\tYOYLiability\tliabilityToAsset\tassetToEquity\nsh.600000\t2017-08-30\t2017-06-30\t\t\t\t0.100020\t0.933703\t15.083598\n\n返回数据说明\n\n参数名称\t参数描述\t算法说明\ncode\t证券代码\t\npubDate\t公司发布财报的日期\t\nstatDate\t财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30\t\ncurrentRatio\t流动比率\t流动资产/流动负债\nquickRatio\t速动比率\t(流动资产-存货净额)/流动负债\ncashRatio\t现金比率\t(货币资金+交易性金融资产)/流动负债\nYOYLiability\t总负债同比增长率\t(本期总负债-上年同期总负债)/上年同期中负债的绝对值*100%\nliabilityToAsset\t资产负债率\t负债总额/资产总额\nassetToEquity\t权益乘数\t资产总额/股东权益总额=1/(1-资产负债率)\n季频现金流量：query_cash_flow_data()\n\n方法说明：通过API接口获取季频现金流量信息，可以通过参数设置获取对应年份、季度数据，提供2007年至今数据。\n返回类型：pandas的DataFrame类型。\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 季频现金流量\ncash_flow_list = []\nrs_cash_flow = bs.query_cash_flow_data(code=\"sh.600000\", year=2017, quarter=2)\nwhile (rs_cash_flow.error_code == '0') & rs_cash_flow.next():\n    cash_flow_list.append(rs_cash_flow.get_row_data())\nresult_cash_flow = pd.DataFrame(cash_flow_list, columns=rs_cash_flow.fields)\n# 打印输出\nprint(result_cash_flow)\n# 结果集输出到csv文件\nresult_cash_flow.to_csv(\"D:\\\\cash_flow_data.csv\", encoding=\"gbk\", index=False)\n\n# 登出系统\nbs.logout()\n\n\n参数含义：\n\ncode：股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。此参数不可为空；\nyear：统计年份，为空时默认当前年；\nquarter：统计季度，为空时默认当前季度。不为空时只有4个取值：1，2，3，4。\n\n返回示例数据\n\ncode\tpubDate\tstatDate\tCAToAsset\tNCAToAsset\ttangibleAssetToAsset\tebitToInterest\tCFOToOR\tCFOToNP\tCFOToGr\nsh.600000\t2017-08-30\t2017-06-30\t\t\t\t\t—3.071550\t—8.976439\t—3.071550\n\n返回数据说明\n\n参数名称\t参数描述\t算法说明\ncode\t证券代码\t\npubDate\t公司发布财报的日期\t\nstatDate\t财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30\t\nCAToAsset\t流动资产除以总资产\t\nNCAToAsset\t非流动资产除以总资产\t\ntangibleAssetToAsset\t有形资产除以总资产\t\nebitToInterest\t已获利息倍数\t息税前利润/利息费用\nCFOToOR\t经营活动产生的现金流量净额除以营业收入\t\nCFOToNP\t经营性现金净流量除以净利润\t\nCFOToGr\t经营性现金净流量除以营业总收入\t\n季频杜邦指数：query_dupont_data()\n\n方法说明：通过API接口获取季频杜邦指数信息，可以通过参数设置获取对应年份、季度数据，提供2007年至今数据。\n返回类型：pandas的DataFrame类型。\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 查询杜邦指数\ndupont_list = []\nrs_dupont = bs.query_dupont_data(code=\"sh.600000\", year=2017, quarter=2)\nwhile (rs_dupont.error_code == '0') & rs_dupont.next():\n    dupont_list.append(rs_dupont.get_row_data())\nresult_dupont = pd.DataFrame(dupont_list, columns=rs_dupont.fields)\n# 打印输出\nprint(result_dupont)\n# 结果集输出到csv文件\nresult_dupont.to_csv(\"D:\\\\dupont_data.csv\", encoding=\"gbk\", index=False)\n\n# 登出系统\nbs.logout()\n\n\n参数含义：\n\ncode：股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。此参数不可为空；\nyear：统计年份，为空时默认当前年；\nquarter：统计季度，为空时默认当前季度。不为空时只有4个取值：1，2，3，4。\n\n返回示例数据\n\ncode\tpubDate\tstatDate\tdupontROE\tdupontAssetStoEquity\tdupontAssetTurn\tdupontPnitoni\nsh.600000\t2017-08-30\t2017-06-30\t0.074617\t15.594453\t0.014161\t0.987483\n\n返回示例数据\n\ndupontNitogr\tdupontTaxBurden\tdupontIntburden\tdupontEbittogr\n0.342179\t0.776088\t\t\n\n返回数据说明\n\n参数名称\t参数描述\t算法说明\ncode\t证券代码\t\npubDate\t公司发布财报的日期\t\nstatDate\t财报统计的季度的最后一天, 比如2017-03-31, 2017-06-30\t\ndupontROE\t净资产收益率\t归属母公司股东净利润/[(期初归属母公司股东的权益+期末归属母公司股东的权益)/2]*100%\ndupontAssetStoEquity\t权益乘数，反映企业财务杠杆效应强弱和财务风险\t平均总资产/平均归属于母公司的股东权益\ndupontAssetTurn\t总资产周转率，反映企业资产管理效率的指标\t营业总收入/[(期初资产总额+期末资产总额)/2]\ndupontPnitoni\t归属母公司股东的净利润/净利润，反映母公司控股子公司百分比。如果企业追加投资，扩大持股比例，则本指标会增加。\t\ndupontNitogr\t净利润/营业总收入，反映企业销售获利率\t\ndupontTaxBurden\t净利润/利润总额，反映企业税负水平，该比值高则税负较低。净利润/利润总额=1-所得税/利润总额\t\ndupontIntburden\t利润总额/息税前利润，反映企业利息负担，该比值高则税负较低。利润总额/息税前利润=1-利息费用/息税前利润\t\ndupontEbittogr\t息税前利润/营业总收入，反映企业经营利润率，是企业经营获得的可供全体投资人（股东和债权人）分配的盈利占企业全部营收收入的百分比\t\n查询季频公司报告信息\n季频公司业绩快报：query_performance_express_report()\n\n方法说明：通过API接口获取季频公司业绩快报信息，可以通过参数设置获取起止年份数据，提供2006年至今数据。除几种特殊情况外，交易所未要求必须发布。\n\n返回类型：pandas的DataFrame类型。\n\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n#### 登陆系统 ####\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n#### 获取公司业绩快报 ####\nrs = bs.query_performance_express_report(\"sh.600000\", start_date=\"2015-01-01\", end_date=\"2017-12-31\")\nprint('query_performance_express_report respond error_code:'+rs.error_code)\nprint('query_performance_express_report respond  error_msg:'+rs.error_msg)\n\nresult_list = []\nwhile (rs.error_code == '0') & rs.next():\n    result_list.append(rs.get_row_data())\n    # 获取一条记录，将记录合并在一起\nresult = pd.DataFrame(result_list, columns=rs.fields)\n#### 结果集输出到csv文件 ####\nresult.to_csv(\"D:\\\\performance_express_report.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n#### 登出系统 ####\nbs.logout()\n\n\n参数含义：\n\ncode：股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。此参数不可为空；\nstart_date：开始日期，发布日期或更新日期在这个范围内；\nend_date：结束日期，发布日期或更新日期在这个范围内。\n\n返回示例数据\n\ncode\tperformanceExpPubDate\tperformanceExpStatDate\tperformanceExpUpdateDate\tperformanceExpressTotalAsset\tperformanceExpressNetAsset\nsh.600000\t2015-01-06\t2014-12-31\t2015-01-06\t4195602000000.000000\t260011000000.000000\nsh.600000\t2016-01-05\t2015-12-31\t2016-01-05\t5043060000000.000000\t285245000000.000000\nsh.600000\t2017-01-04\t2016-12-31\t2017-01-04\t5857263000000.000000\t338027000000.000000\n\n返回示例数据\n\nperformanceExpressEPSChgPct\tperformanceExpressROEWa\tperformanceExpressEPSDiluted\tperformanceExpressGRYOY\tperformanceExpressOPYOY\n0.326910\t21.020000\t2.520000\t0.228390\t0.153803\n0.191493\t18.820000\t2.660000\t0.192395\t0.069764\n0.115412\t16.350000\t2.400000\t0.097234\t0.054384\n\n返回数据说明\n\n参数名称\t参数描述\ncode\t证券代码\nperformanceExpPubDate\t业绩快报披露日\nperformanceExpStatDate\t业绩快报统计日期\nperformanceExpUpdateDate\t业绩快报披露日(最新)\nperformanceExpressTotalAsset\t业绩快报总资产\nperformanceExpressNetAsset\t业绩快报净资产\nperformanceExpressEPSChgPct\t业绩每股收益增长率\nperformanceExpressROEWa\t业绩快报净资产收益率ROE-加权\nperformanceExpressEPSDiluted\t业绩快报每股收益EPS-摊薄\nperformanceExpressGRYOY\t业绩快报营业总收入同比\nperformanceExpressOPYOY\t业绩快报营业利润同比\n季频公司业绩预告：query_forecast_report()\n\n方法说明：通过API接口获取季频公司业绩预告信息，可以通过参数设置获取起止年份数据，提供2003年至今数据。除几种特殊情况外，交易所未要求必须发布。\n\n返回类型：pandas的DataFrame类型。\n\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n#### 登陆系统 ####\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n#### 获取公司业绩预告 ####\nrs_forecast = bs.query_forecast_report(\"sh.600000\", start_date=\"2010-01-01\", end_date=\"2017-12-31\")\nprint('query_forecast_reprot respond error_code:'+rs_forecast.error_code)\nprint('query_forecast_reprot respond  error_msg:'+rs_forecast.error_msg)\nrs_forecast_list = []\nwhile (rs_forecast.error_code == '0') & rs_forecast.next():\n    # 分页查询，将每页信息合并在一起\n    rs_forecast_list.append(rs_forecast.get_row_data())\nresult_forecast = pd.DataFrame(rs_forecast_list, columns=rs_forecast.fields)\n#### 结果集输出到csv文件 ####\nresult_forecast.to_csv(\"D:\\\\forecast_report.csv\", encoding=\"gbk\", index=False)\nprint(result_forecast)\n\n#### 登出系统 ####\nbs.logout()\n\n\n参数含义：\n\ncode：股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。此参数不可为空；\nstart_date：开始日期，发布日期或更新日期在这个范围内；\nend_date：结束日期，发布日期或更新日期在这个范围内。\n\n返回示例数据\n\ncode\tprofitForcastExpPubDate\tprofitForcastExpStatDate\tprofitForcastType\tprofitForcastAbstract\nsh.600000\t2010-01-05\t2009-12-31\t略增\t预计2009年归属于上市公司股东净利润1319500万元，同比增长5.43%。\nsh.600000\t2011-01-05\t2010-12-31\t略增\t预计公司2010年年度归属于上市公司股东净利润为190.76亿元，较上年同期增长44.33％。\nsh.600000\t2012-01-05\t2011-12-31\t略增\t预计2011年1月1日至2011年12月31日，归属于上市公司股东的净利润：盈利272.36亿元，与上年同期相比增加了42.02%。\n\n返回示例数据\n\nprofitForcastChgPctUp\tprofitForcastChgPctDwn\n5.430000\t0.000000\n44.330000\t44.330000\n42.020000\t42.020000\n\n返回数据说明\n\n参数名称\t参数描述\ncode\t证券代码\nprofitForcastExpPubDate\t业绩预告发布日期\nprofitForcastExpStatDate\t业绩预告统计日期\nprofitForcastType\t业绩预告类型\nprofitForcastAbstract\t业绩预告摘要\nprofitForcastChgPctUp\t预告归属于母公司的净利润增长上限(%)\nprofitForcastChgPctDwn\t预告归属于母公司的净利润增长下限(%)\n证券基本资料\n证券基本资料：query_stock_basic()\n\n方法说明：通过API接口获取证券基本资料，可以通过参数设置获取对应证券代码、证券名称的数据。\n返回类型：pandas的DataFrame类型。\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 获取证券基本资料\nrs = bs.query_stock_basic(code=\"sh.600000\")\n# rs = bs.query_stock_basic(code_name=\"浦发银行\")  # 支持模糊查询\nprint('query_stock_basic respond error_code:'+rs.error_code)\nprint('query_stock_basic respond  error_msg:'+rs.error_msg)\n\n# 打印结果集\ndata_list = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    data_list.append(rs.get_row_data())\nresult = pd.DataFrame(data_list, columns=rs.fields)\n# 结果集输出到csv文件\nresult.to_csv(\"D:/stock_basic.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n# 登出系统\nbs.logout()\n\n\n\n参数含义：\n\ncode：A股股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。可以为空；\ncode_name：股票名称，支持模糊查询，可以为空。\n当参数为空时，输出全部股票的基本信息。\n\n返回示例数据\n\ncode\tcode_name\tipoDate\toutDate\ttype\tstatus\nsh.600000\t浦发银行\t1999-11-10\t\t1\t1\n\n返回数据说明\n\n参数名称\t参数描述\ncode\t证券代码\ncode_name\t证券名称\nipoDate\t上市日期\noutDate\t退市日期\ntype\t证券类型，其中1：股票，2：指数，3：其它，4：可转债，5：ETF\nstatus\t上市状态，其中1：上市，0：退市\n获取证券元信息\n交易日查询：query_trade_dates()\n\n方法说明：通过API接口获取股票交易日信息，可以通过参数设置获取起止年份数据，提供上交所1990-今年数据。\n返回类型：pandas的DataFrame类型。\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n#### 登陆系统 ####\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n#### 获取交易日信息 ####\nrs = bs.query_trade_dates(start_date=\"2017-01-01\", end_date=\"2017-06-30\")\nprint('query_trade_dates respond error_code:'+rs.error_code)\nprint('query_trade_dates respond  error_msg:'+rs.error_msg)\n\n#### 打印结果集 ####\ndata_list = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    data_list.append(rs.get_row_data())\nresult = pd.DataFrame(data_list, columns=rs.fields)\n\n#### 结果集输出到csv文件 ####   \nresult.to_csv(\"D:\\\\trade_datas.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n#### 登出系统 ####\nbs.logout()\n\n\n参数含义：\n\nstart_date：开始日期，为空时默认为2015-01-01。\nend_date：结束日期，为空时默认为当前日期。\n\n返回示例数据\n\ncalendar_date\tis_trading_day\n2017-01-01\t0\n2017-01-02\t0\n2017-01-03\t1\n\n返回数据说明\n\n参数名称\t参数描述\ncalendar_date\t日期\nis_trading_day\t是否交易日(0:非交易日;1:交易日)\n证券代码查询：query_all_stock()\n\n方法说明：获取指定交易日期所有股票列表。通过API接口获取证券代码及股票交易状态信息，与日K线数据同时更新。可以通过参数‘某交易日’获取数据（包括：A股、指数），数据范围同接口query_history_k_data_plus()。\n\n返回类型：pandas的DataFrame类型。\n\n更新时间：与日K线同时更新。\n\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n#### 登陆系统 ####\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n#### 获取证券信息 ####\nrs = bs.query_all_stock(day=\"2017-06-30\")\nprint('query_all_stock respond error_code:'+rs.error_code)\nprint('query_all_stock respond  error_msg:'+rs.error_msg)\n\n#### 打印结果集 ####\ndata_list = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    data_list.append(rs.get_row_data())\nresult = pd.DataFrame(data_list, columns=rs.fields)\n\n#### 结果集输出到csv文件 ####   \nresult.to_csv(\"D:\\\\all_stock.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n#### 登出系统 ####\nbs.logout()\n\n\n参数含义：\n\nday：需要查询的交易日期，为空时默认当前日期。\n\n返回示例数据\n\ncode\ttradeStatus\tcode_name\nsh.000001\t1\t上证综合指数\nsh.000002\t1\t上证A股指数\nsh.000003\t1\t上证B股指数\n\n返回数据说明\n\n参数名称\t参数描述\ncode\t证券代码\ntradeStatus\t交易状态(1：正常交易 0：停牌）\ncode_name\t证券名称\n宏观经济数据\n存款利率：query_deposit_rate_data()\n\n方法说明：通过API接口获取存款利率，可以通过参数设置获取对应起止日期的数据。\n返回类型：pandas的DataFrame类型。\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 获取存款利率\nrs = bs.query_deposit_rate_data(start_date=\"2015-01-01\", end_date=\"2015-12-31\")\nprint('query_deposit_rate_data respond error_code:'+rs.error_code)\nprint('query_deposit_rate_data respond  error_msg:'+rs.error_msg)\n\n# 打印结果集\ndata_list = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    data_list.append(rs.get_row_data())\nresult = pd.DataFrame(data_list, columns=rs.fields)\n# 结果集输出到csv文件\nresult.to_csv(\"D:/deposit_rate.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n# 登出系统\nbs.logout()\n\n\n参数含义：\n\nstart_date：开始日期，格式XXXX-XX-XX，发布日期在这个范围内，可以为空；\nend_date：结束日期，格式XXXX-XX-XX，发布日期在这个范围内，可以为空。\n\n返回示例数据\n\npubDate\tdemandDepositRate\tfixedDepositRate3Month\tfixedDepositRate6Month\tfixedDepositRate1Year\tfixedDepositRate2Year\tfixedDepositRate3Year\n2015-03-01\t0.350000\t2.100000\t2.300000\t2.500000\t3.100000\t3.750000\n2015-05-11\t0.350000\t1.850000\t2.050000\t2.250000\t2.850000\t3.500000\n\n返回示例数据\n\nfixedDepositRate5Year\tinstallmentFixedDepositRate1Year\tinstallmentFixedDepositRate3Year\tinstallmentFixedDepositRate5Year\n\t2.100000\t2.300000\t\n\t1.850000\t2.050000\t\n\n返回数据说明\n\n参数名称\t参数描述\npubDate\t发布日期\ndemandDepositRate\t活期存款(不定期)\nfixedDepositRate3Month\t定期存款(三个月)\nfixedDepositRate6Month\t定期存款(半年)\nfixedDepositRate1Year\t定期存款整存整取(一年)\nfixedDepositRate2Year\t定期存款整存整取(二年)\nfixedDepositRate3Year\t定期存款整存整取(三年)\nfixedDepositRate5Year\t定期存款整存整取(五年)\ninstallmentFixedDepositRate1Year\t零存整取、整存零取、存本取息定期存款(一年)\ninstallmentFixedDepositRate3Year\t零存整取、整存零取、存本取息定期存款(三年)\ninstallmentFixedDepositRate5Year\t零存整取、整存零取、存本取息定期存款(五年)\n贷款利率：query_loan_rate_data()\n\n方法说明：通过API接口获取贷款利率，可以通过参数设置获取对应起止日期的数据。\n返回类型：pandas的DataFrame类型。\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 获取贷款利率\nrs = bs.query_loan_rate_data(start_date=\"2010-01-01\", end_date=\"2015-12-31\")\nprint('query_loan_rate_data respond error_code:'+rs.error_code)\nprint('query_loan_rate_data respond  error_msg:'+rs.error_msg)\n\n# 打印结果集\ndata_list = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    data_list.append(rs.get_row_data())\nresult = pd.DataFrame(data_list, columns=rs.fields)\n# 结果集输出到csv文件\nresult.to_csv(\"D:/loan_rate.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n# 登出系统\nbs.logout()\n\n\n参数含义：\n\nstart_date：开始日期，格式XXXX-XX-XX，发布日期在这个范围内，可以为空；\nend_date：结束日期，格式XXXX-XX-XX，发布日期在这个范围内，可以为空。\n\n返回示例数据\n\npubDate\tloanRate6Month\tloanRate6MonthTo1Year\tloanRate1YearTo3Year\tloanRate3YearTo5Year\n2010-10-20\t5.100000\t5.560000\t5.600000\t5.960000\n2010-12-26\t5.350000\t5.810000\t5.850000\t6.220000\n\n返回示例数据\n\nloanRateAbove5Year\tmortgateRateBelow5Year\tmortgateRateAbove5Year\n6.140000\t3.500000\t4.050000\n6.400000\t3.750000\t4.300000\n\n返回数据说明\n\n参数名称\t参数描述\npubDate\t发布日期\nloanRate6Month\t6个月贷款利率\nloanRate6MonthTo1Year\t6个月至1年贷款利率\nloanRate1YearTo3Year\t1年至3年贷款利率\nloanRate3YearTo5Year\t3年至5年贷款利率\nloanRateAbove5Year\t5年以上贷款利率\nmortgateRateBelow5Year\t5年以下住房公积金贷款利率\nmortgateRateAbove5Year\t5年以上住房公积金贷款利率\n存款准备金率：query_required_reserve_ratio_data()\n\n方法说明：通过API接口获取存款准备金率，可以通过参数设置获取对应起止日期的数据。\n返回类型：pandas的DataFrame类型。\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 获取存款准备金率\nrs = bs.query_required_reserve_ratio_data(start_date=\"2010-01-01\", end_date=\"2015-12-31\")\nprint('query_required_reserve_ratio_data respond error_code:'+rs.error_code)\nprint('query_required_reserve_ratio_data respond  error_msg:'+rs.error_msg)\n\n# 打印结果集\ndata_list = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    data_list.append(rs.get_row_data())\nresult = pd.DataFrame(data_list, columns=rs.fields)\n# 结果集输出到csv文件\nresult.to_csv(\"D:/required_reserve_ratio.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n# 登出系统\nbs.logout()\n\n\n参数含义：\n\nstart_date：开始日期，格式XXXX-XX-XX，发布日期在这个范围内，可以为空；\nend_date：结束日期，格式XXXX-XX-XX，发布日期在这个范围内，可以为空；\nyearType:年份类别，默认为0，查询公告日期；1查询生效日期。\n\n返回示例数据\n\npubDate\teffectiveDate\tbigInstitutionsRatioPre\tbigInstitutionsRatioAfter\n2010-01-12\t2010-01-18\t15.5\t16.0\n2010-02-12\t2010-02-25\t16.0\t16.5\n\n返回示例数据\n\nmediumInstitutionsRatioPre\tmediumInstitutionsRatioAfter\n13.5\t14.0\n14.0\t14.5\n\n返回数据说明\n\n参数名称\t参数描述\npubDate\t公告日期\neffectiveDate\t生效日期\nbigInstitutionsRatioPre\t人民币存款准备金率：大型存款类金融机构 调整前\nbigInstitutionsRatioAfter\t人民币存款准备金率：大型存款类金融机构 调整后\nmediumInstitutionsRatioPre\t人民币存款准备金率：中小型存款类金融机构 调整前\nmediumInstitutionsRatioAfter\t人民币存款准备金率：中小型存款类金融机构 调整后\n货币供应量：query_money_supply_data_month()\n\n方法说明：通过API接口获取货币供应量，可以通过参数设置获取对应起止日期的数据。\n返回类型：pandas的DataFrame类型。\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 获取货币供应量\nrs = bs.query_money_supply_data_month(start_date=\"2010-01\", end_date=\"2015-12\")\nprint('query_money_supply_data_month respond error_code:'+rs.error_code)\nprint('query_money_supply_data_month respond  error_msg:'+rs.error_msg)\n\n# 打印结果集\ndata_list = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    data_list.append(rs.get_row_data())\nresult = pd.DataFrame(data_list, columns=rs.fields)\n# 结果集输出到csv文件\nresult.to_csv(\"D:/money_supply_data_month.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n# 登出系统\nbs.logout()\n\n\n参数含义：\n\nstart_date：开始日期，格式XXXX-XX，发布日期在这个范围内，可以为空；\nend_date：结束日期，格式XXXX-XX，发布日期在这个范围内，可以为空。\n\n返回示例数据\n\nstatYear\tstatMonth\tm0Month\tm0YOY\tm0ChainRelative\tm1Month\tm1YOY\tm1ChainRelative\n2010\t01\t40758.580000\t—0.790000\t6.566809\t229588.980000\t38.960000\t3.677276\n2010\t02\t42865.790000\t21.980000\t5.169979\t224286.950000\t34.990000\t—2.309357\n\n返回示例数据\n\nm2Month\tm2YOY\tm2ChainRelative\n625609.290000\t25.980000\t2.521165\n636072.260000\t25.520000\t1.672445\n\n返回数据说明\n\n参数名称\t参数描述\nstatYear\t统计年度\nstatMonth\t统计月份\nm0Month\t货币供应量M0（月）\nm0YOY\t货币供应量M0（同比）\nm0ChainRelative\t货币供应量M0（环比）\nm1Month\t货币供应量M1（月）\nm1YOY\t货币供应量M1（同比）\nm1ChainRelative\t货币供应量M1（环比）\nm2Month\t货币供应量M2（月）\nm2YOY\t货币供应量M2（同比）\nm2ChainRelative\t货币供应量M2（环比）\n货币供应量(年底余额)：query_money_supply_data_year()\n\n方法说明：通过API接口获取货币供应量(年底余额)，可以通过参数设置获取对应起止日期的数据。\n返回类型：pandas的DataFrame类型。\n使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 获取货币供应量(年底余额)\nrs = bs.query_money_supply_data_year(start_date=\"2010\", end_date=\"2015\")\nprint('query_money_supply_data_year respond error_code:'+rs.error_code)\nprint('query_money_supply_data_year respond  error_msg:'+rs.error_msg)\n\n# 打印结果集\ndata_list = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    data_list.append(rs.get_row_data())\nresult = pd.DataFrame(data_list, columns=rs.fields)\n# 结果集输出到csv文件\nresult.to_csv(\"D:/money_supply_data_year.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n# 登出系统\nbs.logout()\n\n\n参数含义：\n\nstart_date：开始日期，格式XXXX，发布日期在这个范围内，可以为空；\nend_date：结束日期，格式XXXX，发布日期在这个范围内，可以为空。\n\n返回示例数据\n\nstatYear\tm0Year\tm0YearYOY\tm1Year\tm1YearYOY\tm2Year\tm2YearYOY\n2010\t44628.170000\t16.700000\t266621.540000\t21.200000\t725851.800000\t19.700000\n2011\t50748.460000\t13.760000\t289847.700000\t7.850000\t851590.900000\t13.610000\n\n返回数据说明\n\n参数名称\t参数描述\nstatYear\t统计年度\nm0Year\t年货币供应量M0（亿元）\nm0YearYOY\t年货币供应量M0（同比）\nm1Year\t年货币供应量M1（亿元）\nm1YearYOY\t年货币供应量M1（同比）\nm2Year\t年货币供应量M2（亿元）\nm2YearYOY\t年货币供应量M2（同比）\n板块数据\n行业分类：query_stock_industry()\n\n方法说明：通过API接口获取行业分类信息，更新频率：每周一更新。返回类型：pandas的DataFrame类型。 使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 获取行业分类数据\nrs = bs.query_stock_industry()\n# rs = bs.query_stock_basic(code_name=\"浦发银行\")\nprint('query_stock_industry error_code:'+rs.error_code)\nprint('query_stock_industry respond  error_msg:'+rs.error_msg)\n\n# 打印结果集\nindustry_list = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    industry_list.append(rs.get_row_data())\nresult = pd.DataFrame(industry_list, columns=rs.fields)\n# 结果集输出到csv文件\nresult.to_csv(\"D:/stock_industry.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n# 登出系统\nbs.logout()\n\n\n\n参数含义：\n\ncode：A股股票代码，sh或sz.+6位数字代码，或者指数代码，如：sh.601398。sh：上海；sz：深圳。可以为空；\ndate：查询日期，格式XXXX-XX-XX，为空时默认最新日期。\n\n返回示例数据\n\nupdateDate\tcode\tcode_name\tindustry\tindustryClassification\n2018-11-26\tsh.600000\t浦发银行\t银行\t申万一级行业\n2018-11-26\tsh.600001\t邯郸钢铁\t\t申万一级行业\n\n返回数据说明\n\n参数名称\t参数描述\nupdateDate\t更新日期\ncode\t证券代码\ncode_name\t证券名称\nindustry\t所属行业\nindustryClassification\t所属行业类别\n上证50成分股：query_sz50_stocks()\n\n方法说明：通过API接口获取上证50成分股信息，更新频率：每周一更新。返回类型：pandas的DataFrame类型。 使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 获取上证50成分股\nrs = bs.query_sz50_stocks()\nprint('query_sz50 error_code:'+rs.error_code)\nprint('query_sz50  error_msg:'+rs.error_msg)\n\n# 打印结果集\nsz50_stocks = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    sz50_stocks.append(rs.get_row_data())\nresult = pd.DataFrame(sz50_stocks, columns=rs.fields)\n# 结果集输出到csv文件\nresult.to_csv(\"D:/sz50_stocks.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n# 登出系统\nbs.logout()\n\n\n\n参数含义：\n\ndate：查询日期，格式XXXX-XX-XX，为空时默认最新日期。\n\n返回示例数据\n\nupdateDate\tcode\tcode_name\n2018-11-26\tsh.600000\t浦发银行\n2018-11-26\tsh.600016\t民生银行\n\n返回数据说明\n\n参数名称\t参数描述\nupdateDate\t更新日期\ncode\t证券代码\ncode_name\t证券名称\n沪深300成分股：query_hs300_stocks()\n\n方法说明：通过API接口获取沪深300成分股信息，更新频率：每周一更新。返回类型：pandas的DataFrame类型。 使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 获取沪深300成分股\nrs = bs.query_hs300_stocks()\nprint('query_hs300 error_code:'+rs.error_code)\nprint('query_hs300  error_msg:'+rs.error_msg)\n\n# 打印结果集\nhs300_stocks = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    hs300_stocks.append(rs.get_row_data())\nresult = pd.DataFrame(hs300_stocks, columns=rs.fields)\n# 结果集输出到csv文件\nresult.to_csv(\"D:/hs300_stocks.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n# 登出系统\nbs.logout()\n\n\n\n参数含义：\n\ndate：查询日期，格式XXXX-XX-XX，为空时默认最新日期。\n\n返回示例数据\n\nupdateDate\tcode\tcode_name\n2018-11-26\tsh.600000\t浦发银行\n2018-11-26\tsh.600008\t首创股份\n\n返回数据说明\n\n参数名称\t参数描述\nupdateDate\t更新日期\ncode\t证券代码\ncode_name\t证券名称\n中证500成分股：query_zz500_stocks()\n\n方法说明：通过API接口获取中证500成分股信息，更新频率：每周一更新。返回类型：pandas的DataFrame类型。 使用示例\n\n\nimport baostock as bs\nimport pandas as pd\n\n# 登陆系统\nlg = bs.login()\n# 显示登陆返回信息\nprint('login respond error_code:'+lg.error_code)\nprint('login respond  error_msg:'+lg.error_msg)\n\n# 获取中证500成分股\nrs = bs.query_zz500_stocks()\nprint('query_zz500 error_code:'+rs.error_code)\nprint('query_zz500  error_msg:'+rs.error_msg)\n\n# 打印结果集\nzz500_stocks = []\nwhile (rs.error_code == '0') & rs.next():\n    # 获取一条记录，将记录合并在一起\n    zz500_stocks.append(rs.get_row_data())\nresult = pd.DataFrame(zz500_stocks, columns=rs.fields)\n# 结果集输出到csv文件\nresult.to_csv(\"D:/zz500_stocks.csv\", encoding=\"gbk\", index=False)\nprint(result)\n\n# 登出系统\nbs.logout()\n\n\n\n参数含义：\n\ndate：查询日期，格式XXXX-XX-XX，为空时默认最新日期。\n\n返回示例数据\n\nupdateDate\tcode\tcode_name\n2018-11-26\tsh.600004\t白云机场\n2018-11-26\tsh.600006\t东风汽车\n\n返回数据说明\n\n参数名称\t参数描述\nupdateDate\t更新日期\ncode\t证券代码\ncode_name\t证券名称\n示例程序\n获取指定日期全部股票的日K线数据\n\n示例代码如下：\n\n\nimport baostock as bs\nimport pandas as pd\n\n\ndef download_data(date):\n    bs.login()\n\n    # 获取指定日期的指数、股票数据\n    stock_rs = bs.query_all_stock(date)\n    stock_df = stock_rs.get_data()\n    data_df = pd.DataFrame()\n    for code in stock_df[\"code\"]:\n        print(\"Downloading :\" + code)\n        k_rs = bs.query_history_k_data_plus(code, \"date,code,open,high,low,close\", date, date)\n        data_df = data_df.append(k_rs.get_data())\n    bs.logout()\n    data_df.to_csv(\"D:\\\\demo_assignDayData.csv\", encoding=\"gbk\", index=False)\n    print(data_df)\n\n\nif __name__ == '__main__':\n    # 获取指定日期全部股票的日K线数据\n    download_data(\"2019-02-25\")\n\n沪ICP备19029036号-3\n|\n沪公网安备31011502404449号\n|\n电信业务增值许可证：沪B2-20240133\n|\n隐私政策\n|\n关于www.baostock.com\n|\n免责声明"


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)