【Python】リターン推移からトレンドを!
記事は無料で読めます。
・少し大きめのトレンドを知りたい。
・金利の動きをみたい。
・簡単にグラフを複数に分けたい。
でも、めんどくさい。という、あなたに朗報です。
下記の様な3か月のトレンドが分かるグラフが取得できます。
0.事前準備
事前準備はこちら。5分もあればできると思います。
1.コードコピペ
入力するサンプルコードは下記の通り。
(2021/07/06 株価参照ライブラリを変更)
ライブラリのインストール
!pip install yfinance
下記をコピペして実行してください。
import datetime
import yfinance as yf
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
#開始・終了日の設定
start = datetime.date(2004,1,1)
end = datetime.date.today()
#対象ティッカーシンボルのデータを取得
codelist = ["VUG","VTV","VBK","VBR","^TNX"]
data = yf.download(codelist, start=start, end=end)["Adj Close"]
df_all=(data.pct_change(60))#期間の変化率
df_all.rename(columns={'VBR':'Small Value','VTV':'Large Value','VBK':'Small Growth','VUG':'Large Growth','^TNX':'10 Years Yield'},inplace=True)
#取得データを作業用にコピーして変化率を比較
df_all2 =df_all.copy()
df_all2['Small Growth - Small Value']=pd.DataFrame(df_all['Small Growth']-df_all['Small Value'])
df_all2['Large Growth - Large Value']=pd.DataFrame(df_all['Large Growth']-df_all['Large Value'])
df_all2['Large Growth - Small Growth']=pd.DataFrame(df_all['Large Growth']-df_all['Small Growth'])
df_all2['Large Value - Small Value']=pd.DataFrame(df_all['Large Value']-df_all['Small Value'])
#不要カラムをドロップしてグラフ化
df_all2.drop(["Small Growth","Small Value","Large Value","Large Growth"], axis=1, inplace=True)
df_all2.plot(figsize=(16,9),fontsize=20,linewidth=2,alpha=0.5,subplots=True,grid=True)
plt.xlabel(xlabel="")
plt.show()
すると、下記のグラフができます!
これを見ながら、下記の様に金利が上がった時にグロース株が軟調になる事や、その後に大型株から回復する傾向がある。というような分析ができるかもしれません。(詳しくは後述。)
2.コードの解説
まずは簡単にコードを解説したいと思います。
(1)期間を指定
下記で期間を指定しています。期間を変えたいときはココを変更してください。
#開始・終了日の設定
start = datetime.date(2004,1,1)
end = datetime.date.today()
(2)取得データの指定
下記で取得対象のデータを指定しています。
#対象ティッカーシンボルのデータを取得
codelist = ["VUG","VTV","VBK","VBR","^TNX"]
取得データの詳細は下記です。
'VBR':小型バリュー
'VTV':大型バリュー
'VBK':小型グロース
'VUG':大型グロース
'^TNX':10年国債の金利
調べていたら、金利も取得できるんですね!Pythonすごい。
(3)取得データの指定
上記で指定したティッカー、開始、終了のパラメータからデータをダウンロードしています。
そして、ここでのポイントは「60」という数字。3か月の変動率を見るため、「60」を指定(1か月の営業日を20日とし、3倍)しています。
長めのトレンド、短めのトレンドが見たいという場合は、この数字を変更してください。
data = yf.download(codelist, start=start, end=end)["Adj Close"]
df_all=(data.pct_change(60))#期間の変化率
(4)カラム名の変更
下記では項目を分かり易くカラム名を変更しています。
なくても良いコードですが、グラフ化した時に分かり易くなります。
df_all.rename(columns={'VBR':'Small Value','VTV':'Large Value',
'VBK':'Small Growth','VUG':'Large Growth','^TNX':'10 Years Yield'},inplace=True)
(5)変化率の比較
取得したデータを作業用にコピーした後、それぞれの変化率を比較して、データを格納しています。取得データを変更した際は、このカラム名を取得データに合わせる必要があります。
次に、グラフ化する前に、作業用データから不要カラムを削除しています。
#取得データを作業用にコピーして変化率を比較
df_all2 =df_all.copy()
df_all2['Small Growth - Small Value']
= pd.DataFrame(df_all['Small Growth']-df_all['Small Value'])
df_all2['Large Growth - Large Value']
= pd.DataFrame(df_all['Large Growth']-df_all['Large Value'])
df_all2['Large Growth - Small Growth']
= pd.DataFrame(df_all['Large Growth']-df_all['Small Growth'])
df_all2['Large Value - Small Value']
= pd.DataFrame(df_all['Large Value']-df_all['Small Value'])
#不要カラムをドロップしてグラフ化
df_all2.drop(["Small Growth","Small Value","Large Value","Large Growth"], axis=1, inplace=True)
(6)グラフ化
下記のコードでグラフ化をしているのですが、「subplots=True」を指定すると、グラフが複数に分かれて表示されます。
df_all2.plot(figsize=(16,9),fontsize=20,linewidth=2,alpha=0.5,subplots=True,grid=True)
plt.xlabel(xlabel="")
「subplots=True」を指定しない場合は、下記のようなグラフになります。
df_all2.plot(figsize=(16,9),fontsize=20,linewidth=2,alpha=0.5,grid=True)
plt.xlabel(xlabel="")
複数の表を表示する方法はいつくかありますが、簡単に、表を分割したいときには、このパラメータを知っておくと良いでしょう。(ただし、この方法で複数のグラフに分割した場合、表示について、個々の細かい指定ができないという弱点もあります。)
このパラメータは凄く便利で、たとえば、
subplots=True,layout=(2, 2)の様に(行、列)を指定すれば、
下記の様に複数のチャートを並べる事も出来ます。
df_all.plot(figsize=(16,9),fontsize=10,linewidth=5,alpha=0.5,
subplots=True,layout=(2, 2))
3.トレンドの解説
先ほど取得したデータについて、少し解説してみたいと思います。
個人の見解であり、確実な事は分かりませんし、分析が間違っている可能性もあります。その点はご了承ください。
あまり短めのスパンだと、トレンドが分かり難いため、期間は3か月と言うスパンに設定しました。決算のタイミングや期が変わるタイミングを考えれば、3か月ぐらいのスパンが妥当かと思って設定した数値です。
このスパンで見ると、金利が上がると、グロース株が軟調になっている事が伺えます。しかし、2013・2015年あたりでは、金利に対する反応が薄くなっています。
「キンリ、上がる、グロース、下がる」や
「オレ、オマエ、喰う」みたいな単純な動きにはなっていません。
これは、業績相場になって行けば、金利に対する反応が薄くなっていくという事を表しているように見えます。
そして、もう一点伺えるのは、金利が上昇して、グロース株が軟調になった後は、相対的に大型株が強くなっている事が多いように見えます。
そう考えると、GAFAM等の大型株が落ち着いた後に、小型グロース株の出番がやって来るように思えます。直近は大型株の回復・復活を見ながら、小型グロースを仕込むのも良いのかもしれません。
少し視点を変えて、足元の状況に目をやると、
足元は、新規失業保険申請件数は大きく減少していて、雇用回復はほぼ確定的で、金利上昇、テーパリングが意識される状況です。そして、このまま順調に経済が回復していくとすれば、コロナ需要で好調だった企業の業績に持続性があるのか?6末の決算がでないと見極めが困難な状態です。
一方で、一部のコモディティは需給のバランスの崩れから、急激に価格上昇しているし、半導体は不足している状態です。更には、インドではコロナが急拡大し順調な経済の回復に対して、先行きに不透明感が感じられます。
また、5月17日まで延期された確定申告、夏枯れなど、考えると、積極的に買い向かいにくい局面にある様に見えます。
しかし、グラフを見ると、過去にない程、小型グロースが弱くなっているように見えるので、次の決算まで軟調になる事も視野に入れながら、大型株や金利の推移を注視しつつ、少しづつコロナ後も業績が良さそうな黒字・サブスクリプションのスモールグロースを、仕込むのも良いようにも見えます。
くりかえしになりますが、個人の見解であり、確実な事は分かりません。分析が間違っている可能性もありますので、その点はご了承ねがいます。
トレンド分析をするためのPythonの記事でした。
何かの参考になれば幸いです。
おつかれさん、の意味を込めて、
「缶コーヒー一杯ぐらい、ご馳走してあげよう」という
太っ腹な方がいれば、よろしくお願いします!
(本編はココまで、課金しても雑談しかありません。)
課金しなくても、参考になったら、「ハートボタン」をクリックしたり、「リツイート」してくれると読まれる可能性があがるので嬉しいです。やる気が出ます。
(雑談)
ここから先は
¥ 100
この記事が気に入ったらサポートをしてみませんか?