見出し画像

SP500すべての銘柄のゴールデンクロス・デットクロスの傾向可視化 python初心者(Ep29)

こんにちわ。スミラです。
前回は、株価の移動平均の意味と抽出方法を調べることができましたね。
いつもスキ❤️を押していただいている皆さん、本当にありがとうございます!励みになります☆

それでは、本日のテーマは、

特徴点をさらに抽出

について実施したいと思います。宜しくお願い致します。

~~~~~~~~~~~【注意文章】~~~~~~~~~~~

株に手を出すことに伴って、損得の感情が発生してしまいますが、あくまでこれは コードの学習 において記載している内容です。一切の不利益が発生したとしても何も保証できません。また、個人の見解であり、投資を行う場合は、ご自身の判断で行うようお願い致します。
ご理解の上、読んで頂けますと幸いです。 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ゴールデンクロス・デットクロスの抽出

可視化した事によって、ゴールデンクロス・デットクロスが発生している箇所が数点ある様に見えました。そのポイントがどこになるのか。確認してみようと思います。

# 初期設定
import matplotlib.pyplot as plt
import yfinance as yf
import numpy as np
import datetime as dt
import pandas as pd
#取得した銘柄をリスト化
symbol_list_kai =['^TNX','^GSPC','AAPL']
#取得の開始したい日付を設定  YYYY-MM-DD
get_start = '2015-01-01'
#取得の終了日付を設定 YYYY-MM-DD
#本日までのデータの場合
get_end  = dt.datetime.today().strftime('%Y-%m-%d')
#取得のタイミング 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
get_interval = "1d"
#リスト(配列)から文字列に変換
symbol_list_str = ",".join(symbol_list_kai)
#データの取得
df = yf.download(symbol_list_str, start=get_start, end=get_end, interval = get_interval)
display(df)
#抽出データの選択
select_data = df['Adj Close']
#変化率をデータフレームに追加
SMA_param1 = 50
SMA_param2 = 200
#50日移動平均(SMA50)
for i in range(len(symbol_list_kai)):
    df['SMA50',symbol_list_kai[i]] = select_data[symbol_list_kai[i]].rolling(window=SMA_param1).mean()

#200日移動平均(SMA200)
for i in range(len(symbol_list_kai)):
    df['SMA200',symbol_list_kai[i]] = select_data[symbol_list_kai[i]].rolling(window=SMA_param2).mean()

#差分度合いの確認
for i in range(len(symbol_list_kai)):
    df['SMA50-SMA200',symbol_list_kai[i]] = df['SMA50',symbol_list_kai[i]]-df['SMA200',symbol_list_kai[i]]

#差分の判定確認
for i in range(len(symbol_list_kai)):
    df['SMA50-SMA200_flag',symbol_list_kai[i]] = df['SMA50-SMA200',symbol_list_kai[i]]>0

#基準となるオープン価格を表示
fig = plt.figure(figsize=(20, 15))
#シンボルの数を確認
symbol_list_count=len(symbol_list_kai)

#シンボルの数分だけプロットを実施
for i in range(symbol_list_count):
#差分取得の準備
    diff_pre = pd.Series([0]+list(df['SMA50-SMA200_flag',symbol_list_kai[i]].astype(int))+[0])
#差分を計算し、Noneは取り除く
    diff_pre2 = diff_pre.diff().dropna()
    name='ax'+str(i+1)
    name= fig.add_subplot(2,2,i+1)
    name.plot(df['Adj Close',symbol_list_kai[i]],color='blue')
    name.plot(df['SMA50',symbol_list_kai[i]],color='red')
    name.plot(df['SMA200',symbol_list_kai[i]],color='green')
#start : ilocで行番号を取得、終了する行を-1にすることで後ろの差分で追加分を考慮し、立ち上がり(0から1になった部分)を検出
#end   : ilocで行番号を取得、開始する行を1にすることで前の差分で追加分を考慮し、立下り(1から0になった部分)を検出
    for start , end in zip(df['SMA50-SMA200_flag',symbol_list_kai[i]].index[diff_pre2.iloc[:-1]==1], 
                            df['SMA50-SMA200_flag',symbol_list_kai[i]].index[diff_pre2.iloc[1:]==-1]):
        name.axvspan(start,end,color="red",alpha=0.3)
    
plt.show()
変化度合いの抽出

ゴールドクロスが始まっている所 
デットクロスが始まっている所

この二つの期間がいつ発生していたか、見る事ができましたね!

ここまで私のプログラムを読んでいる方は、気づく方がいるかもしれませんが、このコードは少し触るだけで、たくさんの銘柄を対象として対応をすることができます!!実際にやってみましょう。

応用:S&P500銘柄すべての状態確認

まずは、どの銘柄が存在するのか。をwikipediaから抽出をしてみましょう。
なお、ウィキペディアAPIライブラリ「wikipedia」を活用します。

pip install wikipedia

インストールを実施しましょう。キーワードを用いて検索をしてみましょう。

import wikipedia

# キーワードを設定
keyword = "S&P500"

# キーワードで検索
wikipedia.set_lang("en")
search_response = wikipedia.search(keyword)
display(search_response)
抽出したリスト

