1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Alpha Vantageで米国株の決算データを取得し、Pandasで加工してCSVに保存

1
Last updated at Posted at 2026-09-24

はじめに

現在BizCodeXというプログラミングスクールでPythonを学習しています。この記事は日々の学習で取り組んだ内容をアウトプットすることを目的として作成しました。まずは副業ができるようになり最終的には転職を目標に学習を行っています。

内容

米国株での運用を個人的に行っており、スクールで学んだことを使って決算データで自分が欲しい情報のみを取得し一目で見ることができるようなものを作りたいと思いました。

アウトプットの内容は、
Alpha Vantage APIを使用して、NVIDIAの四半期決算データを取得します。
今回使用するデータは以下になります。

-売上高
-粗利益
-売上原価
-営業利益
-純利益
-自己資本

この取得したデータを使って

-営業利益率
-営業利益率前年同期比増減率
-純利益率
-純利益率前年同期比増減率
-ROE

をpandasを使って計算してDataFrameにし、CSVへ出力しました。

処理の流れ

今回はティッカーにNVIDIAを指定してデータを収集しました。

Alpha Vantage
↓
pythonでNVDAの財務データを取得
↓
pandas
↓
表として表示
↓
CSVに保存

使用したもの

-Python
-pandas
-Alpha Vantage API
-JupyterLab
-Anaconda

Alpha Vantage APIとは

株式や為替、経済指標、企業の決算情報、ニュースなどの金融データを、pythonなどのプログラムから取得できるサービスです。

1.Alpha Vantageから決算データを取得

まず、Alpha Vantage APIを使用してNVIDIAの決算データを取得します。

今回はティッカーに「NVDA」を指定しました。

#Alpha Vantageから決算データを取得

import requests
import pandas as pd
url = 'https://www.alphavantage.co/query'

#損益計算書を取得
params = ['apikey'] = 'APIキー'
params = ['function'] = 'INCOME_STATEMENT'
params = ['symbol'] = 'NVDA'

response = requests.get(url,params=params)
data = response.json()

#貸借対照表を取得
params = {}
params['apikey'] = 'APIキー'
params['function'] = 'BALANCE_SHEET'
params['symbol'] = 'NVDA'

response_balance = requests.get(url,params=params)
data_balance = response_balance.json()

モジュールの読み込み

今回のプログラムでは、APIからデータを取得するためにrequests、取得したデータを表形式で扱うためにpandasを使用します。

import requests
import pandas as pd

url='https://www.alphavantage.co/query'

リクエストパラメータ

リクエストパラメータを確認していきます。
Alpha Vantageのページで損益計算書(INCOME STATEMENT)と貸借対照表(BALANCE_SHEET)を確認します。

AdobeExpressPhotos_fc0b3e36a7cf4e08adbe7e424b0e2110_CopyEdited.png

AdobeExpressPhotos_458b5cd015784a8bbc36b4a39a79d2e6_CopyEdited.png

qiita.py
params['apikey'] = 'APIキー'

取得したAPIキーをapikeyに指定します。
※APIキーは個人ごとに発行されるので、Qiitaなどに公開するときは実際のAPIキーを記載しないようにします。

qiita.py
params['function'] = 'INCOME_STATEMENT'

functionに何を指定するかで取得するデータが変わります。
今回は損益計算書と貸借対照表を取得したいので、functionに「INCOME_STATEMENT(損益計算書)」と「BALANCE_SHEET(貸借対照表)」を指定します。

qiita.py
params['symbol'] = 'NVDA'

今回はNVIDIAの決算データを取得するため、symbolにNVIDIAのティッカーであるNVDAを指定します。

取得したい企業のティッカーをsymbolに指定してデータを取得します。

例えば、

qiita.py
params['symbol'] = 'AAPL'

とすると、Appleのデータを取得できます。
symbolの値を変更することで、同じプログラムを他の米国企業の決算データ取得にも応用できます。

response = requests.get(url,params=params)

response_balance = requests.get(url,params=params)

responseには損益計算書のAPIレスポンスを、response_balanceには貸借対照表のAPIレスポンスを格納します。

