Python
Finance
DataScience
pandas-datareader
SystemtaicTrading

Yahoo Finance us からダウ工業株30種平均に採用されている銘柄をダウンロードしてリターンとリスクをみる

Yahoo Finance USからダウ工業株30種平均(Dow Jones Industrial Average - DJIA)に採用されている銘柄の株価をダウンロードしてみます。

「ダウ平均」、「ニューヨーク・ダウ」、「ニューヨーク平均株価」などとして親しまれている当指数は、チャールズ・ダウにより考え出され、1884年から算出されています。発表当初は鉄道株が中心でした。19世紀末には変わりゆく経済の姿を受け、1896年から新たなダウ工業株平均の算出が始まりました。その後ダウ工業株30種平均株価を構成する銘柄は時代の流れに合わせて入れ替えが行われています。今現在もっとも古くから採用されている銘柄はエクソンモービルで1928年から採用されています。

現在の構成銘柄は、

コード
銘柄

AAPL
アップル コンピュータ

AXP
アメリカン・エキスプレス

BA
ボーイング

CAT
キャタピラー

CSCO
シスコシステムズ

CVX
シェブロン

DIS
ウォルト・ディズニー・カンパニー

DWDP
ダウ・デュポン

GS
ゴールドマン・サックス

HD
ホームデポ

IBM
アイ・ビー・エム コンピューター

INTC
インテル

JNJ
ジョンソン・エンド・ジョンソン

JPM
JPモルガン・チェース

KO
ザ コカ・コーラ カンパニー

MCD
マクドナルド

MMM
スリーエム

MRK
メルク

MSFT
マイクロソフト

NKE
ナイキ

PFE
ファイザー

PG
プロクター・アンド・ギャンブル (P&G)

TRV
トラベラーズ

UNH
ユナイテッド・ヘルス

UTX
ユナイテッド・テクノロジーズ

V
Visa

VZ
ベライゾン・コミュニケーションズ

WBA
ウォルグリーン・ブーツ・アライアンス

WMT
ウォルマート・ストアーズ

XOM
エクソンモービル

です。

これらの銘柄の株価をpandas datareaderを用いてダウンロードしてみましょう。まず最初はリーマンショック以降のデータを見てみましょう。データを取得したら年率換算の平均リターンを求めて、年率換算の標準偏差を計算します。これらには価格の対数の差を用います。年率換算された対数価格差の標準偏差をボラティリティと呼びます。また、平均リターンをボラティリティで割って単位ボラティリティ当たりのリターンを求めてみましょう。

import matplotlib.pylab as plt

import seaborn as sns
import pandas_datareader.data as web
import numpy as np
import pandas as pd

DJ=['AAPL','AXP','BA','CAT','CSCO','CVX','DIS','DWDP','GS','HD',
'IBM','INTC','JNJ','JPM','KO','MCD','MMM','MRK','MSFT','NKE',
'PFE','PG','TRV','UNH','UTX','V','VZ','WBA','WMT','XOM']
m=[]#それぞれの株価の年率換算平均のデータを保存
v=[]#それぞれの株価の年率換算した標準偏差を保存
for i in range(len(DJ)):
tsd=web.DataReader(DJ[i], "yahoo",'2009/1/1')#株価データのダウンロード
lntsd=np.log(tsd.iloc[:,5])#データの自然対数を取る
m.append((lntsd.diff().dropna().mean()+1)**250-1)
v.append(lntsd.diff().dropna().std()*np.sqrt(250))
print('{0: 03d}'.format(i+1),'{0:7s}'.format(DJ[i]),'平均{0:5.2f}'.format(m[i]),
'ボラティリティ {0:5.2f}'.format(v[i]),'m/v {0:5.2f}'.format(m[i]/v[i]),
' データ数{0:10d}'.format(len(tsd)))
v_m=pd.DataFrame({'v':v,'m':m})
sns.jointplot(x='v',y='m',data=v_m,color="g")

結果はつぎのとおりです。

平均
ボラティリティ
m/v
データ数

AAPL
0.34
0.27
1.26
2530

AXP
0.20
0.32
0.63
2530

BA
0.27
0.26
1.02
2530

CAT
0.15
0.31
0.50
2530

CSCO
0.13
0.26
0.50
2530

CVX
0.08
0.22
0.37
2530

DIS
0.19
0.23
0.80
2530

DWDP
0.18
0.34
0.52
2530

GS
0.10
0.31
0.33
2530

HD
0.26
0.22
1.16
2530

IBM
0.07
0.20
0.34
2530

INTC
0.16
0.26
0.63
2530

JNJ
0.11
0.15
0.75
2530

JPM
0.15
0.35
0.44
2530

KO
0.12
0.16
0.78
2530

MCD
0.15
0.16
0.90
2530

