A股量化数据工程:从 REST 接口到策略信号(第 28 篇):大宗交易与解禁数据
前言
大宗交易折价反映机构接盘的意愿与成本,解禁则是潜在的供给冲击。接口hitc/dzjy(大宗交易)、jjxs(解禁限售)给出这两类事件数据,本篇自研大宗折价率与解禁压力,补齐事件风险维度。
一、接口原始字段梳理
1)大宗交易
接口地址:https://api.biyingapi.com/hitc/dzjy/{LICENCE}
| 字段 | 说明 |
|---|---|
| t | 日期 |
| dm | 股票代码 |
| mc | 股票名称 |
| p | 收盘价 |
| v | 成交量 |
| dp | 大宗交易价 |
| buyi | 买方营业部(接口原始字段) |
| selli | 卖方营业部(接口原始字段) |
| type | 类型(接口原始字段) |
2)解禁限售
接口地址:https://api.biyingapi.com/hitc/jjxs/{LICENCE}
| 字段 | 说明 |
|---|---|
| dm | 股票代码 |
| mc | 股票名称 |
| rdate | 解禁日期 |
| ramount | 解禁数量 |
| rprice | 解禁价格 |
| batch | 批次 |
| pdate | 公告日期 |
二、自研衍生统计指标
- 大宗折价率:
(dp − p) / p,为负即折价,幅度越大机构拿货成本越低(也暗示卖压)。 - 解禁压力:
ramount / 流通股本(流通股本取第 22 篇ltz或近似),比例越高潜在抛压越大。 - 大宗买方集中度:同一
buyi出现次数,识别活跃接盘方。
折价率与压力比为自研,原始
dp/p/ramount为接口输入。
三、数据表设计
CREATETABLEIFNOTEXISTSblock_trade(dmTEXT,tTEXT,pREAL,vREAL,dpREAL,discountREAL,buyiTEXT,selliTEXT,PRIMARYKEY(dm,t));CREATETABLEIFNOTEXISTSunlock_ahead(dmTEXT,rdateTEXT,ramountREAL,rpriceREAL,batchTEXT,pdateTEXT,PRIMARYKEY(dm,rdate,batch));四、完整代码
importrequestsimportsqlite3importtime LICENCE="YOUR_LICENCE"BASE="https://api.biyingapi.com"DB_PATH="quant.db"defbiying_api_get_retry(url,timeout=15,max_retry=3):foriinrange(max_retry):try:r=requests.get(url,timeout=timeout)r.raise_for_status()returnr.json()exceptExceptionase:ifi==max_retry-1:raisetime.sleep(1+i)deffetch(path):d=biying_api_get_retry(f"{BASE}/hitc/{path}/{LICENCE}")returnd.get("data",[])ifisinstance(d,dict)else[]defdiscount_rate(p,dp):ifnotpornotdp:return0.0returnround((dp-p)/p,4)if__name__=="__main__":dz=fetch("dzjy");jj=fetch("jjxs")con=sqlite3.connect(DB_PATH)forrindz:disc=discount_rate(r.get("p"),r.get("dp"))con.execute("INSERT OR REPLACE INTO block_trade(dm,t,p,v,dp,discount,buyi,selli)""VALUES(?,?,?,?,?,?,?,?)",[r.get("dm"),r.get("t"),r.get("p"),r.get("v"),r.get("dp"),disc,r.get("buyi"),r.get("selli")])forrinjj:con.execute("INSERT OR REPLACE INTO unlock_ahead(dm,rdate,ramount,rprice,batch,pdate)""VALUES(?,?,?,?,?,?)",[r.get("dm"),r.get("rdate"),r.get("ramount"),r.get("rprice"),r.get("batch"),r.get("pdate")])con.commit();con.close()big_disc=sorted([(r.get("dm"),discount_rate(r.get("p"),r.get("dp")))forrindz],key=lambdax:x[1])[:5]print("大宗折价最深 Top5(负=折价):",big_disc)print(f"待解禁标的{len(jj)}只,近期解禁示例:",[(r.get('dm'),r.get('rdate'))forrinjj[:5]])五、关键业务说明
- 折价率是双刃剑:深度折价可能代表机构低位接货(偏多),也可能是原始股东急售(偏空),需结合买方身份。
- 解禁压力看比例:
ramount绝对量大不可怕,占流通比高才是真冲击,计算时取流通股本做分母。 - 与持股维度呼应:解禁冲击会稀释第 22 篇机构持股比例,事件前需关注。
六、拓展练习
- 把
unlock_ahead按rdate排序,做「未来一月解禁压力榜」预警(仅统计)。 - 对大宗深度折价股,跟踪其后市相对收益,区分「接货」与「出货」(仅统计)。
- 把
block_trade买方buyi聚合,识别活跃机构席位(呼应第 27 篇)。
下篇预告
A股量化数据工程:从 REST 接口到策略信号(第 29 篇):多源数据融合:统一因子表设计
下一篇把前 28 篇所有维度(指数/板块/财务/北交/选股/机构/龙虎榜)融合成一张统一因子表,给出跨源对齐与落库设计。
免责申明:本篇全部代码、接口调用仅作为量化编程学习演示,仅为数据演示,不构成投资建议。市场有风险,投资需谨慎。