涨跌幅其实有两种
衡量一天内价格走了多远的方法不止一种。常用的是涨跌率,即今日收盘价除以昨日收盘价。从 6,257 到 6,358 就是 1.62%,它看的是一天在哪里结束。
另一种是盘中高低幅,即当日最高价减最低价后除以昨日收盘价,看的是一天之内震荡了多少。本文所说的涨跌幅同时指这两者。
一个真实的日子说明为何要同看两者。2026 年 7 月 29 日 KOSPI 收盘下跌 5.98%,但当日最高与最低之间相差 16.03%。按收盘看是大跌日,对日内交易者却是完全不同的一天。
要算这两个数,仅有收盘价不够,需要开盘、最高、最低、收盘四个价格。数据来源由此变得关键。
为什么免费行情网站不够用
提供免费行情的网站不少,数值出错的情况也很少见。问题出在别处:整根 K 线会缺失。
从 Yahoo Finance 取 2026 年 8 月 4 日的 KOSPI 日线,开高低收全部为 6,358.95,等于说全天没有波动。而交易所原始数据是开盘 6,351.38、最高 6,389.40、最低 6,080.25、收盘 6,358.95,当日高低幅为 4.94%。
可怕之处在于这种错误是无声的。数值错了看着别扭,被压平的 K 线却会以 0% 进入计算,悄悄压低均值。仅这一天就足以让高低幅均值失真,若有多天如此,整个区间都会显得比实际平静。
免费数据源的失效形态不是错值,而是缺失或被压平的值。所以韩国指数与个股的日行情要用交易所原始数据。
KRX Open API 申请 —— 官网标注的四个步骤
韩国交易所在 openapi.krx.co.kr 运营 Data Marketplace OPEN API。首页有 STEP 01 至 STEP 04 四张卡片,实际流程就是这四步。
服务分为指数、股票、证券商品、债券、衍生品、一般商品、ESG 七类。包含 KOSPI 日行情的指数服务提供 5 个 API,支持 json 与 xml 两种格式。
| 步骤 | 网站上的名称 | 操作内容 |
|---|---|---|
| STEP 01 | 登录 / 申请认证密钥 | 注册并登录 Data Marketplace(法人登记营业信息,个人使用实名认证或社交登录),随后申请认证密钥并等待管理员批准。 |
| STEP 02 | 检索 API 服务目录 | 在服务目录和说明书中找到所需 API。KOSPI 日行情为指数类别下的 kospi_dd_trd,可用示例功能先行测试调用。 |
| STEP 03 | 申请 API 使用 | 对每个要调用的 API 单独提交使用申请,再次等待管理员批准。此环节与密钥批准彼此独立。 |
| STEP 04 | 开发接入与服务开始 | 获批后即可调用该 API。 |
第一次调用只需一行 curl
获批之后调用非常简单。在基础地址后接服务名,把密钥放进名为 AUTH_KEY 的请求头,再用 basDd 传入一个基准日期即可。既不需要先换取令牌,也不需要签名。
实际数据位于 OutBlock_1 数组中。指数服务会一次返回当日 KOSPI、KOSPI 200 等多个指数,因此需筛选 IDX_NM 为 KOSPI 的那一行。价格字段是带千分位逗号的字符串,转换为数字前要先去除逗号。
curl -H "AUTH_KEY: $KRX_API_KEY" \
"https://data-dbg.krx.co.kr/svc/apis/idx/kospi_dd_trd?basDd=20260804"{
"OutBlock_1": [
{
"BAS_DD": "20260804",
"IDX_NM": "코스피",
"OPNPRC_IDX": "6,351.38",
"HGPRC_IDX": "6,389.40",
"LWPRC_IDX": "6,080.25",
"CLSPRC_IDX": "6,358.95"
}
]
}我也能做量化 —— 30 行 Python 测涨跌幅
量化听起来宏大,起点却是取到价格数据并亲手算统计量。与其阅读他人做好的指标,不如亲手实现定义,这样才能确切知道那个数字究竟在数什么。
下面是仅用标准库的完整脚本。无需安装任何包,只要把申请到的密钥放入环境变量 KRX_API_KEY 即可运行。它逐日遍历区间,取出 KOSPI 行,计算涨跌率与高低幅,输出平均值、中位数与极端日天数。
其中两行最关键:一行完全跳过周末,另一行在价格字段为空时跳过。后者就是休市判定。交易所在休市日同样返回行,只是价格为空字符串,因此以是否收到行来判断交易日会出错。
以 7 月 24 日至 8 月 4 日运行,结果如下。
扩大区间只需改日期。但 KRX 每次请求只返回一天,看 100 个交易日就要调用 100 次。若会反复请求同样的日期,建议把响应存盘复用。历史确定值不会变动,可永久缓存,唯独当天例外——盘中返回 0 条,若把这个空响应固化,那一天就会被永远当作休市日。
import os, json, statistics as st, urllib.request, datetime
KEY = os.environ["KRX_API_KEY"]
BASE = "https://data-dbg.krx.co.kr/svc/apis/idx/kospi_dd_trd"
def day(basDd):
req = urllib.request.Request(f"{BASE}?basDd={basDd}", headers={"AUTH_KEY": KEY})
rows = json.loads(urllib.request.urlopen(req, timeout=30).read())["OutBlock_1"]
for r in rows:
if r["IDX_NM"].strip() == "코스피" and r["CLSPRC_IDX"].strip():
f = lambda k: float(r[k].replace(",", ""))
return f("HGPRC_IDX"), f("LWPRC_IDX"), f("CLSPRC_IDX")
return None # 휴장일 — 행은 오되 가격 필드가 비어 있다
d, end, series = datetime.date(2026, 7, 24), datetime.date(2026, 8, 4), []
while d <= end:
if d.weekday() < 5: # 주말은 애초에 호출하지 않는다
v = day(d.strftime("%Y%m%d"))
if v:
series.append(v)
d += datetime.timedelta(days=1)
chg = [abs(series[i][2] / series[i-1][2] - 1) * 100 for i in range(1, len(series))]
rng = [(series[i][0] - series[i][1]) / series[i-1][2] * 100 for i in range(1, len(series))]
print(f"거래일 {len(chg)}일")
print(f"등락률 평균 {st.mean(chg):.2f}% · 중앙 {st.median(chg):.2f}%")
print(f"고저폭 평균 {st.mean(rng):.2f}% · 중앙 {st.median(rng):.2f}%")
print(f"±2% 넘은 날 {sum(1 for c in chg if c >= 2)}일")거래일 7일
등락률 평균 6.24% · 중앙 5.12%
고저폭 평균 8.42% · 중앙 6.23%
±2% 넘은 날 4일实测 —— 单一个股杠杆 ETF 上市前后
用同样的方法扩大区间,来回答一个真实问题。2026 年 5 月 27 日,以三星电子和 SK 海力士为标的的单一个股杠杆及两倍反向 ETF 集中上市。前后 KOSPI 的日涨跌幅是否发生了变化。
下表以等长区间对比上市前 48 个交易日(3 月 17 日至 5 月 26 日)与上市后 48 个交易日(5 月 27 日至 8 月 4 日)。同时给出平均值与中位数,是为了排除 7 月 31 日 17.91% 这类极端值单独抬高均值的可能。中位数同样上升,因此剔除那一天结论依然成立。
| 项目 | 上市前 48 个交易日 | 上市后 48 个交易日 | 倍数 |
|---|---|---|---|
| 日涨跌幅绝对值平均 | 2.56% | 4.08% | 1.59 倍 |
| 日涨跌幅绝对值中位数 | 2.11% | 3.62% | 1.71 倍 |
| 盘中高低幅平均 | 2.99% | 5.81% | 1.94 倍 |
| 盘中高低幅中位数 | 2.38% | 5.13% | 2.16 倍 |
| 涨跌超过 2% 的交易日 | 25 / 48 | 32 / 48 | 1.28 倍 |
第一天必然踩到的四个坑
第一,审批分两道。收到密钥批准邮件后立刻调用会得到 401。错误文案能区分原因:Unauthorized Key 表示密钥本身无效,Unauthorized API Call 表示密钥有效但未对该服务提交使用申请。用一串随意字符当密钥打同一地址,看文案是否改变,立刻就能判定。
第二,访问轴相反。Yahoo 给定代码与区间返回时间序列,KRX 给定一个基准日返回当日全部品种。取单一品种 150 天序列就要调用 150 次。作为补偿,取回的每个日期覆盖全部品种,因此按日期缓存后,增加观察品种不会新增调用。
第三,休市日同样返回行。请求周六仍会返回 1,155 行,但价格字段全为空字符串。以行数判断交易日会出错,应以是否有价格来判断。反过来说,这个判定正是最准确的交易日历定义。
第四,收盘价不做追溯调整。KRX 给出的是当日实际成交价,而 Yahoo 的收盘价是对拆股做了追溯调整的版本,两者恰好相反。混用两个数据源却统一套用一套拆股调整,会造成双重调整,历史持仓数量整体错位。调整逻辑必须按数据源分开。
最后要知道这个 API 的边界。它只提供 T+1 确定值,没有盘中现价、报价与逐笔成交。以当天日期请求,即使开盘也返回 0 条。需要实时行情请用券商 API,美股与汇率另寻数据源。
这些数字能说到哪一步
亲手测过之后会产生一个诱惑:上市后波动幅度扩大到 1.6 至 1.9 倍,于是想归因于那些 ETF。但同一份数据并不支持这个结论。
按月拆开看,波动率在上市之前就已在上行:1 月 1.15%、2 月 2.49%、3 月 3.64%、4 月 2.06%、5 月 2.91%、6 月 3.57%、7 月 4.89%。上市日并非拐点。而且上市后区间整体包含了指数单月下跌 22% 的 7 月急跌行情,波动最极端的交易日集中在上市两个月之后。
韩国资本市场研究院同样没有断言因果。同期 SK 海力士波动率由 90% 升至 101%,而美光由 85% 升至 126%、费城半导体指数由 46% 升至 75%,海外涨幅更大;该机构将其评价为再平衡交易影响与宏观不确定性等多重因素叠加的结果。
所以本文只能说到这里。上市前后 KOSPI 日涨跌幅确实扩大了。实测变量是涨跌率与高低幅,数据能保证的就是这两个值变大了。为什么变大,这张表判定不了。
亲手测量的价值正在于此。读别人的结论无法看清其证据的边界,自己测过才确切知道自己的数字数了什么,也才能在那个边界处停下。