APIから取得したデータをそれぞれ変数に格納することで、後からpandasのDataFrameに変換して分析できるようにします。

data = response.json()

data_balance = response_balance.json()

APIから返ってきたJSON形式のデータをpythonで扱いやすい形式に変換します。

ここでJSONの中身を確認すると以下のようなレスポンスが返ってきます。
AdobeExpressPhotos_7a2bcdc9f6ac431188ed91d2652c423e_CopyEdited.png
※ここに表示している分はレスポンスの一部です。
多くの情報が含まれるため、このままJSON形式で扱うと必要なデータを確認しにくくなります。
そこで、pandasを使ってDataFrameにし、情報を取り出しやすくしました。

2.DataFrameにする

APIから取得したJSONデータをpandasのDataFrameに変換します。

今回は損益計算書と貸借対照表の四半期決算('quarterlyReports')を取得します。

#損益計算書
df = pd.DataFrame(data['quarterlyReports'])

#貸借対照表
balance_df = pd.DataFrame(data_balance['quarterlyReports'])

data['quarterlyReports']から四半期決算の損益計算書のデータを取り出します。

JSONデータをDataFrameにしたもの
※損益計算書の一部分
AdobeExpressPhotos_e00a32a779ab4be188b277a6a96cbcc0_CopyEdited.png

DataFrameに変換することで、JSONデータよりも必要なデータを確認しやすくなりました。

今回の分析に必要なデータのみを取りだします。

#損益計算書
df = df[['fiscalDateEnding','totalRevenue','grossProfit','costOfRevenue','operatingIncome','netIncome']]
#貸借対照表
balance_df = balance_df[['fiscalDateEnding','totalShareholderEquity']]

損益計算書からは以下のデータを取り出します。

・決算日(fiscalDateEnding)
・売上高(totalRevenue)
・粗利益(grossProfit)
・売上原価(costOfRevenue)
・営業利益(operatingIncome)
・純利益(netIncome)

貸借対照表からは、以下のデータを取り出します。

・決算日(fiscalDateEnding)
・自己資本(totalShareholderEquity)

必要なデータを取得してDataFrameにしたもの
AdobeExpressPhotos_e76fc7d155fc4da39e4dcc5e0ec75098_CopyEdited.png

3.数値型へ変換

取得した財務指標を使って営業利益率や純利益率などの計算を行います。
しかし、Alpha Vantageから取得した財務データは、数字にみえてもpandasでは文字列(str)として扱われている列があります。
この状態で、

df['operatingIncome'] / df['totalRevenue']

のような計算をすると、
TypeError: unsupported operand type(s) for /: 'str' and 'str'

というエラーが発生しました。
これは、
文字列(str)同士は割り算できません。
という意味です。
そこで、pd.to_numeric()を使って、計算に使用する列を数値型へ変換します。

numeric_columns = ['totalRevenue','grossProfit','costOfRevenue','operatingIncome','netIncome']

for col in numeric_columns:
    df[col] = pd.to_numeric(df[col])

balance_df['totalShareholderEquity'] = pd.to_numeric(balance_df['totalShareholderEquity'])    

複数の列を数値化するため、数値にしたい列名をnumeric_columnsというリストにまとめています。

また、貸借対照表から取得した自己資本(totalShareholderEquity)も、あとでROEの計算に使用するため、同じように数値型へ変換します。

これで、財務データを数値として計算できる状態になります。

4.損益計算書と貸借対照表を結合

営業利益率や純利益率、ROEなどの計算に必要なデータを一つのDataFrameにまとめ、最終的に1つのCSVとして保存するために損益計算書と貸借対照表を結合します。

df = pd.merge(df,balance_df,on='fiscalDateEnding',how='left')

両方のDataFrameには、決算日を表す共通の項目fiscalDateEndingがあります。
on = 'fiscalDateEnding'では、両方のDataFrameに共通するfiscalDateEndingを結合キーとして指定しています。

how = 'left'は、左側のdfを基準にして、balance_dfのデータを結合しています。

これで純利益と自己資本を使ったROEなどの財務指標を計算できるようになります。

