🚑

日々公表取得APIで、超高リスク空売り戦略を作る

に公開

はじめに

はじめまして、塩辛botterと申します。
日本株、仮想通貨のbot構築をメインで扱っています!

本記事はマケデコ Advent Calendar 2025の10日目の記事として執筆しています。

https://qiita.com/advent-calendar/2025/market-api

日々公表APIとの出会い、

最近はもっぱら仮想通貨がメインで、日本株がおざなりになっているのですが、ある日 Xに流れてきたポストを見て、久々に日本株を検証しようという気になりました。
https://x.com/JPX_official/status/1958803901479887301

日々公表信用取引残高データがAPIでとれるだと! これはエッジになる! と興奮した記憶があるのですが、このポストが8月下旬なので、3か月以上放置してしまっていました・・。

アドベントカレンダーのおかげで、重い腰を上げて分析を始めることができました。
本当は月1で記事を書きたいのですが、毎年この時期にしか書いていないですね。。。

日々公表APIとは?

正式には「日々公表信用取引残高」と書かれています。J-Quants APIのStandardプラン以上であれば取得できます。

公式Docはこちら

日本株、特に中小型株に慣れ親しんだ方はご存じだと思いますが、信用取引が活況を呈し、出来高が急上昇してくると、日本証券取引所(JPX)や日証金(JSF)が様々な形で注意喚起を促したり、こまめな情報提供をしたり、果ては取引の一部を制限するようになります。

たとえば信用取引の残高は週1の更新が基本ですが、日々公表銘柄に指定されると、名前の通り毎日残高が公表されるようになります。

そういった注意喚起の履歴を過去にさかのぼって取得できるAPIです。
これがなぜエッジにつながるかは後述します。

さて、公式Docを見ると、公表の種類としては以下6つがあるようです。
(これ以外にもたくさんの情報が取れるのですが、今回の記事では割愛しています)

No 意味 項目
1 Restricted 1の場合、東京証券取引所が定める信用取引の規制措置銘柄に選定されている。0の場合、非該当。
2 DailyPublication 1の場合、東京証券取引所が定める日々公表銘柄に選定されている。0の場合、非該当。
3 Monitoring 1の場合、東京証券取引所が定める特別注意銘柄に選定されている。0の場合、非該当。
4 RestrictedByJSF 1の場合、日本証券金融が定める貸株申込制限措置銘柄に選定されている。0の場合、非該当。
5 PrecautionByJSF 1の場合、日本証券金融が定める貸株注意喚起銘柄に選定されている。0の場合、非該当。
6 UnclearOrSecOnAlert 1の場合、東京証券取引所が定める不明確情報等により注意喚起の対象となった銘柄、特別注意銘柄等に選定されている。0の場合、非該当。

むむ、となりますが、No2がいわゆる「日々公表」銘柄ですね。
No4はいわゆる「売り禁」、No5は「貸株注意喚起」とよく証券会社のアプリに表記されているものでしょう。

No1,3はちょっとよくわかっていませんが、No6は以下のサイトで公表されているものとほぼイコールだと思います。

https://www.jpx.co.jp/listing/measures/alert/index.html

メタプラネットの事例

今年活況だった中小型株といえば、メタプラネットでしょう。
年初めは400円弱だったのが、6月中にはピークの1,930円を付け、5倍近くまで跳ね上がりました。
メタプラネットについてどういった情報がAPIで取得できたか図示したのが以下です。

# Restricted, DailyPublicationしかなかったのでこの2つをプロット
df[['PublishReason.Restricted', 'PublishReason.DailyPublication']].plot(marker='o')

6/2に日々公表(DailyPublication)になり、その後6/8に規制(Restricted)が入りました。その後、7/1に日々公表に戻り、最終的に7/8にはそれも解除されたようです。

チャートに表現するとこんな感じで、やはり急上昇していく中で規制が入り、相場が落ち着てきたところで解除されていることがわかります。

空売りできる、できないの判定には不十分

日本株のbotterあるあるとして、「空売りできない銘柄なのに、バックテストでは空売りしている問題」があります。

これの解決策になるかな、と思いましたが空売りできる、できないをこのAPIだけで判断するのは難しそうです。
RestrictedByJSF == true が売り禁であることは確かですが、RestrictedByJSF == false だからといって空売り可能というわけではありません。以下の場合は空売りができないのです。

  • そもそも信用銘柄ではない
  • 信用銘柄ではあるが、貸借銘柄ではない
  • 証券会社独自の規制で空売りを禁止している。例えば楽天証券はここで公表されています。

件数を分析してみる

エッジを探す旅の手始めに、過去10年間で規制がどの程度発生しているかをカウントしました。

種別 件数
PublishReason.Restricted 15,993
PublishReason.DailyPublication 71,025
PublishReason.Monitoring 0
PublishReason.RestrictedByJSF 130,655
PublishReason.PrecautionByJSF 216,001
PublishReason.UnclearOrSecOnAlert 7,621

結果から以下が見えてきます。

  • Monitoringが 0 件である。無視してもよさそう
  • DailyPublication(日々公表)は71,025件、年間210営業日として、平均34件/日程度が対象となっている
  • PrecautionByJSF(貸株注意喚起)が216,001件で断トツ。平均100件/日 超である。

実際に日々公表のサイトや、JSF(日証金)のサイトに行って当日の件数を見ましたが、大きく外れていないのでよさそうです。