この結果の、2番目にあるのが私が欲しい情報がありそうです。URLを取得します。

#抽出したい名前のURLを取得
sURL=wikipedia.page(search_response[1]).url
display(sURL)

上記のサイトが出力された為、これは活用できそうですね。それではwikipediaのサイト自体のスクレイピングは禁止されているため、このライブラリを用いて抽出サイトのHTMLをダウンロードしたいと思います。

#検出したURLをhtml形式で入手
pageinfo=wikipedia.page(search_response[1]).html()
with  open('search_URL.html', 'w', encoding='UTF-8') as f:
    f.write(pageinfo)

この結果、search_URL.html のファイルが保存されていると思います。
これを実際にデータフレームで読込を行い、リストを抽出しましょう。

#ページ情報のデータフレームを構築
URL_data = pd.read_html('./search_URL.html', header = 0)
#シンボルに関係する情報の抽出
URL_data[0]
抽出結果(504のシンボルを検出)

これで、S&P500のリストを入手することが出来ました。それでは実際に505社企業を抽出しちゃいましょう!

# 初期設定
import matplotlib.pyplot as plt
import yfinance as yf
import numpy as np
import datetime as dt
import pandas as pd
import wikipedia
#ページ情報のデータフレームを構築
URL_data = pd.read_html('./search_URL.html', header = 0)
#50個の銘柄を抽出
pick_companies = 505
pick_lists=URL_data[0]['Symbol'][0:pick_companies]
#取得した銘柄をリスト化
symbol_list_kai =pick_lists
#取得の開始したい日付を設定  YYYY-MM-DD
get_start = '2015-01-01'
#取得の終了日付を設定 YYYY-MM-DD
#本日までのデータの場合
get_end  = dt.datetime.today().strftime('%Y-%m-%d')
#取得のタイミング 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
get_interval = "1d"
#リスト(配列)から文字列に変換
symbol_list_str = ",".join(symbol_list_kai)
#データの取得
df = yf.download(symbol_list_str, start=get_start, end=get_end, interval = get_interval)
#抽出データの選択
select_data = df['Adj Close']
#変化率をデータフレームに追加
SMA_param1 = 50
SMA_param2 = 200
#50日移動平均(SMA50)
for i in range(len(symbol_list_kai)):
    df['SMA50',symbol_list_kai[i]] = select_data[symbol_list_kai[i]].rolling(window=SMA_param1).mean()

#200日移動平均(SMA200)
for i in range(len(symbol_list_kai)):
    df['SMA200',symbol_list_kai[i]] = select_data[symbol_list_kai[i]].rolling(window=SMA_param2).mean()
display(df)

#差分度合いの確認
for i in range(len(symbol_list_kai)):
    df['SMA50-SMA200',symbol_list_kai[i]] = df['SMA50',symbol_list_kai[i]]-df['SMA200',symbol_list_kai[i]]

#差分の判定確認
for i in range(len(symbol_list_kai)):
    df['SMA50-SMA200_flag',symbol_list_kai[i]] = df['SMA50-SMA200',symbol_list_kai[i]]>0

#基準となるオープン価格を表示
fig = plt.figure(figsize=(50,100))
#シンボルの数を確認
symbol_list_count=len(symbol_list_kai)
#シンボルの数分だけプロットを実施
for i in range(symbol_list_count):
#差分取得の準備
    diff_pre = pd.Series([0]+list(df['SMA50-SMA200_flag',symbol_list_kai[i]].astype(int))+[0])
#差分を計算し、Noneは取り除く
    diff_pre2 = diff_pre.diff().dropna()
    name= fig.add_subplot(51,10,i+1)
    name.plot(df['Adj Close',symbol_list_kai[i]],color='blue')
    name.plot(df['SMA50',symbol_list_kai[i]],color='red')
    name.plot(df['SMA200',symbol_list_kai[i]],color='green')
    name.set_title(symbol_list_kai[i])
#start : ilocで行番号を取得、終了する行を-1にすることで後ろの差分で追加分を考慮し、立ち上がり(0から1になった部分)を検出
#end   : ilocで行番号を取得、開始する行を1にすることで前の差分で追加分を考慮し、立下り(1から0になった部分)を検出
    for start , end in zip(df['SMA50-SMA200_flag',symbol_list_kai[i]].index[diff_pre2.iloc[:-1]==1], 
                            df['SMA50-SMA200_flag',symbol_list_kai[i]].index[diff_pre2.iloc[1:]==-1]):
        name.axvspan(start,end,color="red",alpha=0.3)    

#重なりを無くす方法
plt.tight_layout() 
plt.show()
SP500すべての銘柄に対する傾向結果

できました~!!!うれしいですね☆

次回は

他にも傾向を抽出方法株の値動きに対する情報を組み合わせた分析

をさらに実施してみたいと思いますね。

本日はここまで。それではまた次回に!

記事を気に入って頂けましたら、コーヒー代のサポートを頂けると励みになります!

想い

ここから先は

0字

¥ 100

期間限定 PayPay支払いすると抽選でお得に!

よろしければサポート頂けると幸いです!子供へのパパ時間提供の御礼(お菓子)に活用させて頂きます☆