5.財務指標を計算

取得したデータを使って財務指標を計算していきます。
今回計算で出す指標は、以下の5つです。
・営業利益率
・営業利益率前年同期比増減率
・純利益
・純利益率前年同期比増減率
・ROE(自己資本収益率)

qiita.py
#営業利益率
df['operatingMargin'] = (df['operatingIncome'] / df['totalRevenue'] * 100)

営業利益率 = 営業利益 ÷ 売上高 × 100

#営業利益率前年同期比増減率
df['operatingMargin_yoy'] = (df['operatingMargin'] / df['operatingMargin'].shift(-4) *100 - 100)

営業利益率が前年同期と比べて、何%増減したかを計算します。

営業利益率前年同期比増減率 = 今年の営業利益率 ÷ 前年同期の営業利益率 × 100 - 100

:point_up:.shift(-4))について
shift()は、DataFrameのデータの位置をずらすpandasの機能です。
今回は四半期ごとのデータを使っているため、1年分は4四半期になります。
データが新しい順に並んでいる場合、shift(-4)とすると、4つ先のデータを現在の行に持ってくることができます。

例えば、データが新しい順番に並んでいる場合

     
決算日 営業利益率
2026年4Q 60%
2026年3Q 58%
2026年2Q 57%
2026年1Q 59%
2025年4Q 55%

このとき、2026年4Qの行でshift(-4)をすると、4つ下にある「2025年4Q」の営業利益率「55%」を取得できます。
df['operatingMargin'] / df['operatingMargin'].shift(-4) * 100 -100
とすることで、
今年の営業利益率が前年同期と比べて何%増減したかを計算できます。

※shift(-4)は、データが新しい順に並んでいることを前提としています。

#純利益率
df['netIncomeMargin'] = (df['netIncome'] / df['totalRevenue'] * 100)

純利益率 = 純利益 ÷ 売上高 × 100

#純利益率前年同期比増減率
df['netIncomeMargin_yoy'] = (df['netIncomeMargin'] / df['netIncomeMargin'].shift(-4) * 100 -100)

純利益率が前年同期と比べて、何%増減したかを計算します。

純利益率前年同期比増減率 = 今年の純利益率 ÷ 前年同期の純利益率 × 100 - 100

#ROE
df['ROE'] = (df['netIncome'] / df['totalShareholderEquity'] * 100)

損益計算書から取得した純利益と、貸借対照表から取得した自己資本を使用して計算しています。

自己資本収益率 = 純利益 ÷ 自己資本 × 100

※netIncomeMargin_yoyの「yoy」は、「year over year」の略です。日本語で「前年同期比」。

6.カラム名を日本語に変更

Alpha Vantageではすべて英語で取得されます。そのため、df.rename()を使って日本語に変更します。
※reneme()は元のデータの中身を変えられるのではなく、カラム名だけを変更する処理です。

df = df.rename(columns={
    'fiscalDateEnding':'決算日',
    'totalRevenue':'売上高',
    'grossProfit':'粗利益',
    'costOfRevenue':'売上原価',
    'operatingIncome':'営業利益',
    'netIncome':'純利益',
    'operatingMargin':'営業利益率',
    'operatingMargin_yoy':'営業利益率前年同期比増減率',
    'netIncomeMargin':'純利益率',
    'netIncomeMargin_yoy':'純利益率前年同期比増減率',
    'totalShareholderEquity':'自己資本',
    'ROE':'自己資本収益率'
})

7.表示用DataFrameを作成

計算に使ったdfとは別に、画面表示やCSV出力に適した形式に整えるためのdisplay_dfを作成します。

①金額を「億ドル」単位にする。

#金額を「億ドル」に変換

display_df = df.copy()

money_columns = [
    '売上高',
    '粗利益',
    '売上原価',
    '営業利益',
    '純利益',
    '自己資本'
]

for col in money_columns:
    display_df[col] = display_df[col]/100000000

Alpha Vantageで取得したデータの金額はドル単位の数値です。
売上高 が215,938,000,000ドルの場合、そのままだと桁数が大きく見ずらいため、表示用DataFrameでは「億ドル」単位に変換します。

