FINRA日次空売り出来高データの取得方法
curlでFINRAのReg SHO日次ファイルを取得し、列を確認してawkで銘柄の空売り比率を計算します。日付を固定した再現可能な手順です。
FINRAの日次空売り出来高データをダウンロードするには、FINRAの公開コンテンツサーバーから取引日ごとにプレーンテキストファイルを一つ取得します。ログインもAPIキーも必要ありません。ファイルはRegulation SHO Daily Short Sale Volumeファイルです。パイプ区切りの各行に銘柄ごとのデータが記載され、FINRAの報告施設に報告された取引所外取引について、その日の空売り出来高、総出来高、空売り免除分が収録されています。
このガイドでは、過去の日付として2026年6月12日を指定し、新規のUbuntuコンテナで手順を進めます。curlをインストールし、ファイルを取得して列を確認した後、awkで一つの銘柄の空売り比率を計算します。各コマンドは、今日実行しても、1年後に実行しても、そのまま動作します。
FINRAは日次の空売り出来高ファイルをどこで公開しているか
取引日の統合ファイルは、予測可能なアドレスにあります。
https://cdn.finra.org/equity/regsho/daily/CNMSshvolYYYYMMDD.txt
YYYYMMDDを取引日に置き換えてください。CNMSは統合NMSファイルです。NMS(National Market System)は、取引所に上場している銘柄群を指します。このファイルには、FINRAのすべての取引報告機関(TRF)に報告された取引を合算した、上場株式全体のデータが収録されています。FINRAは各日のファイルを、遅くとも取引日当日の東部時間午後6時までに公開します。公開される空売りデータとしては、ほぼ最速です。
一方、対象範囲には制約があります。このファイルが集計するのは、FINRAの取引報告機関に報告された取引だけです。実務上は、個人投資家の注文を執行するホールセール業者やダークプールなど、取引所以外で執行された取引を指します。取引所自体で約定した取引は含まれません。そのため、総出来高の列は常に、価格チャートに表示される当日の出来高より小さくなります。
ファイルが存在するのは取引日だけです。週末や取引所の休場日に当たる日付を指定すると、サーバーは空のファイルではなく「403 Forbidden」を返します。カレンダーに沿って処理するスクリプトは、その日付をスキップするか、エラーを許容する必要があります。
ステップ1:curlを導入した新しいUbuntuコンテナ
クリーンなコンテナから始め、curlをインストールします。Ubuntuのベースイメージにはawk(mawkとして)がすでに含まれているため、ほかに必要なものはありません。
docker run --rm -it ubuntu:24.04 bash
apt-get update && apt-get install -y curl
ステップ2:特定の日付のFINRA日次ショートボリューム・ファイルをダウンロードする
日付を固定します。「today」を基にしたコマンドは、週末や祝日に機能しません。FINRAがファイルを掲載する前の毎朝も同様です。2026年6月12日は通常取引が行われた金曜日で、ファイルはサーバーに保存されています。
curl -fsSLO https://cdn.finra.org/equity/regsho/daily/CNMSshvol20260612.txt
各フラグの意味は次のとおりです。-fはHTTPエラー時にcurlを失敗させ、エラーページをデータとして保存しないようにします。-sは進捗メーターを非表示にします。-Sは実際のエラーを引き続き表示します。-Lはリダイレクトに従います。-Oはリモート側のファイル名で保存します。取得したファイルの先頭と末尾を確認します。
head -3 CNMSshvol20260612.txt
tail -1 CNMSshvol20260612.txt
1行目はヘッダーで、Date|Symbol|ShortVolume|ShortExemptVolume|TotalVolume|Marketです。最終行はトレーラーで、ファイル内のデータレコード件数を示す整数だけが記載されています。したがって、どのパーサーでもこの両方を除外する必要があります。次に、翌日の暦日である6月13日土曜日を指定し、週末のルールを確認します。
curl -fsSLO https://cdn.finra.org/equity/regsho/daily/CNMSshvol20260613.txt
Curlはエラーを表示して終了コード22で終了します。サーバーが403を返し、-fが拒否したためです。2026年6月19日のJuneteenth祝日でも同じ結果になります。同じ系列の保存済みコピーを見ると、取引日ごとに1行だけがあり、その間にデータがないという暦の形が直接確認できます。
| 取引日 | 曜日 | セッション名 | 報告対象シンボル数 | シンボル名 |
|---|---|---|---|---|
| 2026-06-01 | Monday | June 1 | 15118 | 15.12 thousand |
| 2026-06-02 | Tuesday | June 2 | 14907 | 14.91 thousand |
| 2026-06-03 | Wednesday | June 3 | 14839 | 14.84 thousand |
| 2026-06-04 | Thursday | June 4 | 5136 | 5.14 thousand |
| 2026-06-05 | Friday | June 5 | 14740 | 14.74 thousand |
| 2026-06-08 | Monday | June 8 | 14815 | 14.81 thousand |
| 2026-06-09 | Tuesday | June 9 | 14751 | 14.75 thousand |
| 2026-06-10 | Wednesday | June 10 | 5694 | 5.69 thousand |
| 2026-06-11 | Thursday | June 11 | 14687 | 14.69 thousand |
| 2026-06-12 | Friday | June 12 | 14734 | 14.73 thousand |
| 2026-06-15 | Monday | June 15 | 14948 | 14.95 thousand |
| 2026-06-16 | Tuesday | June 16 | 5631 | 5.63 thousand |
| 2026-06-17 | Wednesday | June 17 | 14611 | 14.61 thousand |
| 2026-06-18 | Thursday | June 18 | 14700 | 14.70 thousand |
| 2026-06-22 | Monday | June 22 | 14922 | 14.92 thousand |
| 2026-06-23 | Tuesday | June 23 | 5767 | 5.77 thousand |
| 2026-06-24 | Wednesday | June 24 | 14743 | 14.74 thousand |
| 2026-06-25 | Thursday | June 25 | 14716 | 14.72 thousand |
| 2026-06-26 | Friday | June 26 | 15052 | 15.05 thousand |
| 2026-06-29 | Monday | June 29 | 5489 | 5.49 thousand |
各数値の背後にある正確なSQL
SELECT
toString(date) AS trade_date,
formatDateTime(date, '%W') AS weekday,
concat(monthName(date), ' ', toString(toDayOfMonth(date))) AS session_label,
count(DISTINCT ticker) AS symbols_reported,
formatReadableQuantity(count(DISTINCT ticker)) AS symbols_label
FROM global_markets.stocks_short_volume
WHERE date >= '2026-06-01'
AND date < '2026-07-01'
GROUP BY date
ORDER BY date2026年6月には、21件の日付付きファイルが生成されました。最初のファイルであるJune 1は、Mondayで、15.12 thousand銘柄を収録していました。パネル内の各行はすべて平日で、6月19日の行はありません。
FINRAの空売り出来高ファイルにおける各列の意味
各データ行には、パイプ文字で区切られた六つのフィールドがあります。
Dateは、YYYYMMDD形式の取引日です。Symbolは、最大14文字のtickerです。ShortVolumeは、FINRAに報告された取引でその日に空売りされた株式数です。short exempt取引を含みます。ShortExemptVolumeは、そのうちshort exemptとして指定された分です。Reg SHO Rule 201の価格テスト、つまり株価が前日の終値から10%下落した後に空売りを制限するサーキットブレーカーの適用除外として表示された売りを指します。TotalVolumeは、その日に当該symbolについて報告された全株式数です。空売りと買い持ちの売りを合算しています。Marketは、報告した取引報告機関です。NはNYSE TRF、QはCarteretのNasdaq TRF、BはシカゴのNasdaq TRF、DはAlternative Display Facility(ADF)を示します。
統合ファイルのMarketフィールドには、そのsymbolを報告したすべての取引報告機関がカンマ区切りで記載されます。そのため、行末はB,Q,Nのようになります。カンマを含むため、ファイルでは区切り文字にパイプ文字を使用しています。
予算に入れておくべき最近の変更が一つあります。2026年2月23日以降、三つの出来高フィールドには小数点以下六桁までの端株が含まれます。小数点以下に六桁ある値は通常の形式です。それ以前の日付のファイルは整数のみです。整数型に変換するパーサーを使うと、新しいファイルの値が警告なく切り捨てられます。
awkでショート・ボリューム比率を計算する方法
ショート・ボリューム比率は、ショート・ボリュームを総出来高で割り、パーセンテージで示したものです。単一銘柄なら、次のawkの一行で計算できます。
awk -F'|' '$2 == "AAPL" { printf "%s %s short=%s total=%s ratio=%.1f\n", $1, $2, $3, $5, 100 * $3 / $5 }' CNMSshvol20260612.txt
-F'|'はパイプをフィールド区切り文字に設定し、$2 == "AAPL"はAAPLの行だけを抽出します。ヘッダーと末尾の行は一致しません。printfは3番目のフィールドを5番目のフィールドで割ります。銘柄を任意のものに置き換えてください。下のパネルは、保存されたFINRAの系列から代表的な6銘柄について同じ日付のデータを読み込み、株数を百万株単位に丸めています。先ほど実行したコマンドの結果と照合できます。
| ticker | 空売り出来高(百万) | 総出来高(百万) | 空売り比率(%) |
|---|---|---|---|
| AAPL | 6.66 | 13.16 | 50.6 |
| AMZN | 5.88 | 21.76 | 27 |
| KO | 2.06 | 3.65 | 56.3 |
| MSFT | 3.73 | 14.24 | 26.2 |
| NVDA | 15.19 | 45.34 | 33.5 |
| SPY | 7.48 | 15.48 | 48.3 |
各数値の背後にある正確なSQL
SELECT
ticker,
round(toFloat64(max(short_volume)) / 1e6, 2) AS short_volume_millions,
round(toFloat64(max(total_volume)) / 1e6, 2) AS total_volume_millions,
round(100 * toFloat64(max(short_volume)) / toFloat64(max(total_volume)), 1) AS short_pct
FROM global_markets.stocks_short_volume
WHERE ticker IN ('AAPL', 'AMZN', 'KO', 'MSFT', 'NVDA', 'SPY')
AND date = '2026-06-12'
GROUP BY ticker
HAVING max(total_volume) > 0
ORDER BY ticker2026年6月12日のAAPLについて、ファイルには6.66百万株のショート売買高が記録されています。総報告出来高は13.16百万株で、ショート・ボリューム比率は50.6%です。他の5銘柄もほぼ同じ水準です。このファイルでは通常の状態です。比率が二分の一前後でも、見た目ほど警戒すべき状況ではない理由については、後のセクションで説明します。
単一日のデータはスナップショットにすぎず、比率はセッションごとに変動します。日付ごとにファイルを一つずつダウンロードすれば、1カ月分の系列を構築できます。
CNMSファイルと施設別ファイルの違いは何ですか?
CNMSは合計値です。FINRAは同じスケジュールで、報告施設ごとに一つのファイルも公開しています。レイアウトと日付スタンプは同じですが、プレフィックスが異なります。Nasdaq TRF Carteret(Market Q)はFNSQshvol、Nasdaq TRF Chicago(B)はFNQCshvol、NYSE TRF(N)はFNYXshvol、ADF(D)はFNRAshvolです。5つ目のFORFshvolはOTC Reporting Facilityを対象とします。ここでは非上場OTC株式を扱うため、CNMSには含まれません。指定された日付のCarteretファイルを取得し、同じ銘柄を抽出します。
curl -fsSLO https://cdn.finra.org/equity/regsho/daily/FNSQshvol20260612.txt
awk -F'|' '$2 == "AAPL"' FNSQshvol20260612.txt
FNQCshvol20260612.txtとFNYXshvol20260612.txtに対して同じ2行を実行すると、3つのShortVolumeフィールドの合計が小数点以下までCNMSの数値と一致します。その日付のADFファイルには、ヘッダーと0のトレーラーしかありません。これはよくあることです。AAPLの内訳は次のとおりです。
| 取引所 | 空売り出来高(百万) | 統合値に占める比率(%) |
|---|---|---|
| Consolidated (CNMS) | 6.659 | 100 |
| Nasdaq TRF Carteret (Q) | 6.412 | 96.3 |
| NYSE TRF (N) | 0.194 | 2.9 |
| Nasdaq TRF Chicago (B) | 0.053 | 0.8 |
| ADF (D) | 0 | 0 |
各数値の背後にある正確なSQL
SELECT
tupleElement(v, 1) AS venue,
round(tupleElement(v, 2) / 1e6, 3) AS short_volume_millions,
round(100 * tupleElement(v, 2) / consolidated, 1) AS share_of_consolidated_pct
FROM
(
SELECT
consolidated,
arrayJoin([
('Consolidated (CNMS)', consolidated),
('Nasdaq TRF Carteret (Q)', carteret),
('Nasdaq TRF Chicago (B)', chicago),
('NYSE TRF (N)', nyse),
('ADF (D)', adf)
]) AS v
FROM
(
SELECT
toFloat64(ifNull(max(short_volume), 0)) AS consolidated,
toFloat64(ifNull(max(nasdaq_carteret_short_volume), 0)) AS carteret,
toFloat64(ifNull(max(nasdaq_chicago_short_volume), 0)) AS chicago,
toFloat64(ifNull(max(nyse_short_volume), 0)) AS nyse,
toFloat64(ifNull(max(adf_short_volume), 0)) AS adf
FROM global_markets.stocks_short_volume
WHERE ticker = 'AAPL'
AND date = '2026-06-12'
)
)
ORDER BY tupleElement(v, 2) DESCその日のAAPLの取引所外ショート出来高の96.3%をNasdaq TRF Carteret (Q)が占めていました。Nasdaq TRF Carteretは、市場全体の取引所外取引の報告の大半を処理しています。この内訳からも、その状況が分かります。施設別ファイルは、約定がどの取引施設を経由したかを確認したい場合に重要です。それ以外は、統合ファイルを使います。
FINRAのshort volumeがshort interestではないのはなぜか
Short volumeはフローです。これは一セッション中に空売りされた株式数で、取引所外取引だけを対象とします。Short interestはストックです。決済日に空売り残高として残っている株式数を指します。FINRAはこれを月二回収集し、おおむね二週間後に公表します。両者は一致しません。Short volume比率が高くても、大きな空売りポジションがあるとは限りません。マーケットメーカーが、保有していない在庫から顧客の買い注文を約定させる場合、空売りを行い、short saleとして記録されます。一時間後に買い戻せば、ファイルには空売りだけが残り、買い戻しの記録は残りません。通常の日には、流動性の高い銘柄の比率はおおむね二分の一です。上記の六銘柄パネルが示すとおりです。このマーケットメイクの仕組みが標準的な説明となります。Short interestとshort volumeの違いではこの概念を詳しく説明し、short interestとは何かではポジションの側面を扱います。本稿ではファイルの取得方法に焦点を当てます。ポジション系列そのものについては、まずFINRAのshort interestデータを確認してください。そのうえで、公表までの遅れについてはshort interestの公表時期とshort interestが二週間古い理由を参照してください。
FINRAのショートボリューム・ファイルに特有の注意点
初めて利用する際に注意すべき点がいくつかあります。取引所は本番システムでテスト用シンボルを処理しており、NasdaqのZVZZTファミリーがその代表例です。これらの銘柄では、実在するように見える出来高がファイルに記録されることがあります。チャート化する前に、上場銘柄として確認できないシンボルは除外してください。
まれに、FINRAは数値を修正した取引日のファイルを再掲載します。カタログページでは「Updated」と表示されます。そのため、取引日の夜に取得した数値が、1週間後に同じファイルを取得した際の数値と異なる場合があります。引用する前に、再取得してください。
トレーラー行はパイプ記号を含まない単独の件数です。すべての行に6つのフィールドがあると仮定する単純なパーサーでは、ここで処理が停止します。
2026年2月23日以降の出来高は小数で、それ以前は整数です。対象となるのは通常取引時間中の取引に限られます。また、FINRAのファシリティにオフエクスチェンジ取引として報告されたものに限られます。そのため、総出来高の列がコンソリデーテッド・テープと一致することはありません。
これらはファイルの仕様であり、不具合ではありません。こうした特性を把握したパーサーを使えば、正確な数値を取得できます。
よくある質問
FINRAの日次空売り出来高データは、どこから無料でダウンロードできますか?
FINRAの公開コンテンツサーバー(cdn.finra.org/equity/regsho/daily/)からダウンロードできます。NMS全体のファイルは、取引日ごとにCNMSshvolYYYYMMDD.txtという名前で提供されています。アカウントは不要で、curlコマンド一行で取得できます。FINRAのウェブサイトには、最大七日分を一度にCSVでエクスポートできるインタラクティブ画面もあります。
週末や祝日のFINRA空売り出来高ファイルがないのはなぜですか?
ファイルは取引日についてのみ作成されます。週末や取引所の休場日に当たる日付をリクエストすると、空のファイルではなくHTTP 403が返されます。そのため、カレンダーを順に処理するスクリプトでは、非取引日を除外するか、エラーを許容する必要があります。
FINRAの日次空売り出来高は、空売り残高と同じですか?
いいえ。空売り出来高は、場外取引で一日に空売りされた株数を示します。数分以内に買い戻されるマーケットメーカーの空売りも含まれます。一方、空売り残高は決済日にまだ残っている空売りポジションを示し、月二回集計されます。流動性の高い銘柄では、空売り出来高比率が50%近くになるのは珍しくありません。この比率から、未決済の空売りポジションの規模は判断できません。
FINRAの空売り出来高ファイルに小数が含まれるのはなぜですか?
2026年2月23日以降、FINRAはNMS銘柄について、三つの出来高フィールドすべてで小数株数を小数点以下六桁まで報告しています。それ以前のファイルは整数株数のみです。そのため、整数型に変換するパーサーでは、新しいファイルの小数部分が切り捨てられます。
FINRAの空売り出来高ファイルにあるMarket列は何を意味しますか?
取引報告を受け付けたFINRAの施設を示します。NはNYSE TRF、QはCarteretのNasdaq TRF、BはChicagoのNasdaq TRF、DはADFです。統合版のCNMSファイルでは、その銘柄を報告したすべての施設がカンマ区切りで記載されます。
上記の各パネルには、その下にSQLが表示されます。いずれかを展開すると、数値の計算方法を確認できます。ファイルをダウンロードせずに銘柄の空売り出来高の推移を取得するには、Strasmore terminalで平易な英語を使って依頼してください。