🐡

書籍『わが投資術』とJQuantsAPIで小型株を分析してみた

2024/12/16に公開

本記事はマケデコAdvent Calendar 2024の記事として執筆しています。
https://qiita.com/advent-calendar/2024/market-api

自分は普段JQuantsAPIのpremium plan(月額16,500円)に契約してトレードしています。とはいえ爆益というわけではなく、今年はpremium planの手数料をどうにかペイできるくらいになる見込みです。来年はしっかりプラスにしたい…。

自分の戦略は機械学習をベースにした大型株の短期トレードなのですが、清原達郎氏の書籍『わが投資術 市場は誰に微笑むか』を読んで、小型株の長期トレードに興味を持ちました。この記事では、JQuants APIを使って簡単に分析してみた結果をまとめます。

書籍『わが投資術 市場は誰に微笑むか』について

伝説のサラリーマン投資家・清原達郎氏が自身の投資経験とノウハウをまとめた著書です。2024年3月に出版され、すでに24万部を突破するベストセラーとなっています。
この書籍については、botter_01さんの以下の記事でも紹介されています。

https://note.com/botter_01/n/nf9311663121b

検証内容

ネットキャッシュ比率について

この本で紹介されている手法の一つに、ネットキャッシュ比率というものがあります。計算式は以下の通りです。

ネットキャッシュ = 流動資産 + 投資有価証券 × 70% - 負債

ネットキャッシュ比率 = ネットキャッシュ / 時価総額

このネットキャッシュの意味としては、「会社が赤字になろうがなるまいが同じ値段で売れる資産+会社が持っている現金」を算出し、そこから全負債を差し引いた額とのことです。
この指標を用いた売買の戦略を(かなりざっくりですが)まとめると、以下になります。

  1. 時価総額500億円以下かつスタンダード株を対象に、ネットキャッシュ比率が高い銘柄をスクリーニングする。
  2. 経営者の考えやその会社の強み、競合関係などをもとに購入銘柄を決定する。

この記事では、手順1のネットキャッシュ比率の有用性を検証します。

検証方法

  • 2021年の決算短信をもとに、ネットキャッシュ比率を算出した。対象は2021年12月時点でのJASDAQ スタンダード株(659銘柄)とした(時価総額によるスクリーニングはしていない)。
  • 2021年最終取引日の終値から2024年12月6日終値までの約3年間での値上がり率を算出し、ネットキャッシュ比率と関連があるか確認した。

データの取得方法

以下で公開されているjquants-api-clientを使用してデータを取得しました。
https://github.com/J-Quants/jquants-api-client-python

ネットキャッシュ比率の算出に必要な流動資産投資有価証券負債は財務諸表のデータ(上記ライブラリのget_fins_fs_details_range)から、時価総額は財務情報(上記ライブラリのget_statements_range)から取得しました。ただ、財務諸表のデータは全銘柄&全期間取得するとDataFrameが4702列あり、どの項目を使うべきか難しかったです。
各項目を今回は以下のように算出しています。

流動資産の算出

get_fins_fs_details_rangeを使って取得した財務諸表のデータを用いて、以下のように算出しています。

# dfは財務諸表のデータ
cols_current_asset = [col for col in df.columns if 'Current assets' in col]
# ['FinancialStatement.Current assets',
#  'FinancialStatement.Current assets for incidental businesses-CA-GAS',
#  'FinancialStatement.Current assets (IFRS)',
#  'FinancialStatement.Current assets other than assets held for sale - CA (IFRS)']

# 最大値をとって1つの列に集約、これを流動資産として扱う
df_current_asset["CurrentAsset"] = np.nanmax(df[cols_current_asset].values, axis=1)

投資有価証券の算出

同じく財務諸表のデータから、以下のように算出しています。

# 列名を「Investment securities」で検索すると40件くらい出てくる。今回は以下の3つを使う。 
cols_investment_securities = [
    'FinancialStatement.Investment securities',
    'FinancialStatement.Short-term investment securities',
    'FinancialStatement.Investment securities - NCA (IFRS)',
]

# dfは財務諸表のデータ
# 合計をとって1つの列に集約、これを投資有価証券として扱う
df_investment_securities["InvestmentSecurities"] = np.nansum(df[cols_investment_securities].values, axis=1)

負債の算出

同じく財務諸表のデータから、以下のように算出しています。

# 列名を「Liabilities」で検索すると20件くらい出てくる。今回は以下を使う。 
cols_liabilities = [
    'FinancialStatement.Liabilities',
    'FinancialStatement.Liabilities (IFRS)'
]

# dfは財務諸表のデータ
# 最大値をとって1つの列に集約、これを流動資産として扱う
df_liabilities["Liabilities"] = np.nanmax(df[cols_liabilities].values, axis=1)

時価総額の算出

get_statements_rangeを使って取得した財務情報のデータを用いて、以下のように算出しています。

# 事前に開示日後の終値を結合しておく(コードは割愛)
# 期末発行済株式数との積から時価総額を算出
merged_df["MarketCap"] = merged_df["close"] * merged_df["NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock"]

結果

まず、算出した2021年時点のネットキャッシュ比率のヒストグラムを以下に示します。

0付近を中心に-2~2あたりで分布が広がっていることがわかります(マイナスへの外れ値も目立ちますが)。書籍によると、ネットキャッシュ比率が高いほど割安な銘柄であり、1を超える銘柄は「会社がただで買えるほど割安」とのことです。

次に、2021年取引最終日から現在(2024年12月6日)までの約3年間株式を保有した場合のリターンとの関連を確認してみます。算出したネットキャッシュ比率の大きさをもとに10分割のbinningを行い、各binのリターンの分布を箱ひげ図で比較します。

この図で、大きい数字のbinほどネットキャッシュ比率が高い群になります。縦軸はリターンです。ちょっとわかりにくいので、以下に各binのリターンの中央値を棒グラフにしたものも示します。

この図を見ると、ネットキャッシュ比率が高い銘柄はリターンが比較的高かったことがわかります。とはいえネットキャッシュ比率が低すぎてもリターンが高いのが謎です。(一部銘柄のネットキャッシュ比率の算出にミスがあるのかも)

中央値の結果を示しておいてなんですが、この書籍では、小さな儲けで頻繁に売り買いするよりも「最低2倍は狙うべき」と書かれています。なのでネットキャッシュ比率の各ビンでリターンが100%を超えたものがいくつあるか確認します。

bin 全銘柄数 リターン100%以上の銘柄数 割合
0 56 4 7.1%
1 57 6 10.5%
2 57 4 7.0%
3 52 7 13.5%
4 56 3 5.4%
5 53 3 5.7%
6 54 3 5.6%
7 54 4 7.4%
8 52 4 7.7%
9 58 7 12.1%

うーん微妙…。何か改善の余地がありそうです。

今後の検討事項

  • この分析では上場廃止した銘柄を考慮していない(ネットキャッシュ比率やリターンが欠損値になり結果に含まれていない)ので修正が必要。
  • 財務諸表のデータの取り扱いが怪しい。もう少し精査すべき。
  • 検証年や期間のパターンを増やし、汎用性を確認する。
  • ネットキャッシュ比率の有用性を確認できたとして、それでスクリーニングしたあとの購入銘柄の選定方法も考える必要がある。

Discussion