Pythonを使ってドル円換算して株価チャートを表示する方法【通貨レート取得】

10月 30, 2021

日本円を使って米国株に投資する場合,もしくはドルを使って日本株に投資する場合などは,為替の影響を考慮した方が正しいリターンをとらえることができます.

そこで今回は,ドル円を換算して株価チャートを表示する方法について説明します.

この記事を参考にすれば,以下のようにS&P500をドル換算および円換算して比べることができると思います.

ただし,この図はリターン倍率(累積収益率)で表示しています(円とドルでは桁が全然違うため).

※本記事のまとめコードは記事の一番下に改めて記載しています.

為替の時系列データを取得する

円/ドル(1ドルが何円か)の時系列データ(2015/1/1~現在)は,以下のコードで取得できます.

データの取得方法にはいろいろありますが,今回はpandas_datareaderを用いました(使い方の説明はこちら).

import pandas_datareader.data as web
import datetime

start = datetime.date(2015,1,1)
end = datetime.date.today()

data_YD = web.DataReader('JPY=X', 'yahoo', start, end) #get data

data_YDを見てみると,以下のような構造になっています.

print(data_YD)
                  High         Low        Open       Close  Volume   Adj Close
Date                                                                          
2015-01-01  119.672997  119.672997  119.672997  119.672997     0.0  119.672997
2015-01-02  120.736000  119.835999  119.889999  119.870003     0.0  119.870003
2015-01-05  120.608002  119.411003  120.389000  120.433998     0.0  120.433998
2015-01-06  119.497002  118.680000  119.416000  119.425003     0.0  119.425003
2015-01-07  119.639000  118.674004  118.674004  118.672997     0.0  118.672997
...                ...         ...         ...         ...     ...         ...
2021-03-29  110.418999  109.788002  109.830002  109.835999     0.0  109.835999
2021-03-30  110.953003  110.278000  110.292999  110.305000     0.0  110.305000
2021-03-31  110.845001  110.563004  110.737999  110.750000     0.0  110.750000
2021-04-01  110.744003  110.382004  110.620003  110.612999     0.0  110.612999
2021-04-05  110.750000  110.489998  110.657997  110.625999     0.0  110.625999

調整後終値(Adj Close)で描画してみます.この記事を通して,描画にはmatplotlibを使います.

import matplotlib.pyplot as plt
plt.plot(data_YD['Adj Close'],label='YEN/USD')
plt.xlabel('date')
plt.ylabel('YEN/USD')
plt.legend()
plt.show()

2015年よりも2021の方が円高ですね.

ドルから円にするにはこの値を掛け,円からドルにするにはこの値を割ればいいので,円/ドルのデータだけで十分ですね.

ドル円を換算して株価チャートを表示する

ドル→円

今回は,VOO(S&P500連動型ETF)の株価推移を円換算表示してみたいと思います.

株価チャートの取得(S&P500)

まずは普通にVOOの株価(ドル)を取得,表示してみます.調整後終値(Adj Close)で表示します.

data_SP = web.DataReader('VOO', 'yahoo', start, end) #get data
SP_dol = data_SP['Adj Close']
plt.plot(SP_dol,label='SP')
plt.xlabel('date')
plt.ylabel('price')
plt.legend()
plt.show()

※web.DataReaderやstart, endは先ほどのコードと同じです

このドル表示になっているものを,円換算していきます.

ちなみに,このdata_SPの中身は以下のようになっています.

                  High         Low  ...     Volume   Adj Close
Date                                ...                       
2015-01-02  189.720001  187.259995  ...  1865000.0  166.705414
2015-01-05  187.410004  184.660004  ...  2734700.0  163.776566
2015-01-06  185.880005  182.360001  ...  2245300.0  162.166138
2015-01-07  185.910004  184.229996  ...  2305600.0  164.192413
2015-01-08  189.050003  187.070007  ...  1740600.0  167.077057
...                ...         ...  ...        ...         ...
2021-03-26  364.369995  358.750000  ...  3311700.0  364.010010
2021-03-29  364.679993  361.109985  ...  3143300.0  363.790009
2021-03-30  363.470001  361.269989  ...  3696200.0  362.859985
2021-03-31  365.820007  363.390015  ...  7470300.0  364.299988
2021-04-01  368.290009  366.029999  ...  5132000.0  368.160004

株価チャートを円換算

ドルで表示されたVOOの株価に,先ほどの「1ドルあたりの円」の時系列データの各値を掛ければOKです.

SP_yen = data_SP['Adj Close']*data_YD['Adj Close']
print(SP_yen)
Date
2015-01-01             NaN
2015-01-02    19982.978412
2015-01-05    19724.266586
2015-01-06    19366.691489
2015-01-07    19485.205696
                  ...     
2021-03-29    39957.238846
2021-03-30    40025.270795
2021-03-31    40346.223648
2021-04-01    40723.282103
2021-04-05             NaN

2015/1/1と2021/4/5のデータは株価の方で取得できていないので,こちらでもNaNになっています.他の値は正しく掛け算されているようなので,気にせずに描画してみます.

plt.plot(SP_yen,label='SP_yen')
plt.xlabel('date')
plt.ylabel('price')
plt.legend()
plt.show()

円換算してもやはりS&P500はほぼ右肩上がりですね(当たり前ですが).

せっかくなので,ドル表示と円表示を重ねて描画してみましょう.ただし単位が全然違うので,リターン倍率(累積収益率)で比較してみます.

累積収益率にするには,以下のように計算すればOKです.