次に大型株に対する影響を見たいので、TOPIX100に絞り、再度件数をカウントしました。

種別 件数
PublishReason.Restricted 0
PublishReason.DailyPublication 0
PublishReason.Monitoring 0
PublishReason.RestrictedByJSF 239
PublishReason.PrecautionByJSF 495
PublishReason.UnclearOrSecOnAlert 24

激減しましたね。売り禁が239件ありますが、10年×100銘柄でこれだけなので、発生確率は0.114%程度です。

大型株しか触らない人にとってはほぼ無視できるレベルではないかと思います。

※手元のTOPIX100銘柄を過去にわたって適用している(時系列で組み替えていない)ので、実際は多少ずれがあることにご容赦ください。

規制が入るとリターンが下がる

続いてリターンへの影響を見てみます。

OHLCVデータに、今回取得した日々公表データをLEFT JOINする形でリターンを計算します。
日中リターンと、夜間リターンでそれぞれ分析しました。

種別 日中リターン(%) 夜間リターン(%)
PublishReason.Restricted -0.3165 -0.2682
PublishReason.DailyPublication -0.2661 -0.017
PublishReason.RestrictedByJSF -0.2139 -0.0141
PublishReason.PrecautionByJSF -0.0588 0.0246
PublishReason.UnclearOrSecOnAlert -0.1916 0.1441
全体 0.0032 0.5341

「全体」は全銘柄・全期間の平均値です。

結果を見てビビりました。規制が入るとむっちゃリターン下がるやん。
この表を見てしまうと、日々公表や信用規制の銘柄に買い向かっていく人は相場の養分だなあ、と思ってしまいます。

PublishReason.Xxxのうち、どれか一つでも"1"になっている銘柄は取引の対象外とすることで、期待値やシャープレシオが向上するのではないでしょうか。特に中小型株のbotで有効でしょう。

超高リスク空売り戦略

先ほどの表を見ると、だれもがこう思うのではないでしょか?

ー 規制が入った銘柄を空売りし、規制解除で買い戻せば爆益では?

嫌な予感はするのですがバックテストしてみました。

条件は以下の通りで、ハイボラの銘柄だけをターゲットにするため、かなり保守的な資産配分にしています。

  • 全銘柄を対象にする
  • 日々公表(DailyPublication)が 0 → 1になったら、翌営業日の寄り付きで空売りする。
  • 一つの銘柄で重複してポジションは持たない
  • 最大保有銘柄は20銘柄までとし、各仕掛けは資産の1/20とする。
  • 20営業日後の引けに買い戻す。
  • 単利で運用

シグナルは以下のような感じで作り出します。

df_bt["prev_daily_pub"] = df_bt.groupby("Code")["PublishReason.DailyPublication"].shift(1).fillna(0).astype(int)
df_bt["entry_signal"] = (df_bt["prev_daily_pub"] == 0) & (df_bt["PublishReason.DailyPublication"] == 1)

結果は以下の通り

勝率65%, トレード数1,915件、期待値3.92%(手数料抜き)でした。
最大ドローダウンは決済ベースであること(日々の含み損まで見ていないこと)に注意してください。

損益曲線だけ見るといけそうな気がしますが、私は乗り気になれず、お蔵入りしました。
以下のような課題、リスクがあり、とてもおすすめできないです。

本当に空売りできるのか問題

日々公表時点ではJPXの取引規制には至っていないものの、証券会社の独自の規制があるとバックテスト通りには売れない可能性があります。

逆日歩リスク

同じことを考える人が多く、空売り残高が増えると、一気に高額な逆日歩がつくリスクがあります。
さらにマーケットインパクトや信用金利も重くのしかかってきます。
3.92%の期待値はかなり削られるでしょう。

なお過去にさかのぼって逆日歩の履歴をとるAPIはないので、正確にこれをバックテストに反映するのは困難です。

追証リスク

最大ドローダウンは、決済ベースであることは先述の通りです。
日々公表銘柄のボラは非常にやばいです。死にます。
たとえばバックテスト上、±0%で終わっていた取引でも、一時的に含み損が100%を超えていた可能性もあります。

100回買っても、101回目で追証になりすべて失うリスクがあることを念頭に入れる必要があります。

特に複利運用は厳しいと思います。試しに複利でグラフを書いていただくとよくわかると思います。

メンタルリスク

追証リスクとも関連しますが、踏み上げを食らっても平穏でいられる人はそういないです。
優良株を買っているときの含み損と、中小型株を空売りしているときの含み損はなんというか「質」が違う気がします。

バックテスト通りにいかないケースも多々想定され、運用中はストレスフルになること間違いなしです。
これまで様々なbotを運用してきましたが、これほどストレスになりそうなbotは未経験です。
おすすめできない一番の理由はこれですね。

まとめ

いかがでしたでしょうか。いろいろ書きましたが、一昔前に個人がこれらの信用規制データを集めるのは本当に難しかったです。

それがAPIで簡単に、正確に、迅速に取得できるのは感無量です。

今回は時間がなくてできませんでしたが、日々公表APIでは信用残高の時系列データもとれるので、それを特徴量として踏み上げを予測するなど、様々な展開ができそうです。

今回のAPIはJPXに加えてJSF(日証金)のデータも取得するため、J-Quantsの中の人も調整や開発が大変だったかと推察します。このようなすばらしいプロダクトにいつも感謝しています!!

誤りや質問があればお気軽にコメントください。

Discussion