MMM
0.16
0.20
0.78
2530

MRK
0.14
0.21
0.64
2530

MSFT
0.21
0.25
0.86
2530

NKE
0.24
0.25
0.97
2530

PFE
0.13
0.20
0.66
2530

PG
0.07
0.16
0.47
2530

TRV
0.13
0.21
0.64
2530

UNH
0.27
0.27
1.02
2530

UTX
0.10
0.21
0.49
2530

V
0.29
0.26
1.12
2530

VZ
0.11
0.18
0.64
2530

WBA
0.14
0.26
0.53
2530

WMT
0.08
0.18
0.46
2530

XOM
0.02
0.19
0.11
2530

なんとリスクとリターンの比率が1を超えるものがいくつかあります。

image.png

つぎにさらに長い期間のデータをダウンロードしてデータを分析してみましょう。

m2=[]#それぞれの株価の年率換算平均のデータを保存

v2=[]#それぞれの株価の年率換算した標準偏差を保存
for i in range(len(DJ)):
tsd=web.DataReader(DJ[i], "yahoo",'1975/1/1')#株価データのダウンロード
lntsd=np.log(tsd.iloc[:,5])#データの自然対数を取る
m2.append((lntsd.diff().dropna().mean()+1)**250-1)
v2.append(lntsd.diff().dropna().std()*np.sqrt(250))
print('{0: 03d}'.format(i+1),'{0:7s}'.format(DJ[i]),' 平均{0:5.2f}'.format(m2[i]),
' ボラティリティ {0:5.2f}'.format(v2[i]),' m/v {0:5.2f}'.format(m2[i]/v2[i]),
' データ数{0:10d}'.format(len(tsd)))
v_m2=pd.DataFrame({'v2':v2,'m2':m2})
sns.jointplot(x='v2',y='m2', data=v_m2, color="g")

結果はつぎのとおりです。

平均
ボラティリティ
m/v
データ数

AAPL
0.26
0.47
0.55
9607

AXP
0.15
0.34
0.45
11112

BA
0.19
0.30
0.64
11112

CAT
0.14
0.30
0.46
11112

CSCO
0.25
0.41
0.62
7287

CVX
0.18
0.26
0.69
11112

DIS
0.16
0.30
0.52
11112

DWDP
0.11
0.31
0.36
11112

GS
0.07
0.37
0.18
4961

HD
0.28
0.37
0.74
9413

IBM
0.11
0.26
0.44
11112

INTC
0.16
0.40
0.39
9796

JNJ
0.44
0.33
1.34
11112

JPM
0.16
0.36
0.45
9796

KO
0.20
0.24
0.84
11112

MCD
0.26
0.27
0.96
11112

MMM
0.15
0.23
0.65
11112

MRK
0.13
0.26
0.50
11112

MSFT
0.25
0.34
0.73
8282

NKE
0.55
0.44
1.24
9616

PFE
0.29
0.31
0.92
11112

PG
0.19
0.23
0.84
11112

TRV
0.13
0.29
0.46
9796

UNH
0.25
0.41
0.62
8635

UTX
0.22
0.27
0.83
11112

V
0.26
0.30
0.87
2729

VZ
0.16
0.24
0.65
8864

WBA
0.25
0.29
0.86
9796

WMT
0.24
0.29
0.84
11112

XOM
0.19
0.23
0.82
11112

image.png

驚くことにこちらにもリスクとリターンの比率が1を超えるものがあります。

つぎにリターンとボラティリティの比率を2つの期間についてプロットしてみましょう。

plt.scatter(v_m2.m2/v_m2.v2,v_m.m/v_m.v)

plt.ylabel('2009-now')
plt.xlabel('1975-now')

image.png

なんと期間にかかわらず同じような比率を維持しています。これって目からうろこの出るような情報ではないでしょうか?

追記:2019年1月よりYahoo Financeよりデータをダウンロードしていますが、徐々にうまくダウンロードできない場合が増え始めています。まだ、このサービスは公式発表されていないので、試験段階だと思います。ダウンロードするタイミングによってどの銘柄がダウンロードできないかが変わりますので、アクセス数の影響かもしれません。また特定の銘柄はダウンロードができなくなっています。このような銘柄はWEBからもダウンロードできません。

参考

「Python3ではじめるシステムトレード」(パンローリング)

「タートル流投資の魔術](徳間書店)

Pandas datareader (https://pandas-datareader.readthedocs.io/en/latest/)

「Yahoo Finance USから株価をダウンロードしてみた」(https://qiita.com/innovation1005/items/5be026cf7e1d459e9562)

「Yahoo Finance USからナスダック100の銘柄をダウンロードしてリスクとリターンの関係を見た」(https://qiita.com/innovation1005/items/28d286562e2c35e6d2f9)