2023年10月以降の運用実績については「投資でニート生活」で更新しています。

Python データ分析 株式投資

Pythonで株価・為替データを取得して株価を通貨別で比較する【Pythonで株式投資】

2023年3月25日

Pythonで株価・為替データを取得して通貨別で比較する【Pythonで株式投資】

こんにちは。TATです。

今日のテーマは「Pythonで株価・為替データを取得して株価を通貨別で比較する」です。

 

Pythonで株価・為替データを取得して、株価をいろいろな通貨に換算して比較する方法についてご紹介していきます。

例えば、ドルベースで下落していても、円ベースでみたら上昇傾向だったり、違った見え方がしてきます。

 

Pythonを使えば、株価データの取得も為替データの取得も容易にできます。

さらに取得データを使って、ドルベースの株価データを円ベースに換算したり、相対値にして通貨別で株価を比較したり、いろいろな加工が簡単に実装できます。

 

本記事では、例としてNYダウの株価データを円ベースとドルベースで比較してみます。

コードを少し書き換えれば様々な銘柄や通貨に対応することもできるので、ご興味あればいろいろと試してみてください。

 

データの準備

まずはデータの準備です。

今回はNYダウのデータをドルと円で比較したいので、これらのデータが必要です。

 

yahoo_finance_api2で株価・為替データを取得

Pythonで株価や為替データを取得する方法はいくつかありますが、ここではyahoo_finance_api2を使います。

yahoo_finance_api2の詳しい使い方などについてはこちらの記事で解説しているのでご参考ください。

 

次のコードでは、任意銘柄のデータを取得できるget_price_dataという関数を定義して、NYダウとドル円のデータを取得しています。

とりあえずここでは適当に過去20年分の日足データを取得するようにしました。

 

import sys
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
import pandas as pd

# 過去6年分のデータを取得
def get_price_data(ticker):
    # tickerを定義
    my_share = share.Share(ticker)
    symbol_data = None
    
    # データ取得
    try:
        symbol_data = my_share.get_historical(
            share.PERIOD_TYPE_YEAR, 20, # 過去20年分
            share.FREQUENCY_TYPE_DAY, 1) # 日足
    except YahooFinanceError as e:
        print(e.message)
        sys.exit(1)
    
    # DataFrameに変換
    df = pd.DataFrame(symbol_data)
    
    # timestampからdatetime, dateに変換
    df["datetime"] = pd.to_datetime(df.timestamp, unit="ms")
    df["date"] = df["datetime"].dt.date
    
    # date, open, high, low, close, volumeだけ抽出して返す
    return df.set_index("date")[["open", "high", "low", "close", "volume"]]

df = get_price_data("^DJI")
df_usd_jpy = get_price_data("JPY=X")

 

これでデータの取得は完了です。

参考記事
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する

続きを見る

参考記事
【日本株対応】Pythonで株価のローソク足データを取得する方法まとめ【CSV、ライブラリ、スクレイピング】

続きを見る

 

NYダウを円ベースに変換する

次に取得したデータを使って、NYダウを円ベースに変換してみます。

為替データを結合して、そこからドル円とNYダウのカラムを掛け算して円ベースのNYダウを計算しました。

一部の為替データが欠損していたので、前日のデータで補完しています。

 

# ドル円の終値を結合
df = pd.concat(
    [df, df_usd_jpy.rename(columns={"close": "usdjpy"})[["usdjpy"]]], axis=1
)

# index(date)で並び替え
df.sort_index(inplace=True)

# indexの名前をdateと定義
df.index.name="date"

# ドル円のNaNを前日のデータで補完
df["usdjpy"] = df["usdjpy"].fillna(method="ffill")

# NYダウのデータが存在しない行を排除
df.dropna(subset=["close"], inplace=True)

# 円ベースのNYダウを計算
df["jpy"] = df["close"] * df["usdjpy"]

 

これで円ベースのNYダウが計算できました。

 

必要なカラムだけ抽出して完成

最後に必要なカラムだけ残して、不要なものは消してしまいます。

dfで必要になるものは、closejpyの2つのカラムだけです。残りは不要なので消します。

ついでにカラム名をcloseからusdに変更します。

df = df[["close", "jpy"]].rename(columns={"close": "usd"})

 

だいぶスッキリしました。

これでデータの準備は完了です。

 

チャートで可視化してみる

それでは用意したデータをチャートで可視化してきます。

今回はPlotlyを使って可視化していきます。

 

Plotlyを使うと簡単にインタラクティブな綺麗なチャートを描くことができます。

 