display_df = df.copy()

dfを直接変更するのではなく、df.copy()を使ってdisplay_dfを作ります。

df → 計算分析に使用
display_df → 表示・CSV出力用に加工

計算用のデータと表示用のデータを分けることで、元のデータを保持しながら表示形式を変更できるようにしました。

qiita.py
#億ドルへ変換する対象のカラム
money_columns = [
    '売上高',
    '粗利益',
    '売上原価',
    '営業利益',
    '純利益',
    '自己資本'
]

for col in money_columns:
    display_df[col] = display_df[col]/100000000

100,000,000で割ることで、ドル単位から億ドル単位に変換します。

②表示する列の順番

display_df = display_df[
   [
    '決算日',
    '売上高',
    '粗利益',
    '売上原価',
    '営業利益',
    '純利益',
    '自己資本',
    '営業利益率',
    '営業利益率前年同期比増減率',
    '純利益率',
    '自己資本収益率'
    ]
]

表示する順番を整えて財務指標を確認しやすい形に整理しました。

8. jupyter上に表示

今回の最終的な目的は、加工したデータをCSVファイルとして出力することです。

そのため、ここで行っているJupyter上での表示形式の設定は、CSVファイルを作成するためには必須ではありません。

今回はPythonやpandasの学習を目的としているため、Jupyter上でDataFrameを見やすくする方法も学習しましたので、こちらにも載せました。

また、CSV出力では別途、CSV用のDataFrameを作成して、必要な形式に整えて出力します。

1. 金額の表示形式を設定する

money_columns = [
    '売上高',
    '粗利益',
    '売上原価',
    '営業利益',
    '純利益',
    '自己資本'
]

format_dict = {}

for col in money_columns:
    format_dict[col]='{:,.2f}'

ここでは、金額を3桁ごとにカンマをいれて表示します。
前の処理では「億ドル」に変換した数値が、
2159.38
だった場合、
2,159.38
のように表示されます。

:point_up:{ : , . 2 f }
数字の表示ルールを設定します。

①「,」
 3桁ごとにカンマを入れる。

②「.2f」
 小数点以下を2桁にする。

{ : , . 2 f }は、
「3桁ごとにカンマを入れて、小数点以下2桁で表示する」
という意味。

2.パーセントの表示形式を設定する

percent_columns = [
    '営業利益率',
    '営業利益率前年同期比増減率',
    '純利益率',
    '純利益率前年同期比増減率',
    '自己資本収益率'
]    

for col in percent_columns:
    format_dict[col] = '{:,.2f}%'

display(display_df.style.format(format_dict))

percent_columnsのリストは、%を付けるよう指定します。

営業利益率 = 60.381684
だった場合

営業利益率 = 60.38%
と表示されます。

3.表示形式をDataFrameに適用する

display(display_df.style.format(format_dict))

ここで、これまで作った表示ルールをdisplay_dfに適用します。
display_df.style.format()による設定は、DataFrameの数値そのものを変更するものではなく、Jupyter上での見た目だけを変更するものです。

これを実行すると、

AdobeExpressPhotos_2a171ec2f02e4cc092327abe87dc28df_CopyEdited.png

このようにDataFrameが表示されます。

※この表示形式の設定はCSV出力には必須ではなく、今回は学習とデータ確認のために行っています。

9. CSV用DataFrameを作成(最終成果物)

ここまでで、display_dfを使ってJupyter上でデータを確認しました。

次に、最終的な成果物であるCSVファイルを作成します。

CSVでも、金額にカンマを付けたり、%を付けたりして見やすい形式で保存します。

そのため、CSV用にdisplay_dfをコピーして、csv_dfを作ります。

csv_df = display_df.copy()

display_dfの数値データを残したまま、CSV用にデータを加工するためにコピーを作ります。

:point_up:
2159.38
は数値型(float)なので、そのまま計算に使うことができます。

一方、

60.38164

をCSVで見やすくするために、
60.38%
とすると、文字列(str)になりあとから計算できなくなります。

