「S&P500、ダウ30、Nasdaq100」のベン図を描いてみた
明けましておめでとうござベン図つくったよ。
と、挨拶が言い終わらないうちから、唐突にPythonの記事を紹介してみる。
pythonで「S&P500、ダウ30、Nasdaq100」のベン図を描いてみた。下の図のこう言うやつ。
上記のコーディングと図中の番号を合わせて見ると、わかるんだけど、値を入力する順番がトリッキーになっている。右回りでもないし、上から順番でもないし、規則性がよく分からない。
「すべての証拠が示す結論はひとつ。これまでも、これからも物理学は存在しない。」(引用:三体)
というのは、大袈裟なので、まぁ、この入力順を意識しながら、ベン図を作成することにする。
S&P500、ダウ30、Nasdaq100でベン図を作りたいんだけど、できるだけシンプルにしたい。そこで、会社の枠に縛られないWikipediaからティッカーシンボル(銘柄)情報を取得することにした。
1.プログラム
下記をコピペして実行。
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib_venn import venn3
%matplotlib inline
# S&P500 from wikipeida
data=pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')
sp500 = data[0][["Symbol"]] # 1つ目のテーブルを取得
sp500=sp500.assign(SP500="1")# 識別フラグ1
# Dow30 from wikipeida
data=pd.read_html('https://en.wikipedia.org/wiki/Dow_Jones_Industrial_Average')
dow30 = data[1][["Symbol"]]# 2つ目のテーブルを取得
dow30=dow30.assign(DOW30="1")# 識別フラグ2
# Nasdaq100 from wikipeida
data=pd.read_html('https://en.wikipedia.org/wiki/Nasdaq-100')
nas100 = data[3][["Ticker"]]# 3つ目のテーブルを取得
nas100=nas100.assign(NAS="1")# 識別フラグ3
nas100.rename(columns={'Ticker':'Symbol'},inplace=True)
# マージ(外部結合を2回実施)
df = pd.merge(sp500, dow30, how = "outer", on = "Symbol")
df = pd.merge(df, nas100, how = "outer", on = "Symbol")
# 識別フラグで条件に一致するものを抜き出してカウント
val1= len(df[(df.iloc[:,1] == "1") & (df.iloc[:,2] != "1") & (df.iloc[:,3] != "1")])
val2= len(df[(df.iloc[:,1] != "1") & (df.iloc[:,2] == "1") & (df.iloc[:,3] != "1")])
val4= len(df[(df.iloc[:,1] != "1") & (df.iloc[:,2] != "1") & (df.iloc[:,3] == "1")])
val3= len(df[(df.iloc[:,1] == "1") & (df.iloc[:,2] == "1") & (df.iloc[:,3] != "1")])
val5= len(df[(df.iloc[:,1] == "1") & (df.iloc[:,2] != "1") & (df.iloc[:,3] == "1")])
val6= len(df[(df.iloc[:,1] != "1") & (df.iloc[:,2] == "1") & (df.iloc[:,3] == "1")])
val7=len(df[(df.iloc[:,1] == "1") & (df.iloc[:,2] == "1") & (df.iloc[:,3] == "1")])
# ベン図を線画
venn3(subsets = (val1,val2,val3,val4, val5, val6, val7), set_labels = ('S&P 500', 'DOW 30', 'NASDAQ 100'))
plt.show()
# おまけ 3つに含まれる銘柄リスト
display(df["Symbol"][(df.iloc[:,1] == "1") & (df.iloc[:,2] == "1") & (df.iloc[:,3] == "1")].tolist())
# おまけ Nasdaq100にだけ含まれる銘柄リスト
display(df["Symbol"][(df.iloc[:,1] != "1") & (df.iloc[:,2] != "1") & (df.iloc[:,3] == "1")].tolist())
注意1:Wikipediaの情報が古い可能性もあります。注意してください。
注意2:S&P500社はティッカーで見ると対象が505社になっています。これは、A株、B株(C株)の様に議決権あり・なしのティッカーが含まれており、5社のティッカーが重複して含まれるためである。(DISCA・DISCK、FOX・FOXA、GOOG・GOOGL、NWS・NWSA、UA・UAA)
これはGoogle(Alphabet)のABC株が有名ですかね。
AlphabetはクラスA(GOOGL、議決権あり)、クラスB(非上場、議決権がAの10倍)、クラスC(GOOG、議決権なし)の3種類の株式を発行。クラスBは創業者のラリー・ペイジ、セルゲイ・ブリンとGoogle元CEOのエリック・シュミットの3人が保有。
2.実行結果
実行結果は下記の通り。
ここで気になったのは、2点。
1点目、ダウ30社はS&P500に包含されているけど、Nasdaq100に包含されるのは7社だけ。
2点目、Nasdaq100のうち24社はS&P500に含まれていない。
と言う事で、プログラムを実行すると、おまけとして、「3つに含まれる銘柄リスト」と「Nasdaq100にだけ含まれる銘柄リスト」が表示されるようにしました。
実行結果は下記の通り。
3つに含まれる銘柄
'AMGN', 'AAPL', 'CSCO', 'HON', 'INTC', 'MSFT', 'WBA'
Nasdaq100にだけ含まれる銘柄
'ABNB','ASML','TEAM','BIDU','CRWD','DDOG','DOCU','JD','KDP','LCID','LULU','MRVL','MELI','NTES','OKTA','PANW','PTON','PDD','SGEN','SIRI','SPLK','WDAY','ZM','ZS'
これを見ていて、個人的に思った感想は、Nasdaq100って、結構、冒険しているんだなぁと思った。見ていると、きらりと光る銘柄もあるけど、個人的には絶対投資しないだろうと思われる銘柄もいくつかある。でも、リターンだけで考えると投資しなかった判断が正しかったかと言うと、そうでもなかったりする。結局、こういう、ある程度のリスクをとっているからリターンも高いのかなぁ〜と思ったりもしました。
このベン図や、ティッカー取得処理が、何かの参考になれば幸いです。
このプログラムを書いていて、少しアイデアが浮かんだので、また、近いうちに関連記事を書きたいと思います。
「缶コーヒー1杯、ご馳走してあげよう」という太っ腹な人は投げ銭を!
課金しなくても、参考になったら「ハートボタン、フォロー、リツイート」をお願いします。読まれる可能性があがるので、次の記事を書くやる気が出ます。
おまけ
というように、大晦日から正月の年越しは、Pythonでベン図を描いてました。なんて有意義な年越しでしょう!w
S&P500とNasdaq100と自分のポートフォリを比較するプログラムを書きました。
下記のように、インデックスに対して、自分のポートフォリオがどのような立ち位置になっているか確認できます。
また、下記の3つの情報をリストで出力します。
1、自分のポートにだけ含まれる銘柄リスト
2、すべてに含まれる銘柄リスト
3、Nasdaq100と自分のポートにだけ含まれる銘柄リスト
ここから先は
¥ 100
この記事が気に入ったらチップで応援してみませんか?