とりあえずそのまま可視化

まずはシンプルにそのまま可視化します。

 

ドルベース

こちらはドルベースのNYダウです。

使用したコードも合わせて紹介します。

import plotly.express as px
fig = px.area(data_frame=df.reset_index(), x="date", y="usd")

fig.update_yaxes(tickformat=",", title="NYダウ[ドル]", tickprefix="$")
fig.update_xaxes(title="日付")

fig.show()

 

リーマンショック後の上昇がすごいですね。

コロナショックも跳ね返して上昇が続いています。

2022年になってからは軟調な展開が続いています。

 

円ベース

次に円ベースでもみてみましょう。

コードは先ほどとほぼ同じなので省略します。

 

ドルベースと比較すると少し違いますね。

リーマンショック後の2009〜2013年くらいを比較すると、ドルベースでは上昇していますが、円ベースでは横ばいです。

円ベースのNYダウは2013年から急激に上昇トレンドに入っています。これはアベノミクスによるものですね。

 

また、直近の2022年以降のデータでは、ドルベースでは下落基調ですが、円ベースでは逆に上昇しています。

これは急激な円安が進んだためです。

 

このように、通貨が変われば見え方が全く変わってきます。

 

相対値にして横並びで可視化して比較する

次にこれらの異なる通貨によるデータを横並びで比較してみましょう。

そのまま比較すると単位が異なるので変な感じになってしまいますが、相対値に変換してあげればこれが可能です。

 

こちらの記事でも紹介しました。

参考記事
【コード解説】Pythonで異なる株価データを横並びで比較する
【コード解説】Pythonで異なる株価データを横並びで比較する

続きを見る

 

相対値に変換する

まずは相対値に変換します。

今回は利用するデータの一行目(2003年2月18日)を100として、そこからの変化率で比較していきます。

 

df_relative = df / df.iloc[0] * 100
df_relative.head()

 

loc関数で一行目を抜き出して、これで行ごとに割れば完了です。

結果を見ると、 2003年2月18日のデータを100として、以降は相対値に変換されていることが確認できます。

 

pandasのmeltで整然データに変換する

次にデータの変形です。

Plotlyで可視化する際に都合を良くするために、データの形式を整然データに変えます。

 

melt関数を使えば整然データへの変形が簡単に実装できます。(こちらの記事でも解説しています)

df_melt = df_relative.reset_index().melt(
    value_vars=["usd", "jpy"], 
    id_vars=["date"], 
    var_name="currency", 
    value_name="price"
)
df_melt.head()

 

これでデータの準備はOKです。

 

関連記事
整然データが一瞬で作れるPandasのmelt関数の使い方を徹底解説!【Pythonコード解説】
整然データが一瞬で作れるPandasのmelt関数の使い方を徹底解説!【Pythonコード解説】

続きを見る

 

可視化する

いよいよ仕上げです。

用意したデータをplotlyで可視化してみましょう。

 

import plotly.express as px
fig = px.line(data_frame=df_melt, x="date", y="price", color="currency")

fig.update_yaxes(title="NYダウ(初期値を100とした際の相対値)")
fig.update_xaxes(title="日付")

fig.show()

 

これでかなり比較しやすくなりました。

先述した2009年から2013年、2022年以降のドルベースと円ベースのNYダウの値動きの差が簡単に比べられるようになりました。

単位が異なるデータでも相対値に変換して横並びにすると違いが一目瞭然です。

 

まとめ

本記事では「Pythonで株価データと為替データを取得して通貨別で比較する」というテーマで、NYダウを例にドルベースと円ベースで比較してみました。

 

1つの株価指数や銘柄をとっても、通貨が異なれば見え方は全く異なってきます。

そのまま比較すると単位が違うので横並びで見ることはできませんが、相対値に変換してあげれば簡単に比較が可能です。

 

Pythonを使えば、株価や為替データの取得はもちろん、データの結合や変換、可視化なども簡単に実装することができます。

本記事で紹介したコードを少し書き換えれば、NYダウ以外にもいろいろな銘柄や通貨に対応することもできると思います。

もしご興味あればいろいろと試してみてください。

 

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

 

おすすめPython学習法

Udemy:セール中なら90%オフで購入可能。豊富なコースから選べる!

データミックス:Pythonとビジネスについて学べる!起業したい方にもおすすめ!

SAMURAI TERAKOYA:月額2,980円〜利用できるコスパ最強スクール!

 

-Python, データ分析, 株式投資
-, , ,

© 2023 気ままなブログ