免責事項
本記事は投資助言を目的としたものではなく、技術・分析手法の紹介です。CAN-SLIM N 要素の評価フレームは教育目的であり、特定の銘柄・金融商品の売買を推奨するものではありません。投資判断はご自身の責任で行ってください。本記事中に SEC EDGAR・EDINET から取得した個別企業の有報全文は掲載していません(教育目的の短い概念引用に限定、利用規約に基づく方針)。CAN-SLIM はオニール(William J. O’Neil)著「How to Make Money in Stocks」で提唱された手法を基にエンジニア視点で再構築しています。
発展編のここまで、#22 C 要素・#23 A 要素・#24 C×A 複合判定で 定量的な成長加速度(C)と長期持続性(A)を Python で自動判定する実装ブロックを完結させました。本記事 #25 から発展編は「事業構造の質」という、定量化が難しい領域に踏み込みます。CAN-SLIM の N(New Product/Service/Management/High)を、製品アーキテクト視点で Python 自動判定する手順とサンプルコード入門です。
N 要素は CAN-SLIM 7要素の中で最も定量化が難しい領域です。新製品・新サービス・新経営陣の評価は、決算数値だけでは見えない事業構造の質を読み解く必要があります。しかし「製品開発 DX エンジニア」の視点からは、製品アーキテクト的なフレームで Phase Gate プロセスや製品ロードマップに当てはめることで、定性評価を半定量化に近づける余地があります。「絶対値より変化率、突発より連続性」という設計原則を、事業構造の質の経時変化に拡張するのが本記事の核心で、自動判定の閾値設計にも反映します。
多くの読者がぶつかる壁:
- N 4観点の整理: 「新製品」「新サービス」「新経営陣」「新株価高値」の4観点を、それぞれ独立に評価して N 要素スコアに統合する必要
- テキスト分析の粒度: SEC EDGAR の 10-K「Risk Factors」「Business」セクション、EDINET の有報「事業の状況」をどこまで自動解析するか(簡易キーワード vs LLM フル解析)
- 株価高値判定の罠: 「52週高値更新」だけで自動判定するとピーク掴みリスク。原典では「適切な押し目からの新高値」の文脈が重要
- 製品アーキテクト視点の翻訳: 製造業 DX の Phase Gate プロセスや製品ロードマップ管理を、銘柄評価にどう転用するか
筆者は製造業の研究開発部門で、新製品の Phase Gate 評価を製品アーキテクト視点で運用してきました。Gate 0(コンセプト)→ Gate 5(量産)の各段階で「事業構造の質」をチェックする作法は、CAN-SLIM の N 要素自動判定の同質の発想です。本業の経験を投資データに転用する典型例として、本記事のエピソードで詳しく整理します。
本記事で扱う専門用語の予習
- CAN-SLIM N 4観点: New Product / New Service / New Management / New (price) High。原典では「最近1-2年以内の新規要素」が成長株のシグナル
- 52週高値(52-week high): 過去52週間の最高値。「新高値更新」は CAN-SLIM N の “New High” の定量代理指標
- SEC EDGAR / EDINET: 米国 / 日本の有報・四半期報告書を電子開示する公的システム。10-K(米年次)・10-Q(米四半期)・8-K(米臨時)・有報(日年次)・臨時報告書(日臨時)が主な対象文書
- Phase Gate プロセス: 製造業の新製品開発で広く使われる段階管理手法。Gate 0(探索)→ Gate 5(量産)の関門で事業構造を評価
- 事業構造の質: 売上・利益などの数値ではなく、「事業のどこに価値があるか」「成長の源泉が何か」を評価する定性的な観点
- 定性評価の半定量化: 完全な数値化は難しいが、評価項目を細分化してスコア化することで運用可能なレベルに近づける手法
- ピーク掴み: 株価高値更新後すぐにエントリーして、その直後に下落トレンドに転じる失敗パターン
- SEC 8-K Item 5.02: 米国上場企業が役員交代等を開示する臨時報告書。新経営陣の自動取得に活用可能
- EDINET 臨時報告書: 日本上場企業の臨時開示文書(提出事由 4-2 で代表取締役交代等)。新経営陣検出に活用可能
「実装したくない読者」向け代替案
「N 要素のテキスト分析を自分で実装するのは大変」という読者には、米国 IBD の Composite Rating の N 評価(注: IBD は CAN-SLIM 7要素を内部で複合評価する0-99スコアを提供しますが、N 単独サブスコアは正式公開されていません)、マネックス証券の銘柄スクリーナー「新製品ニュース有り」フラグ、有料サービス(Bloomberg Terminal の Earnings Estimates 等)で同等機能が利用可能です。本記事の自動判定は「自分の評価軸で日米両市場を N 要素スクリーニングしたい」用途で、結果だけ見たい読者には不要です。
本記事の前提と難易度
- 必須前提: #22-#24 の C×A 実装、または同等のスクリーニング基盤が動いている状態
- requests でのHTTP API 呼び出し、pandas での文字列処理(
str.contains、str.findall) - 動作環境: Python 3.11+ / pandas 2.x / numpy / matplotlib 3.9+ / requests 2.31+ / duckdb 1.0+
- データソース: SEC EDGAR API(無料、認証不要、ただし User-Agent ヘッダ必須)+ EDINET API v2(無料、API キー登録のみ)+ J-Quants(株価高値計算用、応用編から継続)
- 戦略軸 vs 戦術軸: #21(戦略軸:CAN-SLIM 採用方針)→ #22-#24(戦術軸:C/A の定量実装)→ 本記事 #25(事業構造軸:N の定性+定量ハイブリッド自動判定) → #26-#28(事業構造軸の機械学習・統計手法)
成長株投資 固有のリスク(N 要素自動判定で特に顕在化)
- ピーク掴みリスク(N の “New High” 軸): 52週高値更新を機械的に PASS にすると、ピーク EPS 型失速(#24 で提示の Zoom 2021・Peloton 2022 型)と組合わせて高値づかみが発生する
- ニュース過剰反応: 新製品プレスリリース直後に株価が織り込み済みになっており、N PASS 自動判定時にはエントリー妙味が消えているケース
- テキスト分析の偽陽性: 「新製品」「革新」キーワードを連発する企業は要注意。実態のない PR 過剰企業を機械の自動判定が拾ってしまう可能性
- 新経営陣の評価難: 新 CEO 就任が中長期で良い結果になるか短期で判断できない。原典でも「就任から最低6ヶ月の様子見」が推奨
- 業種偏向: N 要素は IT・バイオ・半導体に集中しやすい。応用編 #19 HHI でのチェックを推奨
応用編 #16 安定性 + #19 業種分散 + #24 C×A + 本記事 N 要素 + #24 ポートフォリオ運用ルール(5-8銘柄、損切 -7〜-8%、利確 +20-25%)の多層防御が実装上の対策です。
本記事では 3個のサンプルコードで、SEC EDGAR / EDINET のテキスト抽出 → 52週高値の自動判定 → N 要素スコアの判定器統合まで完成させます。発展編後半の 「事業構造分析ブロック」(#25→#26→#27→#28)の開幕回で、本記事の自動判定はその後 PCA / エントロピー / NLP の発展形に接続します。
結論:CAN-SLIM の N 要素は「新製品・新サービス・新経営陣・新株価高値」の4観点を、製品アーキテクト視点で半定量化して自動判定する。SEC EDGAR の 10-K「Business」セクション + EDINET 有報「事業の状況」のテキスト抽出で「新製品」シグナルを、52週高値からの距離 + ボラティリティガードで「新高値」シグナルを定量化、両者を N 要素スコアに統合して screen_parallel_v3 の判定器に組み込む。「絶対値より変化率、突発より連続性」原則を事業構造の質の経時変化に拡張するのが本記事の核心。米国 5-10%、日本 2-5% の N PASS 通過率を想定。
構造化データ推奨:HowTo schema
本記事は3スニペットで「N 要素の自動判定パイプラインを構築する手順」を示す HowTo 型コンテンツです。実装時は JSON-LD で @type: "HowTo" + step 配列を出力すると、Google 検索結果で手順カードが表示される可能性があります(保証ではありません)。
CAN-SLIM N 要素の役割と製品アーキテクト視点による自動判定フレーム
CAN-SLIM の N は 4つの “New” を見ます。原典の中核:
- New Product: 直近1-2年で大型の新製品ローンチ(収益貢献の見込みあるもの)
- New Service: 新しいビジネスモデル・サブスク・サービスライン
- New Management: 業界実績のある新 CEO・CFO の就任
- New (price) High: 52週高値の更新、特に「適切な押し目(カップ&ハンドル等のチャートパターン)」からの新高値
製品アーキテクト視点の自動判定フレーム
製造業の新製品開発で使われる Phase Gate プロセスを、銘柄評価に転用する見方:
- Gate 1-2(コンセプト・実現性): 投資銘柄でいうと「IR で言及はあるが製品化未定」の段階。N 要素では CAUTION
- Gate 3(開発): 「製品化計画あり、α/β 版顧客検証中」段階。N 要素 PASS の入口
- Gate 4(量産準備): 「量産化決定、リリース日確定」段階。N 要素 PASS の中核
- Gate 5(量産・上市): 「販売開始、初期売上計上」段階。N 要素 PASS の最有力
- Gate 5+(成熟): 「販売開始から1年以上、収益貢献度が安定」段階。N 要素は CAUTION(次の新製品サイクルに移行中)
「絶対値より変化率、突発より連続性」原則を事業構造に適用すると、Gate 1 → Gate 5 への進捗速度(変化率)と、Gate 5+ から次の Gate 1 への新サイクル開始(連続性)の両方が自動判定の評価軸になります。
「N PASS」通過率の見積もり(運用前の期待値設定)
2026年5月時点の参考値(市場環境で変動):
- 米国 S&P500: N 4観点のうち2つ以上 PASS の銘柄は概ね 5-10%。新製品サイクルが活発な IT・バイオに集中
- 東証プライム: 同条件で 2-5%。日本企業の新製品開示が控えめなため低め
- C×A AND PASS かつ N PASS: 米国 0.3-1%、日本 0.1-0.3%。CAN-SLIM 7要素中3要素を満たす最有力候補ゾーン
- 52週高値更新のみで自動判定: 米国・日本ともに常時 5-15%(強気局面)と振れ幅大。単独使用は危険
これらは「自分のスクリーニングで何件 PASS が出るか」の期待値設定です。閾値や評価項目は引数で柔軟に調整可能な設計にしています。
スニペット1:SEC EDGAR / EDINET から「新製品」シグナルを自動判定するテキスト抽出
米国は SEC EDGAR の 10-K「Item 1. Business」、日本は EDINET の有報「事業の状況」セクションをテキスト抽出します。v2 では SEC EDGAR の User-Agent を Fair Access Policy 準拠に修正、EDINET の2段階フロー(documents.json → 個別 download)を明示、type=5 (CSV) に変更しています。
# fetch_n_signals.py — SEC EDGAR / EDINET から N要素シグナルを抽出(v2: API 仕様準拠)
# 動作環境: Python 3.11+ / pandas 2.x / requests 2.31+
import os
import re
import requests
import pandas as pd
from datetime import date
from typing import Literal
EDGAR_BASE = "https://data.sec.gov"
EDINET_BASE = "https://api.edinet-fsa.go.jp/api/v2"
# v2 H1 修正: SEC EDGAR Fair Access Policy 準拠の User-Agent(組織名+メール必須)
SEC_USER_AGENT = "Chelsea-Labs Research chelsea.labs0310@gmail.com"
SEC_HEADERS = {"User-Agent": SEC_USER_AGENT, "Accept": "application/json"}
_N_KEYWORDS_EN = [
"newly launched", "new product line", "next-generation", "newly introduced",
"launched in", "released in", "introduced our new",
]
_N_KEYWORDS_JP = [
"新製品", "新サービス", "新たに発売", "リリース", "新規事業", "次世代",
]
def score_n_text(text: str, language: Literal["en", "ja"]) -> dict:
"""テキストから N 要素キーワードを検出して自動判定スコア化(簡易版)
返却: {n_keyword_count, n_unique_keywords, n_text_length, n_density}
n_density = キーワード出現数 / テキスト長(千字あたり)
"""
keywords = _N_KEYWORDS_EN if language == "en" else _N_KEYWORDS_JP
text_lower = text.lower() if language == "en" else text
counts = {kw: text_lower.count(kw.lower() if language == "en" else kw) for kw in keywords}
total = sum(counts.values())
unique = sum(1 for v in counts.values() if v > 0)
text_len = max(len(text), 1)
return {
"n_keyword_count": total,
"n_unique_keywords": unique,
"n_text_length": text_len,
"n_density": (total / text_len) * 1000,
"n_top_keywords": {k: v for k, v in counts.items() if v > 0},
}
def fetch_10k_business_section(cik: str) -> str | None:
"""SEC EDGAR から最新の 10-K「Business」セクションを抽出(概念実装)
v2 H1 修正: User-Agent を Fair Access Policy 準拠形式に
実装上は edgar-tools 等のライブラリ利用が現実的。本記事は処理フローを示す
"""
url = f"{EDGAR_BASE}/submissions/CIK{cik.zfill(10)}.json"
resp = requests.get(url, headers=SEC_HEADERS, timeout=30)
if resp.status_code != 200:
return None
# 簡略化: filings 一覧取得のみ示す(実テキスト取得は edgar-tools 推奨)
return None
def fetch_edinet_doc_id(target_date: date, edinet_apikey: str) -> list[dict]:
"""EDINET の特定日の提出書類一覧から有報の doc_id を取得(v2 H2: 2段階フロー前段)
返却: [{"docID": "S100XXXX", "filerName": "...", "docTypeCode": "120"}, ...]
docTypeCode=120 が有価証券報告書、180 が臨時報告書(経営陣交代検出用)
"""
url = f"{EDINET_BASE}/documents.json"
params = {"date": target_date.isoformat(), "type": "2", "Subscription-Key": edinet_apikey}
resp = requests.get(url, params=params, timeout=30)
if resp.status_code != 200:
return []
results = resp.json().get("results", [])
return [
{"docID": r["docID"], "filerName": r["filerName"], "docTypeCode": r["docTypeCode"]}
for r in results if r["docTypeCode"] in ("120", "180")
]
def fetch_edinet_yuho_csv(doc_id: str, edinet_apikey: str) -> bytes | None:
"""EDINET から有報の CSV を取得(v2 H3: type=5 CSV 形式に変更、テキスト抽出に最適)
type=1 (XBRL): 構造化データだがパースが煩雑
type=2 (PDF): 表示用だがテキスト抽出に処理が必要
type=5 (CSV): EDINET 提供の構造化テキスト、Python での処理が容易(推奨)
"""
url = f"{EDINET_BASE}/documents/{doc_id}"
params = {"type": "5", "Subscription-Key": edinet_apikey}
resp = requests.get(url, params=params, timeout=60)
if resp.status_code != 200:
return None
return resp.content # ZIP バイナリ、展開して CSV を読む
# 使用例(概念)
# ids = fetch_edinet_doc_id(date(2026, 4, 30), edinet_apikey="YOUR_KEY")
# for doc in ids[:5]:
# csv_bytes = fetch_edinet_yuho_csv(doc["docID"], edinet_apikey="YOUR_KEY")
# # ZIP 展開 → CSV 読込 → 「事業の状況」セクション抽出 → score_n_text で自動判定
テキスト分析の罠:偽陽性とノイズ
- キーワード過剰企業: 「革新的」「最先端」「次世代」を連発するが実態のない PR 過剰企業を機械の自動判定が拾う。
n_densityが異常に高い銘柄は要注意 - 否定文での出現: 「new product launch was delayed」のような否定文脈で N キーワードが出現。LLM 統合や係り受け解析が望ましい
- boilerplate(定型文): 10-K の Risk Factors はほぼ定型文で、新製品キーワードがあっても実態ベースでない
- 本コードの方針: 簡易キーワード版で「N 要素候補のロングリスト抽出」、最終判定は人手 or LLM に委ねる設計
エンジニア的に言い換えると(Phase Gate プロセスの定量代理指標)
本コードは、製造業の Phase Gate プロセスで言う 「新製品開発の進捗を定量的な代理指標で観測する」作法と並走しています。Gate 進捗を定性的に管理しつつも、「特許出願件数」「プレスリリース回数」「カタログ掲載数」などの代理指標で変化率と連続性を観測するのが標準作法。テキストキーワード密度はその投資版で、「絶対値より変化率(前期比キーワード密度)、突発より連続性(複数年連続でキーワード密度が高い)」原則を事業構造の自動判定に拡張した形です。
スニペット2:52週高値からの距離を Python で自動判定(N の “New High” 観点)
N 要素の “New High” 観点は、CAN-SLIM 原典で「適切な押し目からの新高値更新」を求めます。本コードは52週高値からの距離 + 過去20日のボラティリティで、ピーク掴みリスクを抑えた自動判定を実装します。
# compute_52w_high.py — 52週高値からの距離と直近ボラティリティで N "New High" 観点を自動判定
# 動作環境: Python 3.11+ / pandas 2.x / numpy
import pandas as pd
import numpy as np
def compute_52w_high_metrics(price_df: pd.DataFrame) -> pd.DataFrame:
"""銘柄ごとに 52週高値・現在値からの距離・直近20日ボラティリティを計算
入力 price_df: ticker_normalized / date / close(日次終値)
返却追加カラム:
- high_52w: 過去52週(=252営業日)の最高値
- distance_from_52w_high_pct: 現在値が52週高値からどれだけ下にいるか(%、0が新高値)
- vol_20d_pct: 過去20日終値のボラティリティ(標準偏差/平均、%、価格系列CV)
- is_new_high: 現在値 == 52週高値(=新高値更新中)
注: window=252 は営業日ベース(土日祝除外)、min_periods=60 で60営業日未満の新規上場は除外
"""
df = price_df.sort_values(["ticker_normalized", "date"]).copy()
df["high_52w"] = df.groupby("ticker_normalized")["close"].transform(
lambda s: s.rolling(window=252, min_periods=60).max()
)
df["distance_from_52w_high_pct"] = (
(df["close"] - df["high_52w"]) / df["high_52w"] * 100
)
df["vol_20d_pct"] = df.groupby("ticker_normalized")["close"].transform(
lambda s: (s.rolling(window=20, min_periods=10).std() /
s.rolling(window=20, min_periods=10).mean()) * 100
)
df["is_new_high"] = df["close"] >= df["high_52w"] * 0.999 # 浮動小数誤差マージン
return df
def judge_new_high(metrics: dict,
distance_pass: float = -3.0,
distance_caution: float = -10.0,
vol_max_pass_us: float = 8.0, # v2: 米国成長株の実勢に合わせて緩和
vol_max_pass_jp: float = 5.0,
market: str = "JP") -> str:
"""N "New High" 観点を3段階で自動判定(ボラ閾値を市場別に分離)
- distance >= -3% かつ vol <= 市場別閾値 → PASS(高値圏で安定)
- distance >= -10% → CAUTION(押し目候補だが要観察)
- それ未満 → FAIL(高値から離れている)
"""
dist = metrics.get("distance_from_52w_high_pct")
vol = metrics.get("vol_20d_pct")
if dist is None:
return "CAUTION"
if dist >= distance_pass:
vol_max = vol_max_pass_us if market == "US" else vol_max_pass_jp
# ピーク掴み防止: ボラ高すぎは CAUTION 落とし。安全側で vol 不明も CAUTION に
if vol is None or vol > vol_max:
return "CAUTION"
return "PASS"
if dist >= distance_caution:
return "CAUTION"
return "FAIL"
52週高値判定の罠:ピーク掴みとフラットボックス
- ボラティリティガード(市場別): v2 修正で日本株 5%、米国成長株 8% に分離。米国成長株は10-20%帯のためデフォルト閾値を緩めに
- min_periods=60: rolling での最小データ点数。新規上場銘柄で60営業日未満は計算しない(応用編 #16 と同じ方針)
- 「適切な押し目」の機械判定: 原典のカップ&ハンドル等のチャートパターン認識は、本記事の簡易自動判定では捉えきれない。pandas-ta や TA-Lib の組合せで発展させる余地
- 市場全体ショック対応: 個別銘柄の高値更新だけでなく、応用編 #20 の TOPIX 相対値併用で市場全体の動きも考慮するのが望ましい
スニペット3:N 要素スコアを screen_parallel_v3 の自動判定器に統合
テキスト分析(新製品シグナル)と株価高値判定(New High)を統合し、N 要素全体のスコアを自動判定で出します。新経営陣は months_since_appointment として数値化し、SEC 8-K Item 5.02 / EDINET 臨時報告書(提出事由 4-2 等)から自動取得する余地を残した設計です。
# can_slim_n_judge.py — CAN-SLIM N 要素の統合自動判定器(v2: 新経営陣 月数化)
# 動作環境: Python 3.11+
from typing import Literal, TypedDict, NotRequired
Verdict = Literal["PASS", "CAUTION", "FAIL"]
class NElementMetrics(TypedDict):
n_density: NotRequired[float | None]
n_unique_keywords: NotRequired[int | None]
distance_from_52w_high_pct: NotRequired[float | None]
vol_20d_pct: NotRequired[float | None]
months_since_appointment: NotRequired[int | None] # v2 I2: 自動取得余地(8-K/臨時報告書)
def judge_n_element(metrics: NElementMetrics,
density_pass: float = 0.3,
unique_kw_pass: int = 2,
high_distance_pass: float = -3.0,
high_distance_caution: float = -10.0,
vol_max_pass: float = 5.0,
mgmt_pass_min_months: int = 6,
mgmt_pass_max_months: int = 18) -> Verdict:
"""CAN-SLIM N 要素を3段階で総合自動判定(4観点を統合)
PASS の条件:
- 新製品テキストシグナル PASS(密度高 + 多様性)
- かつ 52週高値からの距離 PASS(ボラ抑制込み)
CAUTION の条件:
- 上記いずれかが PASS、または高値 CAUTION ゾーン
- もしくは新経営陣が就任6ヶ月超〜18ヶ月以内(原典「6ヶ月様子見」基準)
FAIL の条件: 全観点が空または全て不合格
v2 I2: 新経営陣を months_since_appointment で数値化、原典の「6ヶ月様子見」を機械判定
自動取得は SEC 8-K Item 5.02 / EDINET 臨時報告書 docTypeCode=180 から
"""
text_pass = (
metrics.get("n_density") is not None
and metrics["n_density"] >= density_pass
and metrics.get("n_unique_keywords") is not None
and metrics["n_unique_keywords"] >= unique_kw_pass
)
dist = metrics.get("distance_from_52w_high_pct")
vol = metrics.get("vol_20d_pct")
high_pass = (
dist is not None and dist >= high_distance_pass
and (vol is None or vol <= vol_max_pass)
)
high_caution = dist is not None and dist >= high_distance_caution
months = metrics.get("months_since_appointment")
new_mgmt_pass_window = (
months is not None
and mgmt_pass_min_months <= months <= mgmt_pass_max_months
)
if text_pass and high_pass:
return "PASS"
if text_pass or high_pass or high_caution or new_mgmt_pass_window:
return "CAUTION"
return "FAIL"
# screen_parallel_v3 への統合(差分のみ、自動判定パイプライン)
# from can_slim_n_judge import judge_n_element
#
# def judge_one_ticker(metrics: dict) -> dict:
# n_v = judge_n_element({
# "n_density": metrics.get("n_density"),
# "n_unique_keywords": metrics.get("n_unique_keywords"),
# "distance_from_52w_high_pct": metrics.get("distance_from_52w_high_pct"),
# "vol_20d_pct": metrics.get("vol_20d_pct"),
# "months_since_appointment": metrics.get("months_since_appointment"),
# })
# return {..., "can_slim_n": n_v}
エンジニア的に言い換えると(複合検査ライン + 定性指標の半定量化)
本コードは、製造業 DX で言う 「定性指標の半定量化を多軸 AND で自動判定」する作法と同じ作法です。テキスト分析(新製品シグナル)+ 株価高値(市場の織り込み度)+ 新経営陣(事業構造の質)の3軸を統合自動判定し、いずれか1軸でも空 or 不合格なら CAUTION 落とし。「絶対値より変化率、突発より連続性」原則は density_pass(密度の絶対値ではなく変化率代理)と unique_kw_pass(複数キーワードの連続出現)で担保しています。
設計判断の記録:N 要素実装の3判断 + 応用編〜発展編 #25 の俯瞰表(36件)
判断1:テキスト分析を簡易キーワードか LLM か
- 採用理由: 簡易キーワードベースをデフォルト。代替案との比較:
- LLM フル解析: 精度は最高だが API コスト(数千銘柄 × 月次 = 月数万円規模)と処理時間が現実的でない
- 係り受け解析(spaCy 等): 否定文判定可能だが、実装複雑度が個人運用には過剰
- 採用:簡易キーワード: ロングリスト抽出としては十分、最終判定は別途人手 or LLM 補助
- 採用したことで失うもの: 否定文・皮肉・修辞表現の検出
- トリガー条件: コスト許容できる読者は LLM 統合に発展可能(OpenAI Batch API 等)
- 残るメリット: 運用コスト低、再現性高、デバッグ容易
- 製造業の評価作法: 「特許出願タイトルのキーワード密度」を代理指標にする実務と同質の発想
判断2:N 4観点の統合方法を AND か重み付けか
- 採用理由: テキスト PASS かつ 株価高値 PASS の2軸 ANDを最終 PASS の条件、新経営陣・新サービスは CAUTION 寄与のみ
- 採用したことで失うもの: 「新経営陣だけ強い」銘柄を PASS にする機会
- トリガー条件: 新経営陣を PASS 条件に格上げしたい場合 → judge_n_element に
treat_new_mgmt_as_pass=True引数追加 - 残るメリット: 偽陽性最小化、CAN-SLIM 原典の「複数の N シグナル同時発生」思想に忠実
- 品質管理での運用: 「主指標 AND + 補助指標 CAUTION 寄与」の階層判定は標準作法
判断3:株価ベースとファンダベースのバランス
- 採用理由: テキスト分析(ファンダ寄り)+ 52週高値(株価ベース)の併用。代替案との比較:
- ファンダのみ: 市場の織り込み度を反映できず、エントリータイミングが見えない
- 株価のみ: ピーク掴みリスク高、原典の「事業構造変化を見る」思想から外れる
- 採用:両軸併用: 事業構造の変化(テキスト)を市場が認識し始めた瞬間(株価高値)を捉える
- 採用したことで失うもの: 実装の複雑さ(2系統のデータパイプライン管理)
- トリガー条件: 個人運用で簡略化したい → 52週高値のみで運用も可能(ただし偽陽性増)
- 残るメリット: 原典思想への忠実さ、ピーク掴みリスク低減
- 生産技術の作法: 「製品開発進捗(ファンダ)+ 市場受容(株価)」の両軸評価は事業判断の基本
応用編 #13〜#21 + 発展編 #22〜#25 の主要設計判断 俯瞰表(36件)
| 記事 | 主要判断 | 採用 |
|---|---|---|
| #13 | データソース選定 | J-Quants + EDINET |
| #14 | DB / アーキテクチャ | DuckDB + ELT + マスタ駆動 |
| #14 | 業種別補正設計 | industry_indicator_map + direction |
| #14 | 正規化キー | ticker_normalized 5桁0埋め |
| #15 | 並列化技術 | multiprocessing initializer |
| #15 | 通知メディア | LINE Messaging API |
| #15 | スケジューラ | cron → GitHub Actions |
| #16 | 連続増配判定 | 連続非減少 |
| #16 | EPS 安定性指標 | 変動係数 CV + 線形回帰 |
| #16 | 新規上場銘柄の扱い | 5期未満は CAUTION 強制 |
| #17 | 異常値検知 | IQR + Z + SPC + WER の3-4層 |
| #17 | 市場全体ショック対応 | 絶対値 + TOPIX 相対値併用 |
| #18 | 業種粒度 | 10→25業種 |
| #18 | 業種別主指標数 | 1業種1主指標 |
| #18 | マスタ更新サイクル | 四半期レビュー |
| #18 | テーブル PK 設計 | 複合PK / 単列PK 使い分け |
| #19 | 集中度指標 | HHI 2000/3000 |
| #19 | 相関分析期間 | 過去24ヶ月 + 直近6ヶ月 |
| #19 | FMEA RPN 重み | 等倍積(S × O × D) |
| #19 | ポートフォリオテーブル | 個別銘柄評価とは別テーブル |
| #20 | master_runner 方式 | NotImplementedError 委譲 |
| #20 | 業種カバレッジ | 25業種で時価総額9割 |
| #21 | 成長株フレームワーク | CAN-SLIM |
| #21 | パイプライン再利用 | 応用編流用、判定層拡張 |
| #21 | 市場カバレッジ | 日米両市場(FMP + SEC EDGAR) |
| #22 | YoY 計算ロジック | 絶対値分母 |
| #22 | 連続性判定 | min_consecutive=2 |
| #23 | CAGR 期間優先順位 | 5年優先 + 3年フォールバック |
| #23 | 赤字期 CAGR 扱い | None で CAUTION |
| #23 | 可視化粒度 | PASS 銘柄のみ詳細 |
| #24 | 複合戦略デフォルト | AND(OR/重み付け 切替可) |
| #24 | 9セル表示粒度 | 9セル全表示 |
| #24 | バックテスト粒度 | 概念実装のみ |
| #25 | テキスト分析手法 | 簡易キーワード(LLM 切替可) |
| #25 | N 4観点の統合 | テキスト × 高値の2軸 AND |
| #25 | 株価/ファンダのバランス | 両軸併用(テキスト + 52週高値) |
本業の話:Phase Gate プロセスで「事業構造の質」を半定量化した経験
筆者が研究開発部門で新製品の Phase Gate 評価を担当していたとき、ベテランから次の指導を受けました:
- 「定性評価を放置するな。評価項目を細分化してスコア化することで、完全な数値化は無理でも『運用可能な半定量化』に近づけられる」
- 「事業構造の質は『絶対値より変化率』で見ろ。Gate 1→Gate 2 への進捗速度、Gate 5+ から次の Gate 1 への新サイクル開始が、本物の事業ダイナミクスのシグナル」
- 「テキストを侮るな。プレスリリース・特許出願・カタログ掲載のキーワード変化は、財務数値より早く事業構造変化を捉える」
具体的な業務インパクトと4-5年スパンのマイルストーン:
- 1年目(指摘): 初稿の Phase Gate 評価では Gate 通過/不通過の二値判定のみ。ベテラン指摘で各 Gate に7-10項目の評価チェックリストを導入、項目別スコア → 平均スコアの半定量化に切替
- 2年目(改修 + 検証): 過去5年分の量産化案件を新基準で再評価。定性評価の運用一致率が約3倍(測定方法: 同じ案件を異なる評価者2人が評価したときの最終判断一致率を、新基準と旧基準で比較。サンプル 過去5年分の Gate 4 通過案件 約25件)
- 2.5年目(Gate 進捗速度の観測実例導入、v2 D1 追加): 「絶対値より変化率」原則を実装するため、各案件の Gate 1→2→3→4 通過にかかった月数を記録するダッシュボードを構築。Gate 進捗速度の中央値が前年比約20%短縮(測定方法: Gate 1 通過から Gate 4 通過までの月数の中央値を四半期ごとに集計。サンプル ダッシュボード導入後12ヶ月の Gate 4 通過案件 約14件)。「変化率を見える化することで、停滞案件への早期介入と加速案件への追加投資判断が標準化」
- 3年目(運用): 定性評価のスコア化と Gate 進捗速度の両方が量産化会議の標準資料に。「絶対値より変化率、突発より連続性」原則の事業構造版が部内浸透
- 4年目(発展): テキスト分析(特許明細・プレスリリースのキーワード密度)を補助指標に追加。事業構造変化の早期検知時間が前年比約4ヶ月短縮(測定方法: 新製品サイクル変化を察知してから量産化決定までの時間を、新基準と旧基準で比較。サンプル 新基準採用後2年分の事業構造シフト案件 約8件)
本記事の N 要素自動判定フレームは、この本業の Phase Gate 半定量化経験と同じ作法です。CAN-SLIM 原典の「定性的な N 要素を運用可能なレベルに落とし込む」思想が、製造業の Phase Gate 半定量化と本質的に並走しているのが、本記事の核心的な発見です。
逆方向の転移:投資の N 要素テキスト分析が本業の事業構造判定を強化
本記事のキーワード密度ベースのテキスト分析パターン(n_density、n_unique_keywords)を、本業の事業構造判定に逆輸入する余地があります。本業ではこれまで定性評価チェックリストを人手で運用していましたが、特許明細・プレスリリースのテキスト密度を半自動で観測できるようになる見込みです。応用編で確立した双方向の知識循環が発展編の事業構造分析でも続いています。
まとめ:N 要素は製品アーキテクト視点で半定量化する自動判定
- CAN-SLIM の N 要素は「新製品・新サービス・新経営陣・新株価高値」の4観点を、製品アーキテクト視点で半定量化して自動判定。SEC EDGAR/EDINET のテキスト抽出(v2 で SEC User-Agent 準拠 + EDINET 2段階フロー + type=5 CSV 形式)で「新製品シグナル」、52週高値からの距離 + 市場別ボラティリティガード(米8%/日5%)で「新高値」を Python で機械の自動判定。「絶対値より変化率、突発より連続性」原則を事業構造の質の経時変化に拡張するのが本記事の核心
- screen_parallel_v3 への統合で、CAN-SLIM 7要素中3要素(C/A/N)の自動判定が揃い、応用編 #15-#20 で確立したパイプライン基盤の上で動作。米国 N PASS 通過率 5-10%、日本 2-5% を想定値として運用
- 次回 #26 PCA → #27 エントロピー → #28 NLP に接続: 本記事の N 半定量化が事業構造分析の基礎、後続記事で機械学習・統計・NLP の発展形に展開
- 機械の自動判定 PASS は「成長株候補の入口」、購入候補ではない: CAN-SLIM 7要素中3要素のみの充足であり、ピーク掴み・ニュース過剰反応・テキスト偽陽性のリスクが残る。#24 のポートフォリオ運用ルール(5-8銘柄、損切 -7〜-8%、利確 +20-25%)を併用してください
今日からできる3つのアクション
- SEC EDGAR API(無料、認証不要、ただし User-Agent ヘッダ「組織名+メール」必須)と EDINET API v2(無料、API キー登録のみ)の登録 + 1銘柄でテキスト取得テスト。米国は
data.sec.gov/submissions/CIK{cik}.json、日本は EDINET の/documents.jsonで doc_id 取得 →/documents/{docID}?type=5で CSV 取得の2段階フローから始める - 本記事スニペット1〜2 を実装し、自分の興味のある日本株1銘柄と米国株1銘柄のテキストキーワード密度と52週高値からの距離を Python で自動判定。閾値(密度0.3、距離-3%、ボラ 米8%/日5%)が直感と合うか確認
- スニペット3 で
screen_parallel_v3に N 要素を統合し、「C×A AND PASS かつ N PASS」の銘柄を抽出。米国 0.3-1%、日本 0.1-0.3% 程度の少数。抽出後の人手最終判定手順として:- 10-K Item 1(Business)の精読: 新製品の市場規模・競合・販売チャネルを確認
- 直近の決算カンファレンスコール(Earnings Call)の Q&A 確認: 機関投資家の懸念点を把握
- 新製品の収益貢献度推定: セグメント別売上 / 全社売上 で新製品の影響度を計算
- 応用編 #19 HHI で業種集中チェック: 抽出された PASS 銘柄が IT/バイオ/半導体に偏っていないか確認
- #24 ポートフォリオ運用ルール適用: 5-8銘柄に絞り、損切 -7〜-8%・利確 +20-25%・1銘柄上限 20-25% で運用
次回予告:PCA で銘柄相関分析 — 機械学習で C×A×N PASS 銘柄群の構造を理解
次回(記事#26)では、機械学習の 主成分分析(PCA、Principal Component Analysis)で、C×A×N PASS 銘柄群の構造的な相関と独立性を分析します。「PASS 銘柄が IT に集中している」を数学的に裏付け、業種分散の科学的根拠を持たせる自動判定の発展形。事業構造分析ブロックの第2回。
「製品開発DXエンジニアの投資術」シリーズ全体像
本記事は 発展編(記事#21〜#30)の第5回 です。
- 基礎編(#01〜#10): 完了
- 応用編(#11〜#20): 完了 ✅
- 発展編(#21〜#30): 進行中
発展編 ロードマップ:
- 導入:#21 なぜ成長株か
- CAN-SLIM 実装ブロック:#22 C 当期EPS → #23 A 年間EPS → #24 C×A 複合
- 事業構造分析ブロック:▶ イマココ #25 N 製品アーキテクト視点(本記事) → #26 PCA → #27 エントロピー → #28 NLP(N要素発展)
- ハイブリッド + 総括:#29 配当 × 成長 戦略 → #30 シリーズ総括
▶ 前回 #24 C×A 複合判定 | 本記事 #25 製品アーキテクト視点 | 次回 #26(PCA で銘柄相関分析、公開予定)
関連記事(応用編から): #19 業種分散 FMEA | #20 応用編まとめ
免責事項(再掲)
本記事は投資助言を目的としたものではなく、技術・分析手法の紹介です。CAN-SLIM N 要素の評価フレームと閾値(密度・高値距離・ボラ等)は教育目的であり、特定の銘柄・金融商品の売買を推奨するものではありません。投資判断はご自身の責任で行ってください。SEC EDGAR・EDINET の利用規約は変更される可能性があるため、実装時は各サービスの公式ドキュメント・利用規約を必ず確認してください。本記事中に SEC EDGAR・EDINET から取得した個別企業の有報全文・株価実値は掲載していません。テキスト分析の精度は限定的で、実運用では人手の最終判定との併用が前提です。

コメント