騰落幅は実は二種類ある
一日でどれだけ動いたかを測る方法は一つではない。よく使う騰落率は、今日の終値を前日終値で割った値だ。6,257 から 6,358 で終われば 1.62%。一日がどこで終わったかを見ている。
もう一つが日中高安幅で、その日の高値から安値を引き前日終値で割る。一日のうちにどれだけ揺れたかを見る。本稿で騰落幅と言うときはこの二つを合わせて指す。
実際の一日が、両方を見るべき理由を示す。2026年7月29日の KOSPI は終値ベースで 5.98% 下げたが、その日の高値と安値の差は 16.03% あった。終値で見れば大幅安の日だが、日中に売買した人にはまったく別の一日だった。
この二つを測るには終値だけでは足りず、始値・高値・安値・終値が要る。だからデータソースが効いてくる。
無料チャートサイトでは足りない理由
相場を無料で提供する先は多く、値が間違っていることはまれだ。問題は別の形で出る。足がまるごと欠ける。
Yahoo Finance で 2026年8月4日の KOSPI 日足を取ると、始値・高値・安値・終値がすべて 6,358.95 になる。一日中まったく動かなかったという意味だが、取引所の原本は始値 6,351.38、高値 6,389.40、安値 6,080.25、終値 6,358.95 で、その日の高安幅は 4.94% だった。
怖いのは、この誤りが静かなことだ。値が違えば不自然さで気づくが、潰れた足は計算に 0% として入り、平均を静かに下げる。その一日だけで高安幅の平均が狂い、そういう日が重なれば区間全体が実際より穏やかに見える。
無料ソースの壊れ方は誤った値ではなく、欠けるか潰れた足である。だから国内指数・銘柄の日次データは取引所の原本を使う。
KRX Open API の申請 — 画面表記どおりの四段階
韓国取引所は openapi.krx.co.kr で Data Marketplace OPEN API を運営している。トップに STEP 01 から STEP 04 までのカードが四枚あり、実際の手順がその四つだ。
サービスは指数・株式・証券商品・債券・派生商品・一般商品・ESG の七つに分かれる。KOSPI の日次データを含む指数サービスは API を五つ提供し、json と xml の二形式で応答する。
| ステップ | サイト上の名称 | やること |
|---|---|---|
| STEP 01 | ログイン/認証キー申請 | Data Marketplace に会員登録してログインし(法人は事業者情報の登録、個人は本人認証またはソーシャルログイン)、認証キーを申請して管理者の承認を待つ。 |
| STEP 02 | API サービス一覧の検索 | サービス一覧と仕様書から使いたい API を探す。KOSPI の日次データは指数カテゴリの kospi_dd_trd。サンプル機能で呼び出しを事前にテストできる。 |
| STEP 03 | API 利用申請 | 呼び出す API ごとに利用申請を出し、再び管理者の承認を待つ。認証キーの承認とは別の段階である。 |
| STEP 04 | 開発適用とサービス開始 | 承認されればその API を呼び出せる。 |
最初の呼び出しは curl 一行
承認が下りれば呼び出し自体は単純だ。ベース URL にサービス名をつなぎ、認証キーを 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"
}
]
}自分でクオンツ — Python 30行で騰落幅を測る
クオンツというと大げさに聞こえるが、出発点は価格データを取って自分で統計を出すことだ。他人が作った指標を読む代わりに定義を手で実装すると、その数字が何を数えているのかが正確にわかる。
以下は標準ライブラリだけで完結するスクリプトだ。インストールするものはなく、発行された鍵を環境変数 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 は鍵は生きているがそのサービスの利用申請をしていない、という意味だ。適当な文字列を鍵にして同じ URL を叩き、文面が変わるか見ればすぐ判別できる。
第二に、アクセスの軸が逆だ。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 の日次騰落幅は大きくなった。実測変数は騰落率と高安幅であり、その値が大きくなったという事実までがデータの保証する範囲である。なぜ大きくなったかは、この表では判定できない。
自分で測ることの値打ちはそこにある。他人の結論を受け取って読むだけでは、その結論がどこまで根拠を持つのか分からない。自分で測れば自分の数字が何を数えたか正確に分かるので、その境界で止まることができる。