SP_dol_m=(1+SP_dol.pct_change()).cumprod()
SP_yen_m=(1+SP_yen.pct_change()).cumprod()
plt.plot(SP_dol_m,label='SP_dol_m')
plt.plot(SP_yen_m,label='SP_yen_m')
plt.xlabel('date')
plt.ylabel('price')
plt.legend()
plt.show()

VOOは2015年からの6年間で約2倍になっていますね.

ドル換算表示の方がリターンが良いことが分かりました.つまり,2015年にVOO(S&P500)を買って2021年に売るとしたら,ドルで買っておいた方が良かったということですね.まあ,円高になったことを考えれば当然です.

円で投資しているひとは,よく見るチャート(ドル表示)よりも実はリターンが小さいことを留意した方がいいですね

円→ドル

日経平均株価の株価推移をドル換算表示してみたいと思います.

株価チャートの取得(日経平均株価)

まずは普通に日経平均株価(ドル)を取得,表示してみます.調整後終値(Adj Close)で表示します.

data_NK = web.DataReader('^N225', 'yahoo', start, end) #get data
NK_yen = data_NK['Adj Close']
plt.plot(NK_yen,label='NK225')
plt.xlabel('date')
plt.ylabel('price')
plt.legend()
plt.show()

※web.DataReaderやstart, endは先ほどのコードと同じです

日経平均株価のデータdata_NKは以下のようになっています.

                    High           Low  ...       Volume     Adj Close
Date                                    ...                           
2015-01-05  17540.919922  17219.220703  ...  116500000.0  17408.710938
2015-01-06  17111.359375  16881.730469  ...  166000000.0  16883.189453
2015-01-07  16974.609375  16808.259766  ...  138600000.0  16885.330078
2015-01-08  17243.710938  17016.089844  ...  140600000.0  17167.099609
2015-01-09  17342.650391  17129.529297  ...  155200000.0  17197.730469
...                  ...           ...  ...          ...           ...
2021-03-30  29478.199219  29283.890625  ...   79900000.0  29432.699219
2021-03-31  29348.990234  29165.519531  ...   82000000.0  29178.800781
2021-04-01  29585.460938  29318.820312  ...   75600000.0  29388.869141
2021-04-02  29869.669922  29694.089844  ...   57200000.0  29854.000000
2021-04-05  30195.000000  30024.250000  ...          0.0  30092.789062

これをドル換算していきます.

株価チャートをドル換算

円で表示された日経平均株価を,最初に用意した「1ドルあたりの円」の時系列データの各値で割ればOKです.

NK_dol = data_NK['Adj Close']/data_YD['Adj Close']
print(NK_dol)
Date
2015-01-01           NaN
2015-01-02           NaN
2015-01-05    144.549805
2015-01-06    141.370643
2015-01-07    142.284518
                 ...    
2021-03-30    266.830145
2021-03-31    263.465470
2021-04-01    265.690917
2021-04-02           NaN
2021-04-05    272.022754

ただし,2015/1/1と1/2は日経のデータがなく,2021/4/2のデータは為替のデータがないのでNaNになっています.各日付における計算は問題ないです.

plt.plot(NK_dol,label='NK_dol')
plt.xlabel('date')
plt.ylabel('price')
plt.legend()
plt.show()

では,先ほどと同じように日経平均株価の円換算とドル換算をリターン倍率で比較してみましょう.

NK_yen_m=(1+NK_yen.pct_change()).cumprod()
NK_dol_m=(1+NK_dol.pct_change()).cumprod()
plt.plot(NK_yen_m,label='NK_yen_m')
plt.plot(NK_dol_m,label='NK_dol_m')
plt.xlabel('date')
plt.ylabel('price')
plt.legend()
plt.show()

当然ですが,ドルで見たほうが強いですね.

まとめコード

S&P500(VOO)を円換算して重ねる

import pandas_datareader.data as web
import datetime
import matplotlib.pyplot as plt

start = datetime.date(2015,1,1)
end = datetime.date.today()

data_YD = web.DataReader('JPY=X', 'yahoo', start, end) #get data Yen Dollar

data_SP = web.DataReader('VOO', 'yahoo', start, end) #get data VOO

SP_dol = data_SP['Adj Close']
SP_yen = data_SP['Adj Close']*data_YD['Adj Close']

#conversion to cumprod
SP_dol_m=(1+SP_dol.pct_change()).cumprod()
SP_yen_m=(1+SP_yen.pct_change()).cumprod()

#plot
plt.plot(SP_dol_m,label='SP_dol_m')
plt.plot(SP_yen_m,label='SP_yen_m')
plt.xlabel('date')
plt.ylabel('price')
plt.legend()
plt.show()

実行結果(縦軸はリターン倍率)

日経平均株価をドル換算して重ねる

import pandas_datareader.data as web
import datetime
import matplotlib.pyplot as plt

start = datetime.date(2015,1,1)
end = datetime.date.today()

data_YD = web.DataReader('JPY=X', 'yahoo', start, end) #get data Yen Dollar

data_NK = web.DataReader('^N225', 'yahoo', start, end) #get data NK225

NK_yen = data_NK['Adj Close']
NK_dol = data_NK['Adj Close']/data_YD['Adj Close']

#conversion to cumprod
NK_yen_m=(1+NK_yen.pct_change()).cumprod()
NK_dol_m=(1+NK_dol.pct_change()).cumprod()

#plot
plt.plot(NK_yen_m,label='NK_yen_m')
plt.plot(NK_dol_m,label='NK_dol_m')
plt.xlabel('date')
plt.ylabel('price')
plt.legend()
plt.show()

実行結果(縦軸はリターン倍率)