そのため、計算用のdisplay_dfと、CSV出力用のcsv_dfで役割を分けます。

  • display_df → 数値を保持する
  • csv_df → csvで見やすくするための形式に変換する

①金額を文字列に変換する

#金額
for col in money_columns:
    csv_df[col] = csv_df[col].map(lambda x: f'{x:,.2f}')

money_columnsに入っているカラムをfor文で一つずつ取り出して、 map()で一つずつ処理します。

lambda xは取り出した値をxとして受け取り、f'{x:,.2f}'を適用します。

2159.38 → 2,159.38

パーセントを文字列に変換する

#パーセント
for col in percent_columns:
    csv_df[col] = csv_df[col].map(lambda x: f'{x:.2f}%')

金額のときと同じように、percent_columnsに入っているカラムを一つずつ処理します。

まとめ

今回のcsv用DataFrameでは、計算に使う数値と、CSVで見やすくするための表示形式を分けています。

display_df → 数値を保持
 2159.38
60.3816

csv_df → csvで見やすい形式に変換
 '2,159.38'
'60.38%'

DataFrameの役割を分けることで、計算用のデータを維持したまま、CSVでは見やすい形式で出力できるようにしました。

10. csvに保存

csv_df.to_csv('NVIDIA_quarterlyReports.csv',index = False)

csv_dfをcsvファイルとして保存します。
「NVIDIA_quarterlyReports.csv」
という名前で保存しました。

csvへ保存したもの

AdobeExpressPhotos_2f19a12d73d4421a9258e0ffba8307d9_CopyEdited.png

pythonで計算した結果が正しいか確認するため、元データを使って手計算でも検証しました。
今回の処理では、
元データ
 ↓
利益率などを計算
 ↓
表示用に「億ドル」に変換
 ↓
CSVへ保存

という順番で処理をしています。

実際に手計算すると項目によっては約0.19の差がでました。
CSVの表示ではなく、変換前の元データを使って計算結果を確認したところ、pythonで計算した結果と一致しました。
今回のこの差は計算処理そのものの誤りではなく、CSVへ出力する際の表示桁数や単位変換によるものだということが確認できました。

CSVに表示されている「億ドル」に変換された数値をそのまま計算すると小数点以下の丸めや表示桁数の影響によって、pythonで計算した結果と少しだけ差がでることがわかりました。

10. コードをまとめたもの

#1.AlphaVantageから決算データを取得

import requests
import pandas as pd

url = 'https://www.alphavantage.co/query'

# ----- 損益計算書 -----
params = {}
params['apikey'] = APIキー
params['function'] = 'INCOME_STATEMENT'
params['symbol'] = 'NVDA'

response = requests.get(url,params=params)
data = response.json()


# ------ 貸借対照表 -----
params = {}
params['apikey'] = APIキー
params['function'] = 'BALANCE_SHEET'
params['symbol'] = 'NVDA'

response_balance = requests.get(url,params=params)
data_balance = response_balance.json()

#==================
#2.DataFrameにする
#==================

#損益計算書
df = pd.DataFrame(data['quarterlyReports'])

df = df[['fiscalDateEnding','totalRevenue','grossProfit','costOfRevenue','operatingIncome','netIncome']]

#貸借対照表
balance_df = pd.DataFrame(data_balance['quarterlyReports'])

balance_df = balance_df[['fiscalDateEnding','totalShareholderEquity']]

#================
#3.数値型へ変更
#================

numeric_columns = ['totalRevenue','grossProfit','costOfRevenue','operatingIncome','netIncome']

for col in numeric_columns:
    df[col] = pd.to_numeric(df[col])

balance_df['totalShareholderEquity'] = pd.to_numeric(balance_df['totalShareholderEquity'])    


#===========================
#4.損益計算書と貸借対照表を結合
#===========================

df = pd.merge(df,balance_df,on='fiscalDateEnding',how='left')

#===============
#5.財務指標を計算
#===============
#営業利益率
df['operatingMargin'] = (df['operatingIncome'] / df['totalRevenue'] * 100)

#営業利益率前年同期比増減率
df['operatingMargin_yoy'] = (df['operatingMargin'] / df['operatingMargin'].shift(-4) *100 - 100)


