EDINETからダウンロードしたファイルを分析する
前回EDINETからzipファイルをダウンロードできたので、分析したいんだけど、まずはxbrlファイルからデータを取得するためのテストファイルを作成する(作成してもらう)
取得前に、zipファイルを展開しておく。
from arelle import Cntlr
import os
import pandas as pd
# =========================
# 基本情報
# =========================
COMPANY_NAME = "トヨタ自動車"
XBRL_DIR = "/Users/yo******/******/xbrl/publicdoc"
# =========================
# XBRLファイル取得
# =========================
xbrl_files = [f for f in os.listdir(XBRL_DIR) if f.endswith(".xbrl")]
if not xbrl_files:
raise RuntimeError("XBRLファイルが見つかりません")
xbrl_path = os.path.join(XBRL_DIR, xbrl_files[0])
# =========================
# Arelle 起動
# =========================
cntlr = Cntlr.Cntlr(logFileName=None)
modelXbrl = cntlr.modelManager.load(xbrl_path)
# =========================
# 取得対象
# =========================
TARGET_ITEMS = {
"売上高": "NetSales",
"営業利益": "OperatingIncome"
}
facts_by_item = {k: for k in TARGET_ITEMS.keys()}
# =========================
# fact 走査
# =========================
for fact in modelXbrl.facts:
ctx = fact.context
if ctx is None:
continue
# 連結のみ(暫定)
if "Consolidated" not in ctx.id:
continue
# PL項目(期間)
if not (ctx.startDatetime and ctx.endDatetime):
continue
for label, local_name in TARGET_ITEMS.items():
if fact.qname.localName != local_name:
continue
try:
value = int(float(fact.value))
except Exception:
continue
facts_by_item[label].append(
(ctx.endDatetime, value)
)
# =========================
# 前期・当期を確定
# =========================
records =
for label, items in facts_by_item.items():
if not items:
continue
items.sort(key=lambda x: x[0], reverse=True)
# 当期
records.append({
"会社名": COMPANY_NAME,
"区分": "当期",
"勘定科目": label,
"金額": items[0][1]
})
# 前期
if len(items) > 1:
records.append({
"会社名": COMPANY_NAME,
"区分": "前期",
"勘定科目": label,
"金額": items[1][1]
})
# =========================
# DataFrame 化
# =========================
df = pd.DataFrame(records)
# 見やすい並びに
df = df.sort_values(["区分", "勘定科目"])
print(df)
# =========================
# 保存
# =========================
df.to_csv("financial_summary.csv", index=False, encoding="utf-8-sig")
df.to_excel("financial_summary.xlsx", index=False)
print("\nCSV / Excel に保存しました。")
会社名 区分 勘定科目 金額
3 トヨタ自動車 前期 営業利益 699373000000
1 トヨタ自動車 前期 売上高 11761405000000
2 トヨタ自動車 当期 営業利益 1129689000000
0 トヨタ自動車 当期 売上高 12607858000000
EDINETから指定した銘柄をダウンロードする
chatGPTに書いてもらった。とりあえず有価証券報告書だけ。
import requests
import os
import zipfile
from datetime import date, timedelta
# =========================
# 設定
# =========================
API_KEY = "ここにAPI KEYを入力する"
SECURITY_CODE = "72030" # ← 7203 + "0"
TARGET_YEAR = 2022
SAVE_DIR = "edinet_xbrl"
# =========================
# 年度 → 日付範囲
# =========================
start_date = date(TARGET_YEAR, 4, 1)
end_date = date(TARGET_YEAR + 1, 3, 31)
os.makedirs(SAVE_DIR, exist_ok=True)
# =========================
# 書類検索
# =========================
url_list = "https://api.edinet-fsa.go.jp/api/v2/documents.json"
target_docs =
current_date = start_date
while current_date <= end_date:
params = {
"date": current_date.isoformat(),
"type": 2,
"Subscription-Key": API_KEY
}
res = requests.get(url_list, params=params)
res.raise_for_status()
results = res.json().get("results", )
for doc in results:
if (
doc.get("secCode") == SECURITY_CODE and
doc.get("docTypeCode") == "120"
):
target_docs.append(doc)
current_date += timedelta(days=1)
if not target_docs:
print("該当する有価証券報告書が見つかりませんでした。")
exit()
print("見つかった件数:", len(target_docs))
# =========================
# XBRL ダウンロード
# =========================
for doc in target_docs:
doc_id = doc["docID"]
filer = doc["filerName"]
print("ダウンロード中:", filer, doc_id)
url_doc = f"https://api.edinet-fsa.go.jp/api/v2/documents/{doc_id}"
params = {
"type": 1,
"Subscription-Key": API_KEY
}
r = requests.get(url_doc, params=params)
r.raise_for_status()
zip_path = os.path.join(SAVE_DIR, f"{doc_id}.zip")
with open(zip_path, "wb") as f:
f.write(r.content)
with zipfile.ZipFile(zip_path, "r") as zip_ref:
zip_ref.extractall(os.path.join(SAVE_DIR, doc_id))
print("完了:", doc_id)
print("すべて完了しました。")
すごいwebアプリ
すごいwebアプリを見つけた
https://note.com/testkun08080/n/n6af1ee248ea6
これを使うことができれば自分がプログラムすることはないな・・・
こういうの作れる人、ほんと尊敬する
yfinanceで、日本株の指標per,pbrを取得するコード
yfinanceで、日本株の指標per,pbrを取得するコード
import yfinance as yf
# 銘柄コード
ticker_code = '7203.T'
ticker = yf.Ticker(ticker_code)
# 企業情報を取得
info = ticker.get_info()
# PER (forwardPE・trailingPE)
per = info.get("forwardPE") or info.get("trailingPE")
# PBR (priceToBook)
pbr = info.get("priceToBook")
print("PER:", per)
print("PBR:", pbr)
財務諸表は、アメリカ株だけ取得できる。日本株は取得できない。
結局edinetしかないのか
■
yfinanceから株の指標を取得するコード
import yfinance as yf
# 銘柄コード
ticker_code = '7203.T'
ticker = yf.Ticker(ticker_code)
# 企業情報を取得
info = ticker.get_info()
# PER (forwardPE・trailingPE)
per = info.get("forwardPE") or info.get("trailingPE")
# PBR (priceToBook)
pbr = info.get("priceToBook")
print("PER:", per)
print("PBR:", pbr)
久しぶりにコーディング
思い出したようにコーディングをすると、プログラミング環境が古くなっていて動かないことが多く、環境を更新するだけで多大な労力がかかる。
今回はPythonのバージョンが古くてyfinanceが動かなかったのでPythonを新しくしたかったんだけど、anacondaで動いているので、anacondaを新しくして。。。
そしたら仮想環境を作ってからPythonのバージョンをあげないと危ない、という記事を読んだので仮想環境を作ったりして。
新しいPythonは仮想空間上で動くので、使うたびに仮想空間をアクティベートしなくちゃいけないとか、面倒。
昔は簡単だったのにな。
ということで、次からは
conda activate py311
とターミナルで入力してからじゃないと、python3.11はつかえないとのこと
・・・これ、anaconda入れ直した方が早いんじゃ・・・
日経平均の信用倍率
メモ。puzzlefishさんのx記事の備忘録
日経平均の信用倍率はここで見ることができる
https://nikkei225jp.com/data/sinyou.php#google_vignette
信用倍率は買い残/売り残
4倍程度だと需給が引き締まっている状態。
信用買いが進んで信用倍率が上がってくると危険な状態なんだって。
勉強になりまする