株式市場を理解する1つの良い方法は過去の株価を取得してチャートを描いてみたり、統計分析をしてみることです。株価の動きを経済変数と比較してみるなどということも大事です。このような環境は海外のほうが日本よりも充実しています。
Python3を用いてデータをダウンロードするためには、jupyter notebookがお勧めです。jupyter notebookのインストールについてはPython3ではじめるシステムトレード:Jupyter notebookのインストールを参考にしてください。
必要なファイルはhttps://github.com/innovation1005/system_trade
からダウンロードしてください。
yahoo_finance.ipynb:本WEBサイトのjupyter notebookファイル
nasdaq.csv: nasdaq100採用銘柄ティッカーコード
djia.csv:djia採用銘柄ティッカーコード
sp500.csv:sp500採用銘柄ティッカーコード
202411261053 59164
注1:
2017年春ごろからフリーでダウンロードできる株価データが世界的に減少する傾向が続いていました。Yahoo Financeはフリーで株価を提供してくれる重要なサイトでしたが、2017年5月ごろよりサービスに支障をきたすようになりました。
しかし2017年年末ごろより、APIによるデータの提供を再開。Yahooはサービスの再開に際してデータを修正。以前から言われているようにYahooのデータは必ずしも信用できるとは限らないということです(これはyahooのデータに限りません。どのデータソースも同じです)。しかし、今回改善されたようです(チェックはしてません)。あくまでイメージです。
2022/12/28 yahoo finance はAPIのサービスを中止しています。
yfinance(https://pypi.org/project/yfinance/)
yahoofinancials(https://pypi.org/project/yahoofinancials/)
yahoo_fin(http://theautomatic.net/yahoo_fin-documentation/)
の使用をお勧めします。
2023/05/26に記事を修正:yfinanceとyahoofinancialsの紹介とグラフのアップデート(47967)
yfinanceのインストール
pip install yfinance
yahoofinancialsのインストール
pip install yahoofinancials
%matplotlib inline
import matplotlib.pyplot as plt #描画ライブラリ
import pandas as pd
import numpy as np
import yfinance as yf
from yahoofinancials import YahooFinancials
check
ダウンロードの結果の比較
ticker = yf.Ticker('usmv')
tsd = ticker.history(period="16y")
tsd.head(2)
yahoo_financials = YahooFinancials('USMV')
data = yahoo_financials.get_historical_price_data(start_date='2010-01-01',
end_date='2023-12-31',
time_interval='weekly')
tsd_df = pd.DataFrame(data['USMV']['prices'])
tsd_df = tsd_df.drop('date', axis=1).set_index('formatted_date')
tsd_df.head(2)
yahoo! financeのhistrical dataの取得 画面コピー
日付もAdjysted closeもcloseも異なります。yfinanceのCloseはyahoo! financeのadj closeのようです。以後簡単なyfinanceを使います。
US yahoo! financeのデータ構成
- Open:始値
- High:高値
- Low:安値
- Close:終値 - 分割調整後
- Volume:出来高
- Adj Close:配当込み分割調整後株価
株価データの可視化
代表的な米国ETF(上場投資信託)
ETFとは上場投資信託のことで手数料の点で株式と同じ手数料で売買ができるために、通常の投資信託よりも費用の面で有利です。
では実際にダウンロードしてみましょう。
ticker = yf.Ticker('usmv')
tsd = ticker.history(period="16y")
#tsd.Close.plot()
dividends=yf.Ticker('usmv').history(period="16y").Dividends.cumsum()
close=yf.Ticker('usmv').history(period="16y").Close
close0=close-dividends
np.log(close).plot(label='with dividends')
np.log(close0).plot(label='payout dividends')
plt.legend()
ダウンロードした株価は米国の上場投資信託(ETF)のリスクパリティ-最小分散ポートフォリオ戦略を用いたusmvです。
このETFは安定した収益の獲得を目指し、最小分散ポートフォリオというアルゴリズムを用いて運用されています。
ポートフォリの詳細はつぎURLよりExcel形式でダウンロード可能です。
https://www.blackrock.com/us/individual/products/239695/ishares-msci-usa-minimum-volatility-etf
ダウジョーンズ
ticker = yf.Ticker('dia')
tsd = ticker.history(period="26y")
tsd.Close.plot()
ナスダック100
ticker = yf.Ticker('qqq')
tsd = ticker.history(period="26y")
tsd.Close.plot()
QQQはInvescoが運用するナスダック100連動のETFですが、そのポートフォリオの詳細はつぎのURLよりExcel形式でダウンロード可能です。
日経平均株価
日本の代表的な株価指数である日経平均株価(日経225)もダウンロード可能です。
ticker = yf.Ticker('^N225')
tsd = ticker.history(period="100y")
tsd.Close.plot()
長期のチャートは対数値に変換します。
import numpy as np
ticker = yf.Ticker('^N225')
tsd = ticker.history(period="100y")
np.log(tsd.Close).plot()
アベノミクス(2013年)以降の指数をダウンロードしてみましょう。
tsd.loc['2013':,'Close'].plot()
米国株投資の日本円でリターン
最近、日本株が安定した値上がりを示しているために、米国株とのパフォーマンスの比較が出ます。多くは日経225の日本円でのリターンと米国株のドル建てのリターンを比べています。ここでは米国株投資を日本円のリターンに直して示してみます。
ナスダック
# QQQとJPY/USDのデータを取得
qqq = yf.Ticker('QQQ').history(period="26y")['Close']
jpy = yf.Ticker('JPY=X').history(period="26y")['Close']
# データフレームを作成し、日付をインデックスとして結合
df = pd.DataFrame({'QQQ_USD': qqq, 'JPY_USD': jpy})
# NaN値を処理(前方の値で穴埋め)
df.fillna(method='ffill', inplace=True)
# QQQの価格を日本円に換算
df['QQQ_JPY']= (df['QQQ_USD'] * df['JPY_USD'])
df=df.dropna()
lenqqq=len(qqq)
n225 = yf.Ticker('^N225').history(period="100y").Close
np.log(n225.loc["1999/3/10":]/n225.loc["1999/3/10"]).plot(label='n225')
p0=df.QQQ_JPY.loc["1999/3/10"]
np.log(df.QQQ_JPY/p0[0]).plot(label='nasdaq_jpy')
plt.legend()
plt.show()
主な株価指数の構成銘柄
代表的なナスダック100指数を構成する銘柄
アメリカ経済を牽引する銘柄群です。
NDX=pd.read_csv("nasdaq.csv",header=None)
NDX.head()
for x in NDX.iloc[:,0]:
ticker = yf.Ticker(x)
tsd = ticker.history(period="1y")
len(NDX)
100
nasdaq.csvは自分で作ることができます。https://en.wikipedia.org/wiki/Nasdaq-100
にナスダック100のリストがありますから、それをエクセルにペーストして、株価コードだけをcsvファイルとして落とせば完了です。1年に一度、見直しがあるので、入れ替えは頻繁に起こると思ってください。
より明確に日経平均とNASDAQに投資した際の円建てのリターンを為替リスクのヘッジなしで比べたときの結果を示します。
import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime
import pandas_datareader.data as pdr
# 日経225のデータを取得
n225 = yf.Ticker('^N225').history(period="100y")['Close']
# インデックスを pd.Timestamp 型に統一し、タイムゾーン情報を削除
n225.index = pd.to_datetime(n225.index).tz_localize(None)
# '1985/01/01' が存在するか確認し、最も近い日付を取得
start_date = "1971-02-05"
if start_date not in n225.index:
start_date = n225.index[n225.index.get_indexer([pd.Timestamp(start_date)], method="nearest")[0]]
# NDX100とJPY/USDのデータを取得
#ndx = yf.Ticker('^NDX').history(period="100y")['Close'].dropna()
ndx = yf.Ticker('^IXIC').history(period="100y")['Close'].dropna()
# インデックスを pd.Timestamp 型に統一し、タイムゾーン情報を削除
ndx.index = pd.to_datetime(ndx.index).tz_localize(None)
# FRED から USD/JPY のデータを取得
start_date = datetime(1971, 2, 5)
end_date = datetime.today()
jpy = pdr.DataReader("DEXJPUS", "fred", start_date, end_date)
# 欠損値を埋める(forward-fill)
jpy = jpy.fillna(method="ffill")
# または線形補間を使用
# jpy = jpy.interpolate(method="linear")
# NaNを削除(必要なら)
jpy = jpy.dropna()
# jpy.index も pd.Timestamp 型に変換
jpy.index = pd.to_datetime(jpy.index)
# データをフィルタリング
jpy = jpy[jpy.index >= pd.Timestamp(start_date)]
ndx = ndx[ndx.index >= pd.Timestamp("1971-02-05")]
# データフレームを作成して結合
df = pd.DataFrame({'NDX_USD': ndx, 'DEXJPUS': jpy.DEXJPUS}).dropna()
df.fillna(method='ffill', inplace=True)
# ndxの価格を日本円に換算
df['NDX_JPY']= (df['NDX_USD'] * df['DEXJPUS'])
df=df.dropna()
ln_ndx=np.log(df.NDX_JPY/df.NDX_JPY.loc[start_date])
ln_ndx.plot()
# 正規化して対数スケールでプロット
ln_n225 = np.log(n225.loc[start_date:] / n225.loc[start_date])
ln_n225.plot(label='N225', figsize=(6, 4))
# プロットの装飾
plt.title('Normalized Log Scale of N225 from 1985')
plt.xlabel('Date')
plt.ylabel('Log Scale (Normalized to Closest to 1985/01/01)')
plt.legend()
plt.grid()
plt.show()
代表的なダウ平均株価指数採用銘柄
「ダウ平均」、「ニューヨーク・ダウ」、「ニューヨーク平均株価」などとして親しまれている当指数は、チャールズ・ダウにより考え出され、1884年から算出されています。発表当初は鉄道株が中心でした。19世紀末には変わりゆく経済の姿を受け、1896年から新たなダウ工業株平均の算出が始まりました。その後ダウ工業株30種平均株価を構成する銘柄は時代の流れに合わせて入れ替えが行われています。今現在もっとも古くから採用されている銘柄はエクソンモービルで1928年から採用されています。
現在の構成銘柄は、
DJIA=pd.read_csv("djia.csv",header=None)
DJIA.head()
djia.csvは自分で作ることができます。https://en.wikipedia.org/wiki/Dow_Jones_Industrial_Average
にDJIAのリストがありますから、それをエクセルにペーストして、株価コードだけをcsvファイルとして落とせば完了です。入れ替えは頻繁に起こると思ってください。
US Yahoo Financeからダウンロードできるその他の主な株価、指数、暗号通貨
代表的な世界の株価指数
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 |
^SOX | PHLX Semiconductor Index |
SOX指数はフィラデルフィア連銀による半導体株指数。半導体株の動向に大きな影響がある。
代表的なS&P株
現在の構成銘柄は、wikiのページから銘柄リストをエクセルにペーストしてティッカーの部分だけを残してsp500.csvファイルとして保存します。
SP500=pd.read_csv("sp500.csv",header=None)
SP500.head()
for x in SP500.iloc[:,0]:
ticker = yf.Ticker(x)
tsd = ticker.history(period="1mo")
len(SP500)
代表的な米国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','JNK']
代表的なバイオ・ヘルス株
代表的なバイオ・ヘルス株の銘柄を得るために代表的なバイオ株へ投資しているETFを参考に銘柄を絞り込みます。まず、IBBを参考にします。IBBのホームページに行きます。
https://www.ishares.com/us/products/239699/ishares-biotechnology-etf
つぎにholdingをクリックすると、投資銘柄リストをダウンロードできるボタンがあります。
左下のDetailed Holdings and Analyticsのボタンを押すと関連ファイルがダウンロードホルダーにダウンロードできます。
IBB_holdings.csv
エクセルでファイルを開いてティカーコードだけを残して、IBB.csvとして保存します。
IBB=pd.read_csv("IBB.csv",header=None)
IBB.head()
for x in IBB.iloc[:,0]:
ticker = yf.Ticker(x)
tsd = ticker.history(period="1mo")
len(IBB)
代表的な暗号通貨
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 |
さて、重要なことをまだ説明していません。それはデータを分析することで何が得られるのかという点です。多くの人は何か理論的な確証を得て効果的で効率の良い投資ができるのではと考えていませんか?実はそのような理論も事実もありません。あるのは株価の過去の動きのパターンを知ることができるということだけです。ではなぜパターンが大事なのでしょうか?それはあなた自身のリスク許容能力をつかむためです。株式を売らずに持ち続けることは簡単なことではありません。株価が下落すれば、すぐに売りたくなってしまいます。でもそれでは効率的な投資にはなりません。そこであなたがどの程度の下落に「どきどき」しないで耐えられるのかをまずつかむ必要があります。そしてそのレベルを、パターンを収益率/リスクで測ろうとしているのです。そして、それがつかめたら、同じパターンをもつ株をまず探して、そのリストから分散投資するための銘柄を選べばいいのです。そのために統計分析が必要なのです。決して、理論的な背景を探して、それをよりどころに投資をするからではありません。「知的ゲーム」は危険な「遊び」です。
真理の追求
インターネットの普及によって一攫千金の可能性やマネーゲーム的な要素を持つ株式市場は、多くの人々のギャンブル性向を掻き立ててきた。暴落が発生したときなどには、市場の破壊力と予測不可能な性質は、恐れおののく投資家に市場に対しての畏敬と恐れを思い抱かせる。実際、暴落によって人々がパニックに陥った話や自殺する投資家の話が伝説的に語り継がれている。それでもなお株式市場の持つ様々なパターンは、有益な投資戦略を用いることで市場に打ち勝つことができるのではないかという思いを人々にいだかせる。しかしながら、株式市場は遊び好きな、あるいは愚かなギャンブラー達のカジノではない。
基本的な考え方は、複雑系や臨界現象といった周囲に存在する驚くべきシステムがどのように生起するかからはじめて、市場の暴落の予測といった結論を得ることだ。そしてその中心は、自己組織化システムだ。暴落は、自己組織化システムに「特異現象」が自然発生する事象そのものだ。
投資の基本はリスク管理だ!リスクの多い世界を扱い、それに対処するための重要なアイデアを得るには、市場の暴落を知ることはその出発点だ。
絶えず移り変わる世界は、不確実性と変化というキーワードを用いて表現することができる。私達の住む世界は動的で不安定であり、安定や均衡といったものは幻想である。このような世界において、均衡や恒常性を追究しても必ず失敗に終わる。大切なのは、深刻な金融危機のような「特異現象の組織化」と「崩壊」の役割を認識することだ。特異現象が社会に及ぼす明らかな影響だけでなく、安定状態から危機や大災害への瞬間的な遷移もまた、システムのダイナミクスの最も劇的な特徴の1つである。
私達の住む地球や社会は常に安定な状態、つまり「均衡」と呼ばれている状態にあるのではなく、不連続なダイナミクスによって成り立っている。ゆえに、崩壊の重要性やインパクトを複合的に認識することが必要なのだ。
時間の矢は、不確実な未来を容赦なく追い立てる。未来を予測することは人々の想像力を掻きたてる最大の挑戦でもある。歴史的に見ても、ひとびとは預言者たちの描く未来のビジョンに恐れ、奮い立たされてきた。
基本的な問題は:
-
金融市場の暴落とは何か?どのようにして発生するのか?なぜ発生するのか?いつ発生するのか?
-
株式市場、および株価がある瞬間から次の瞬間にどのように変化するのか?
-
大規模な金融市場の暴落は外れ値か?
-
投資家間における正のフィードバックが投機的なバブルを加速させ、暴落を引き起こす不安定状態を形成するか?
-
投機的なバブルと暴落の合理的なモデル:暴落のハザード率が市場価格を動かすと仮定したモデルか?それとも価格変化が暴落の危険性を高めるモデルか?
-
大暴落の前に現れる前兆のパターンに含まれる情報は、"一般的なフラクタルの概念や自己相似性の概念、複雑な次元を持つフラクタルの考え方、そして、このフラクタルに関連した離散的自己相似性、さらに、これらの驚くべき幾何学的・数学的な概念"によって、体系化できるのか?
-
暴落前に前兆が現れるか?
-
市場間に強い相関関係が働くことはあるか?
-
市場の暴落や他の大事件は予測できるのか?
-
期待される予測の正確さと見通せる範囲はわかるのか?
-
「アンチバブル(反バブル)」の顕著な実例は何か?
参考:why stock markets crash by Sornette
参考
Python3ではじめるシステムトレード【第2版】環境構築と売買戦略
「画像をクリックしていただくとpanrollingのホームページから書籍を購入していただけます。
「画像をクリックしていただくとpanrollingのホームページから書籍を購入していただけます。」