#純利益率
df['netIncomeMargin'] = (df['netIncome'] / df['totalRevenue'] * 100)

#純利益率前年同期比増減率
df['netIncomeMargin_yoy'] = (df['netIncomeMargin'] / df['netIncomeMargin'].shift(-4) * 100 -100)

#ROE(自己資本収益率)
df['ROE'] = (df['netIncome']/df['totalShareholderEquity']*100)

#=====================
#6.カラム名を日本語に変更
#=====================
df = df.rename(columns={
    'fiscalDateEnding':'決算日',
    'totalRevenue':'売上高',
    'grossProfit':'粗利益',
    'costOfRevenue':'売上原価',
    'operatingIncome':'営業利益',
    'netIncome':'純利益',
    'operatingMargin':'営業利益率',
    'operatingMargin_yoy':'営業利益率前年同期比増減率',
    'netIncomeMargin':'純利益率',
    'netIncomeMargin_yoy':'純利益率前年同期比増減率',
    'totalShareholderEquity':'自己資本',
    'ROE':'自己資本収益率'
})

#=====================
#7.表示用DataFrameを作成
#=====================

display_df = df.copy()

#金額を「億ドル」に変換
money_columns = [
    '売上高',
    '粗利益',
    '売上原価',
    '営業利益',
    '純利益',
    '自己資本' 
]

for col in money_columns:
    display_df[col] = display_df[col]/100000000


#表示する列の順番

display_df = display_df[
       [
        '決算日',
        '売上高',
        '粗利益',
        '売上原価',
        '営業利益',
        '純利益',  
        '自己資本',
        '営業利益率',
        '営業利益率前年同期比増減率',
        '純利益率',
        '純利益率前年同期比増減率',
        '自己資本収益率',   
    ]
]

#=======================
#8.Jupyter上に表示(確認用)
#=======================

money_columns = [
    '売上高',
    '粗利益',
    '売上原価',
    '営業利益',
    '純利益',
    '自己資本'
]

format_dict = {}

for col in money_columns:
    format_dict[col]='{:,.2f}'

#パーセント
percent_columns = [
    '営業利益率',
    '営業利益率前年同期比増減率',
    '純利益率',
    '純利益率前年同期比増減率',
    '自己資本収益率'
]
for col in percent_columns:
    format_dict[col]='{:,.2f}%'

display(display_df.style.format(format_dict))

#==============================
#9.csv用DataFrameを作成(最終成果物)
#==============================

csv_df = display_df.copy()

#金額

for col in money_columns:
    csv_df[col] = csv_df[col].map(lambda x: f'{x:,.2f}')


#パーセント
for col in percent_columns:
    csv_df[col] = csv_df[col].map(lambda x: f'{x:.2f}%')

#============
#10.csvに保存
#===========
csv_df.to_csv('NVIDIA_quarterlyReports.csv',index = False)

11. 全体まとめ、感想

 今回の記事では、プログラミングスクールで学んだpythonとpandas、APIの使用方法を使って、Alpha VantageからNVIDIAの損益計算書と貸借対照表の中からデータを取得して見やすく加工してからCSVにしました。

コードを作っていく中で「ここをもっとこうしたいけど、できるかな?」と考えることが多々ありました。
これまで学習した内容を復習し、それでもわからないところはChatGPTを活用しながら一つずつ解決していきました。
実際にpythonを使って形にできたことがうれしかったです。

また、財務分析したことがない銘柄で実際にこのプログラムを使用してみました。
実際に電卓をたたいて数字を出すという手間は省けたこと、過去10年で企業の業績がどのように変化してきたかも確認することができました。
一方で、財務分析をするには損益計算書と貸借対照表だけでは情報量が少なく、このプログラムだけでは売買の判断はできないと感じました。

今後は、キャッシュフローなどの情報も追加し、その取得したデータをグラフ化したり、株価のデータも組み合わせて企業の業績がどのように変化し、その変化に対して株価がどのように動いたかを可視化したいと考えています。

今後も学習を続けながら少しずつできることを増やしていきたいと思います。

最後まで読んでくださりありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?