!pip install yahoo_fin
Collecting yahoo_fin
Downloading yahoo_fin-0.8.9.1-py3-none-any.whl (10 kB)
Collecting requests-html
Downloading requests_html-0.10.0-py3-none-any.whl (13 kB)
Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from yahoo_fin) (1.3.5)
Collecting feedparser
Downloading feedparser-6.0.8-py3-none-any.whl (81 kB)
|████████████████████████████████| 81 kB 4.7 MB/s
Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from yahoo_fin) (2.23.0)
Collecting sgmllib3k
Downloading sgmllib3k-1.0.0.tar.gz (5.8 kB)
Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas->yahoo_fin) (2018.9)
Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.7/dist-packages (from pandas->yahoo_fin) (1.21.5)
Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas->yahoo_fin) (2.8.2)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas->yahoo_fin) (1.15.0)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->yahoo_fin) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->yahoo_fin) (2021.10.8)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->yahoo_fin) (2.10)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->yahoo_fin) (1.24.3)
Collecting pyppeteer>=0.0.14
Downloading pyppeteer-1.0.2-py3-none-any.whl (83 kB)
|████████████████████████████████| 83 kB 1.5 MB/s
Collecting w3lib
Downloading w3lib-1.22.0-py2.py3-none-any.whl (20 kB)
Collecting pyquery
Downloading pyquery-1.4.3-py3-none-any.whl (22 kB)
Requirement already satisfied: bs4 in /usr/local/lib/python3.7/dist-packages (from requests-html->yahoo_fin) (0.0.1)
Collecting fake-useragent
Downloading fake-useragent-0.1.11.tar.gz (13 kB)
Collecting parse
Downloading parse-1.19.0.tar.gz (30 kB)
Collecting pyee<9.0.0,>=8.1.0
Downloading pyee-8.2.2-py2.py3-none-any.whl (12 kB)
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1
Downloading urllib3-1.25.11-py2.py3-none-any.whl (127 kB)
|████████████████████████████████| 127 kB 52.0 MB/s
Collecting websockets<11.0,>=10.0
Downloading websockets-10.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (111 kB)
|████████████████████████████████| 111 kB 59.6 MB/s
Requirement already satisfied: importlib-metadata>=1.4 in /usr/local/lib/python3.7/dist-packages (from pyppeteer>=0.0.14->requests-html->yahoo_fin) (4.11.2)
Requirement already satisfied: appdirs<2.0.0,>=1.4.3 in /usr/local/lib/python3.7/dist-packages (from pyppeteer>=0.0.14->requests-html->yahoo_fin) (1.4.4)
Requirement already satisfied: tqdm<5.0.0,>=4.42.1 in /usr/local/lib/python3.7/dist-packages (from pyppeteer>=0.0.14->requests-html->yahoo_fin) (4.63.0)
Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata>=1.4->pyppeteer>=0.0.14->requests-html->yahoo_fin) (3.7.0)
Requirement already satisfied: typing-extensions>=3.6.4 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata>=1.4->pyppeteer>=0.0.14->requests-html->yahoo_fin) (3.10.0.2)
Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.7/dist-packages (from bs4->requests-html->yahoo_fin) (4.6.3)
Collecting cssselect>0.7.9
Downloading cssselect-1.1.0-py2.py3-none-any.whl (16 kB)
Requirement already satisfied: lxml>=2.1 in /usr/local/lib/python3.7/dist-packages (from pyquery->requests-html->yahoo_fin) (4.2.6)
Building wheels for collected packages: fake-useragent, parse, sgmllib3k
Building wheel for fake-useragent (setup.py) ... done
Created wheel for fake-useragent: filename=fake_useragent-0.1.11-py3-none-any.whl size=13502 sha256=b92129170924058b78970758bf440244a9030a571d6a3788cef1e3be913ec178
Stored in directory: /root/.cache/pip/wheels/ed/f7/62/50ab6c9a0b5567267ab76a9daa9d06315704209b2c5d032031
Building wheel for parse (setup.py) ... done
Created wheel for parse: filename=parse-1.19.0-py3-none-any.whl size=24591 sha256=025550890c6cbb430b4eacbe567af99605604b4100c4740ea0a3558616aa711b
Stored in directory: /root/.cache/pip/wheels/9c/aa/cc/f2228050ccb40f22144b073f15a2c84f11204f29fc0dce028e
Building wheel for sgmllib3k (setup.py) ... done
Created wheel for sgmllib3k: filename=sgmllib3k-1.0.0-py3-none-any.whl size=6066 sha256=6b074014c20211accbee17f77b5645641b827dc5263eb0da29eccc00101e3652
Stored in directory: /root/.cache/pip/wheels/73/ad/a4/0dff4a6ef231fc0dfa12ffbac2a36cebfdddfe059f50e019aa
Successfully built fake-useragent parse sgmllib3k
Installing collected packages: websockets, urllib3, pyee, cssselect, w3lib, sgmllib3k, pyquery, pyppeteer, parse, fake-useragent, requests-html, feedparser, yahoo-fin
Attempting uninstall: urllib3
Found existing installation: urllib3 1.24.3
Uninstalling urllib3-1.24.3:
Successfully uninstalled urllib3-1.24.3
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
datascience 0.10.6 requires folium==0.2.1, but you have folium 0.8.3 which is incompatible.
Successfully installed cssselect-1.1.0 fake-useragent-0.1.11 feedparser-6.0.8 parse-1.19.0 pyee-8.2.2 pyppeteer-1.0.2 pyquery-1.4.3 requests-html-0.10.0 sgmllib3k-1.0.0 urllib3-1.25.11 w3lib-1.22.0 websockets-10.2 yahoo-fin-0.8.9.1
Tickerコードは ^GSPC
import yahoo_fin.stock_info as si
import pandas as pd
import matplotlib.pyplot as plt
from datetime import date
from dateutil.relativedelta import relativedelta
import plotly.express as px
import plotly.figure_factory as ff
import plotly.graph_objects as go
import numpy as np
import seaborn as sns
plt.style.use('fivethirtyeight')
plt.rcParams['figure.figsize'] = [24, 8]
data_days = 360
def getData(ticker, days=360):
data = si.get_data(ticker)
data = data.tail(days)
data = data.drop(columns=['open', 'high', 'low', 'adjclose', 'volume'])
return data
base_hist_data = getData('^GSPC')
base_hist_data
close | ticker | |
---|---|---|
2020-09-30 | 3363.000000 | ^GSPC |
2020-10-01 | 3380.800049 | ^GSPC |
2020-10-02 | 3348.419922 | ^GSPC |
2020-10-05 | 3408.600098 | ^GSPC |
2020-10-06 | 3360.969971 | ^GSPC |
... | ... | ... |
2022-02-28 | 4373.939941 | ^GSPC |
2022-03-01 | 4306.259766 | ^GSPC |
2022-03-02 | 4386.540039 | ^GSPC |
2022-03-03 | 4363.490234 | ^GSPC |
2022-03-04 | 4328.870117 | ^GSPC |
360 rows × 2 columns
base_hist_data.plot(kind='line', y='close', color='blue')
<matplotlib.axes._subplots.AxesSubplot at 0x7fb236edc590>
横軸は、共有している、日付とする。 縦軸は、右にS&P500 (赤), 左側をQQQ (青)を表示する。
データをマージすると自動的にカラム名が変わるので注意すること。 最初のデータのカラムには '_x'が、2番目のデータのカラムには '_y' がつく。 (例) Column_x, Column_y
# QQQ のデータを取得
hist_data = getData("QQQ")
hist_data
close | ticker | |
---|---|---|
2020-09-30 | 277.839996 | QQQ |
2020-10-01 | 282.250000 | QQQ |
2020-10-02 | 274.309998 | QQQ |
2020-10-05 | 280.160004 | QQQ |
2020-10-06 | 275.160004 | QQQ |
... | ... | ... |
2022-02-28 | 346.799988 | QQQ |
2022-03-01 | 341.489990 | QQQ |
2022-03-02 | 347.220001 | QQQ |
2022-03-03 | 342.260010 | QQQ |
2022-03-04 | 337.299988 | QQQ |
360 rows × 2 columns
# 同じDataFrameに追加する
result = pd.merge(hist_data, base_hist_data, left_index=True, right_index=True)
result
close_x | ticker_x | close_y | ticker_y | |
---|---|---|---|---|
2020-09-30 | 277.839996 | QQQ | 3363.000000 | ^GSPC |
2020-10-01 | 282.250000 | QQQ | 3380.800049 | ^GSPC |
2020-10-02 | 274.309998 | QQQ | 3348.419922 | ^GSPC |
2020-10-05 | 280.160004 | QQQ | 3408.600098 | ^GSPC |
2020-10-06 | 275.160004 | QQQ | 3360.969971 | ^GSPC |
... | ... | ... | ... | ... |
2022-02-28 | 346.799988 | QQQ | 4373.939941 | ^GSPC |
2022-03-01 | 341.489990 | QQQ | 4306.259766 | ^GSPC |
2022-03-02 | 347.220001 | QQQ | 4386.540039 | ^GSPC |
2022-03-03 | 342.260010 | QQQ | 4363.490234 | ^GSPC |
2022-03-04 | 337.299988 | QQQ | 4328.870117 | ^GSPC |
360 rows × 4 columns
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
def plotGraph(ticker1, ticker2, days=360):
data1 = getData(ticker1, days)
data2 = getData(ticker2, days)
fig, ax1 = plt.subplots(1,1,figsize=(24,8))
ax1.set_xlabel('date')
ax1.set_ylabel(data1['ticker'][0], color='tab:red')
ax1.plot(data1.index, data1['close'], color='tab:red')
ax1.tick_params(axis='y', labelcolor='tab:red')
ax2 = ax1.twinx()
ax2.set_ylabel(data2['ticker'][0], color='tab:blue')
ax2.plot(data2.index, data2['close'], color='tab:blue')
ax2.tick_params(axis='y', labelcolor='tab:blue')
fig.tight_layout() # otherwise the right y-label is slightly clipped
plt.show()
plotGraph('QQQ', '^GSPC')
plotGraph('HG=F', '^GSPC')
PHLX半導体セクターインデックス (SOX) は、半導体企業30社で構成される 時価総額加重型のインデックスであり、半導体の設計、 流通、製造、販売を主な事業内容とする企業で構成されている。
半導体は工場需要でも、消費者需要でも先んじて必要とされる。(産業の米)
plotGraph('SOXX', '^GSPC')
Transporter Average Index (DJTA) は、特にダウ理論の支持者によって、 米国経済の状態を確認するために使われている。
物販は製造業、生産業の基本なので、物の移動が滞っている場合は、 経済の循環が遅くなっている可能性がある。
plotGraph('DJT', '^GSPC')
Russel2000 は、ニューヨーク証券取引所や Nasdaq などに上場している銘柄のうち、時価総額が上位 1001 位から 3000 位までの銘柄の浮動株調整後の時価総額 加重平均型の株価指数である。
小型株は大型株よりも景気に敏感な傾向がある。 大企業では、経済の状態が悪くても、すぐに経営に直結することはないが、 中小企業では大企業からの発注が減ると経営危機に直結することがあるので。 そのため、経済の悪化の指標となる。
plotGraph('^RUT', '^GSPC')
VIX 指数とは、Volatility Index で恐怖指数とも呼ばれる。 S&P500 の変動幅を指数化したもので、 CBOE (シカゴのオプション取引所)が算出する。 S&Pとは反相関関係が成立する。
plotGraph('^VIX', '^GSPC')
SKEW とは、CBOE (シカゴおpしょん取引所)が算出する「市場のゆがみ (= skew)」を数値化した指標である。 S&P500 指数を対象とするオプション取引で、コール(call, 買う権利)に対するプット(put, 売る権利) の需要の強さを表す。
オプション市場で将来の大きな価格変動に備える取引が増えると上昇し、 black swan (黒い白鳥、市場で想定外の事象)が出現する可能性を示唆する。
何らかの恐怖予測が市場に存在する場合に、大きく上昇する。
plotGraph('^SKEW', '^GSPC')
ゴールドは「有事のゴールド」といわれるように、戦争や災害が発生した場合に上昇する傾向がある。
ただし、2020年3月は S&Pもゴールドも同時に下落している。 多くの企業が、支払いの現金を作りだすためにゴールドを売ったためかもしれない。その後は回復しているが。
また、ゴールドは2020年8月に高値をつけたあと、下落している。同時期に銅は上がっているが。
現在は、金本位制ではないので、昔ほど「有事のゴールド」とはいかなくなったようだ。その機能の一部が Bitcoin などの暗号通貨に移りつつあるという話もある。
plotGraph('GLD', '^GSPC')
ドル指標は、コロナ後直下は価値が非常に上がっている。 これは、現金支払いなどのためにドルが必要とされたためだと思われる。
2021年になって再び上げてきているのは、ワクチンによるコロナ禍からの回復がアメリカでは早く進むとみられているからだと思われる。
plotGraph('DX-Y.NYB', '^GSPC')
格付けが S&P でBB, ムーディーズで Ba以下のものがジャンクボンド (低格付け債券)である。利回りが高いことから、ハイイールド債とも呼ばれる。
ジャンクボンドが大きく動くときは、リスクオン、すなわち、投資家がリスクをとろうとしていることを表している。
# High Yield index
plotGraph('HYG', '^GSPC')
株価に大きな影響を与えている。 FRBはコロナ後、大きく低金利に舵を取ったが、インフレ抑制のため 2022年は何度か短期金利 (FF金利, Federal Fund Rate) 利上げを行うことを予告している。
経済の回復を期待して、長期金利は徐々に上がってきている。
S&Pと米10年債は、時々相関関係、反相関関係と別々な動きをする。
2021年の最初は、 長期金利の上昇とともに、S&P500が停滞した。 S&P500 はハイテク企業が主導しているが、ハイテク企業は借金比率なども大きいので、長期金利がその貸付に影響しているとみられる。
plotGraph('^TNX', '^GSPC')
nasdaq_list = ["^GSPC","HG=F","SOXX","DJT","^RUT","^VIX","^SKEW","GLD","DX-Y.NYB","HYG","^TNX"]
index = 0
for symbol in nasdaq_list:
past_date = date.today() + relativedelta(months=-12)
past_date_yyyy_mm_dd = past_date.strftime('%Y-%m-%d')
past_date_month_after = date.today() + relativedelta(months=0)
past_date_yyyy_mm_dd_month_after = past_date_month_after.strftime('%Y-%m-%d')
hist_data = si.get_data(symbol, start_date=past_date_yyyy_mm_dd, end_date=past_date_yyyy_mm_dd_month_after)
temp_df = hist_data.drop(['open', 'high', 'low', 'adjclose', 'volume', 'ticker'], axis = 1)
temp_df['percentage'] = np.where(temp_df['close'] > temp_df['close'].shift(1), ((temp_df['close']-temp_df['close'].shift(1)) / temp_df['close'].shift(1))*100, ((temp_df['close']-temp_df['close'].shift(1)) / temp_df['close'].shift(1))*100)
temp_df = temp_df.rename({'percentage': symbol}, axis=1)
temp_df = temp_df.drop(['close'], axis = 1)
if index > 0:
result_df = pd.merge(result_df, temp_df, left_index=True, right_index=True)
else:
result_df = temp_df
index = index + 1
def interactive_plot(df, title):
fig = px.line(title = title)
# Loop through each stock (while ignoring time columns with index 0)
for i in df.columns[:]:
fig.add_scatter(x = df.index, y = df[i], name = i) # add a new Scatter trace
fig.show()
interactive_plot(result_df, 'Percentage movement comapred to previous day')
#CORRELATIONS
correlation = result_df.corr()
fig, ax = plt.subplots(1,1,figsize=(24,12))
sns.heatmap(correlation, annot = True, ax = ax);
それぞれのアセットがどれくらいのボラティリティがあって、どのように散らばっているのか、プラスになる傾向があるか、マイナスになる傾向があるかを見るためにヒストグラムを作る。
result_df.hist(figsize=(10, 10), bins = 40);