Edited at

Yahoo Finance USから株価をダウンロードしてみた

株式市場を理解する1つの良い方法は過去の株価を取得してチャートを描いてみたり、統計分析をしてみることです。株価の動きを経済変数と比較してみるなどということも大事です。このような環境は海外のほうが日本よりも充実しているようです。しかし、最近はフリーでダウンロードできる株価データが世界的に減少するという状況が続いていました。Yahoo Financeはフリーで株価を提供してくれる重要なサイトでしたが、2017年5月ごろよりおかしくなりました。まだ、公式には発表されていないかもしれませんが、どうもYahoo Finance USではデータの提供を再開しているようです。そこでつぎのようなコードを試してみました。

ダウンロードにはpandasのdatareaderが必要です。インストールされていない人はインストールが必要です。(Jupyter notebookをインストールされていない方はインストールをお勧めします。https://qiita.com/innovation1005/items/2f433d6d859f075033a7)

$ pip install pandas-datareader

%matplotlib inline 

import matplotlib.pyplot as plt #描画ライブラリ
import pandas_datareader.data as web #データのダウンロードライブラリ
tsd = web.DataReader("usmv","yahoo","1980/1/1").dropna()#jpy
tsd.loc[:,'Adj Close'].plot()

ダウンロードした株価は米国の上場投資信託(ETF)のリスクパリティ-最小分散ポートフォリオ戦略を用いたusmvです。

image.png

このETFは安定した収益の獲得を目指し、最小分散ポートフォリオというアルゴリズムを用いて運用されています。

https://www.bloomberg.co.jp/quote/USMV:US

この他の株価のダウンロードを試してみましたが、以前よりもスムースにダウンロードされている気がします。

NDX=['AAL','AAPL','AMD','ALGN','ADBE','ADI','ADP','ADSK','ALXN','AMAT',

'AMGN','AMZN','ASML','ATVI','BIDU','BIIB','BMRN','BKNG','AVGO','CDNS',
'CELG','CERN','CHKP','CMCSA','COST','CSCO','CSX','CTAS','CTRP','CTSH',
'CTXS','DLTR','EA','EBAY','EXPE','FAST','FB','FISV','FOX','FOXA',
'GILD','GOOG','GOOGL','HAS','HSIC','HOLX','IDXX','ILMN','INCY',
'INTC','INTU','ISCA','ISRG','JBHT','JD','KHC','KLAC','LBTYB','LBTYA',
'LBTYK','LULU','LILA','LILAK','LRCX','MAR','MCHP','MELI','MNST',
'MSFT','MU','MXIM','MELI','MYL','NTAP','NFLX','NTES','NVDA','NXPI',
'ORLY','PAYX','PCAR','PYPL','PEP','QCOM','REGN','ROST','SBUX','SYMC',
'SNPS','SIRI','SWKS','SYMC','TMUS','TTWO','TSLA','TXN','KHC',
'ULTA','UAL','VRSN','VRSK','VRTX','WBA','WDC','WLTW','WDAY','WYNN','XEL']

などを試しましたが、問題ありませんでした。

アメリカの代表的なETFのパフォーマンス。

ダウジョーンズ

tsd = web.DataReader("dia","yahoo","1980/1/1").dropna()#jpy

tsd.loc[:,'Adj Close'].plot()

image.png

ナスダック100

tsd = web.DataReader("qqq","yahoo","1980/1/1").dropna()#jpy

tsd.loc[:,'Adj Close'].plot()

image.png

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

最近、以前ダウンロードできていた株価指数もダウンロードできるようになりました。

日経225です。

tsd = web.DataReader("^N225","yahoo","1970/1/4").dropna()#jpy

tsd.loc[:,'Adj Close'].plot()

image.png


代表的なダウジョーンズ株

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

現在の構成銘柄は、

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']

コード
銘柄

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
エクソンモービル

です。


代表的な世界の株価指数

index=["^DJI","^DJT","^DJU","^BANK","^IXCO","^NDX","^NBI",

"^NDXT","^INDS","^INSR","^OFIN","^IXTC","^TRAN","^NYY","^NYI","^NY",
"^NYL","^XMI","^OEX","^GSPC","^HSI","^FCHI","^BVSP","^N225","^RUA","^XAX"]

^DJI
Dow Jones Industrial Average

^DJT
Dow Jones Trnsport

^DJU
Dow Jones Utility Average

^BANK
NASDAQ Bank

^IXCO
NASDAQ Computer

^NDX
NASDAQ-100

^NBI
NASDAQ Biotechnology

^NDXT
NASDAQ 100 Technology

^INDS
NASDAQ Industrial

^INSR
NASDAQ Insurance

^OFIN
NASDAQ Other Finance

^IXTC
NASDAQ Telecommunications

^TRAN
NASDAQ Transportation

^NYY
NYSE TMT INDEX

^NYI
NYSE INTL 100 INDEX

^NY
NYSE US 100 INDEX

^NYL
NYSE NY World Leader Index

^XMI
NYSE ACRA Major Market Index

^OEX
S&P 100 Index

^GSPC
S&P 500 Index

^HSI
Hang Seng Index

^FCHI
CAC 40

^BVSP
IBOVESPA

^N225
Nikkei 225

^RUA
Russel 3000

^XAX
NY AMEX Composit Index


代表的な米国ETF

ETF=['DIA','SPY','QQQ','IBB','XLV','IWM','EEM','EFA','XLP','XLY','ITB','XLU','XLF',

'VGT','VT','FDN','IWO','IWN','IYF','XLK','XOP','USMV','BAB','GLD',
'VNQ','SCHH','IYR','XLRE','AGG','BND','LQD','VCSH','VCIT']#5```


代表的なS&P株

SP100=["AAPL","ABBV","ABT","ACN","AGN","AIG","ALL","AMGN","AMZN","AXP","BA","BAC","BIIB",

"BK","BLK","BMY","BRKB","C","CAT","CELG","CHTR","CL","CMCSA","COF","COP","COST","CSCO",
"CVS","CVX","DHR","DIS","DUK","DWDP","EMR","EXC","F","FB","FDX","FOX","FOXA","GD","GE",
"GILD","GM","GOOG","GOOGL","GS","HAL","HD","HON","IBM","INTC","JNJ","JPM","KHC","KMI",
"KO","LLY","LMT","LOW","MA","MCD","MDLZ","MDT","MET","MMM","MO","MRK","MS","MSFT",
"NEE","NKE","ORCL","OXY","PEP","PFE","PG","PM","PYPL","QCOM","RTN","SBUX",
"SLB","SO","SPG","T","TGT","TXN","UNH","UNP","UPS","USB","UTX","V","VZ","WBA",
"WFC","WMT","XOM"]


代表的な暗号通貨

https://finance.yahoo.com/cryptocurrencies

ccurrency=["BTC-USD","XRP-USD","ETH-USD","LTC-USD","BCH-USD","BNB-USD",

"EOS-USD","USDT-USD","LINK-USD","TRX-USD","ADA-USD",
"XLM-USD","XMR-USD","DASH-USD","NEO-USD","IOT-USD",
"VEN-USD","ETC-USD","XEM-USD","ZEC-USD","XRB-USD","QTUM-USD",
"BTG-USD","BAT-USD","DOGE-USD"]

Bitcoin USD
BTC-USD

Ripple USD
XRP-USD

Ethereum USD
ETH-USD

Litecoin USD
LTC-USD

Bitcoin Cash / BCCUSD
BCH-USD

Binance Coin USD
BNB-USD

EOS USD
EOS-USD

Tether USD
USDT-USD

ChainLink USD
LINK-USD

Tronix USD
TRX-USD

Cardano USD
ADA-USD

Stellar USD
XLM-USD

Monero USD
XMR-USD

DigitalCash USD
DASH-USD

NEO USD
NEO-USD

IOTA USD
IOT-USD

Vechain USD
VEN-USD

Ethereum Classic USD
ETC-USD

NEM USD
XEM-USD

ZCash USD
ZEC-USD

Nano USD
XRB-USD

QTUM USD
QTUM-USD

Bitcoin Gold USD
BTG-USD

Basic Attention Token USD
BAT-USD

Dogecoin USD
DOGE-USD


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

これらの銘柄の株価を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

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


特にシステムトレードに興味のある方

システムトレードってなに? https://qiita.com/innovation1005/items/2b5a291b98ebf39dfd8b

リスクマネジメントって何? https://qiita.com/innovation1005/items/8419cda5d57f9f7b1a85


予測に興味のある方

予測について https://qiita.com/innovation1005/items/76d8a93c261e7d357ab8


経済データのダウンロード

https://qiita.com/innovation1005/items/edcf78cbf89477b3b0a7


外国為替に興味のある方

外国為替レートについて https://qiita.com/innovation1005/items/f5cef6f6e3d1c97d17d1


高頻度取引について

グロスマン・ミラーモデル(翻訳) https://qiita.com/innovation1005/items/8f3da94f6af3e05fa461


人工知能関連

誰でもわかるニューラルネットワーク https://qiita.com/innovation1005/items/92fa0d10432ff4f8c38b

誰でもわかるニューラルネットワーク:アプリのように動かす人工知能ーテンソルフロープレイグラウンド https://qiita.com/innovation1005/items/e269d8bac3032e34fd15

誰でもわかるニューラルネットワーク:「回帰」と「平均への回帰」 https://qiita.com/innovation1005/items/a193527839955ba77e73

誰でもわかるニューラルネットワーク:貧困の撲滅 https://qiita.com/innovation1005/items/a9ebc0a1a199f1aa66c6

誰でもわかるニューラルネットワーク:正則化をテンソルフロープレイグラウンドで試してみた https://qiita.com/innovation1005/items/e6f035d74675d94744c8


参考

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

image.png

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

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