本日は、をご紹介します。
これまで、Pythonを用いた銘柄スクリーニングやPythonからLINEへ通知を送る方法をご紹介してきました。
今回は、それらを掛け合わせてより実用的なプログラムを実装していきたいと思います。
・Pythonで
記事の信頼性
銘柄スクリーニングの自動化とLINEへの通知を掛け合わせることで実装でき、私自身よく利用しています。個人投資家には便利なものだと思います。
是非最後までご覧ください。
◆Windows10へのインストール方法を解説(スクリーンショットあり)
◆仮想環境の構築~venvの設定方法~
◆ Pythonでできること(概要や始め方、学習方法までざっくり紹介)
具体的な流れ
具体的な流れは以下の5つです。
- スクリーニング条件の検討
この中で手動で行う必要があるのは、「1. スクリーニング条件の検討」と「5. 通知結果を基に株式売買」のみです。
また、「1. スクリーニング条件の検討」は最初の1度だけでOKです(もちろん目的に合わせて適宜調整をする必要はありますが)。
後は全てPythonで自動化していきます。
主に必要な機能は2つ
実装において必要な機能は主に以下の2つです。
①
②
作りたいサービスを要素ごとに分解することで実装イメージが湧いてきます。
「①Pythonで銘柄をスクリーニングする」は「pandas-datareader」と「TA-Lib」の2つのPythonライブラリを用いて実装することができます。
そして、「②PythonからLINEに通知する」は「LINE Notify」というサービスを利用することで実現できます。
ここから①②についてそれぞれご説明していきます。
Pythonで銘柄のスクリーニングを行うには、「pandas-datareader」と「TA-Lib」を使うことで実現できます。
それぞれの役割は以下の通りです。
- pandas-datareader:ファンダメンタル指標
- TA-Lib:テクニカル指標
・ファンダメンタル指標:優良銘柄の抽出
・テクニカル指標:売買タイミングの検討
Pythonでの具体的なスクリーニング方法は以下の記事に記載しておりますのでご参照ください。
PythonでLINEに通知するには、「LINE Notify」というサービスを利用する必要があります。あなたのLINEアカウントと紐づけるだけで簡単に利用できます。
以下の記事に、サンプルコードを交えて具体的な利用方法を解説しています。
大まかな流れは以下の通りです。
- 「LINE Notify」にログイン
- トークン名とトークルームを決定
- トークン発行
たった5分ほどで準備を終えることができます!
後は、PythonからLINEに通知する関数(line_notify関数)を実行すれOKです。
#LINEに通知する関数
def line_notify(message):
line_notify_token = '発行されたトークンを貼り付けてください'
line_notify_api = 'https://notify-api.line.me/api/notify'
payload = {'message': message} #引数として自由に入力することができます
headers = {'Authorization': 'Bearer ' + line_notify_token}
requests.post(line_notify_api, data=payload, headers=headers)
ここから、具体例を用いながら実際にPythonでスクリーニングを行い、その結果をLINEに通知するプログラムを実装していきたいと思います(実行結果は執筆時点のもの)。
このサンプルコードをあなた好みに自由に変更するだけであなただけのスクリーニングができるようになります!
対象銘柄
今回は、NYダウを構成する30銘柄をスクリーニングの対象とします。具体的な銘柄は以下の通りです。
項番 | 銘柄(ティッカー) | 業種 |
1 | アップル(AAPL) | PC、携帯端末等 |
2 | マイクロソフト(MSFT) | OS、クラウド、PC等 |
3 | JPモルガン・チェース(JPM) | 金融 |
4 | ユナイテッド・ヘルス(UNH) | 医療サービス |
5 | ビザ(V) | 決済 |
6 | ジョンソンエンドジョンソン(JNJ) | ヘルスケア製品 |
7 | ホーム・デポ(HD) | ホームセンター |
8 | ウォルマート(WMT) | ディスカウントストア |
9 | P&G(PG) | 家庭用消費財 |
10 | ディズニー(DIS) | エンターテインメント |
11 | ナイキ(NKE) | スポーツ用品 |
12 | セールスフォース(CRM) | 法人向け顧客管理ソフト |
13 | コカ・コーラ(KO) | 清涼飲料水 |
14 | シスコシステムズ(CSCO) | ネットワーク機器 |
15 | シェブロン(CVX) | 石油メジャー |
16 | ベライゾン(VZ) | 米通信 |
17 | インテル(INTC) | 半導体 |
18 | マクドナルド(MCD) | ファストフード |
19 | メルク(MRK) | 医薬品 |
20 | ハネウェル(HON) | 産業用機器、機械 |
21 | ゴールドマン・サックス(GS) | 金融 |
22 | アメリカン・エキスプレス(AXP) | 決済 |
23 | アムジェン(AMGN) | バイオ医薬品 |
24 | ボーイング(BA) | 航空機、防衛、宇宙 |
25 | IBM(IBM) | ITサービス |
26 | キャタピラー(CAT) | 建設機械 |
27 | 3M(MMM) | 素材化学、事務用品 |
28 | ウォルグリーンズ(WBA) | ドラッグストア |
29 | ダウ(DOW) | 素材化学 |
30 | トラベラーズ(TRV) | 保険 |
スクリーニング条件
スクリーニングを実施するにあたり、対象銘柄やスクリーニング条件を定めます。
・スクリーニング条件
・ファンダメンタル指標:PER≦30
・テクニカル指標:RSI≦50
今回は比較的条件を甘く設定し、確実にいくつかの銘柄が抽出されるようにしました。
また、抽出結果の表示順としては、キャッシュフローを増やしたい(高配当銘柄を購入したい)という投資目的から、配当利回りの高い銘柄を上位に表示するようにコーディングしていきます。
サンプルコード
各設定や条件に従い、ライブラリのインポートからすべてのコード例を記載します。
import requests
from datetime import datetime #日付指定
import matplotlib.pyplot as plt #グラフ描画
import pandas_datareader.data as data #株価取得
import talib as ta #テクニカル指標算出
from dateutil.relativedelta import relativedelta
#変更箇所1
#####################################################################################
#ダウ構成銘柄30
dow_list = ["AAPL", "MSFT", "JPM", "UNH", "V", "JNJ", "HD", "WMT", "PG", "DIS", "NKE",
"CRM", "KO", "CSCO", "CVX", "VZ", "INTC", "MCD", "MRK", "HON", "GS", "AXP", "AMGN",
"BA", "IBM", "CAT", "MMM", "WBA", "DOW", "TRV"]
#期間
end =datetime.now() #現在時刻のデータを取得
start = end - relativedelta(months=6) #6ヶ月前から
#####################################################################################
#LINEに通知する関数
def line_notify(message):
line_notify_token = 'ここにトークンをペーストしてください'
line_notify_api = 'https://notify-api.line.me/api/notify'
payload = {'message': message}
headers = {'Authorization': 'Bearer ' + line_notify_token}
requests.post(line_notify_api, data=payload, headers=headers)
#銘柄スクリーニング
def screening(ticker,start,end,span=25):
list = data.get_quote_yahoo(ticker)
#変更箇所2
#####################################################################################
selected_stock = list[(list['trailingPE'] <= 30)]
#####################################################################################
selected_stock_index = selected_stock.index
df = data.DataReader(selected_stock_index, 'yahoo', start, end) #株価を取得
close = df["Adj Close"] #調整後の終値を"close"として保持
#変更箇所3
#####################################################################################
#RSI
rsi = []
for i in selected_stock_index:
rsi.append(ta.RSI(close[i],timeperiod=span)[-1])
selected_stock["rsi"] = rsi
selected_stock = selected_stock[(selected_stock['rsi'] <= 50)]
#####################################################################################
#変更箇所4
#####################################################################################
selected_stock = selected_stock[[ 'rsi', 'trailingAnnualDividendYield']].sort_values(by
=['trailingAnnualDividendYield', 'rsi'], ascending=[False, True])
#####################################################################################
return selected_stock
if __name__ == '__main__':
try:
selected_stock = screening(dow_list,start,end)
except Exception as e:
line_notify(e)
else:
text = "\nプログラムの実行を完了しました\n"
text += str(selected_stock)
print(text)
line_notify(text)
#実行結果
プログラムの実行を完了しました
rsi trailingAnnualDividendYield
JPM 46.385682 0.022974
GS 47.600297 0.013078
AXP 47.784173 0.010587
「変更箇所」と記載のある部分は、対象銘柄やスクリーニング条件を表しており変更することで自由にカスタマイズすることが可能です。
実行結果
上記のサンプルコードを実行した結果を示します。
JPM、GS、AXPがスクリーニング結果として抽出されました。
RSI(買われすぎ売られすぎを表すテクニカル指標)が昇順、配当利回りが降順で表示されていることが分かります。
今回はあくまで例ですが、購入を検討してみてはいかがでしょうか。
JPM
GS
AXP
今回は、
Pythonを用いて、主に①、②の機能を実装することで実現することができ、ほぼコピー&ペーストでたった20分程度で通知まで実行することができます!
①
②サンプルコードを変更すればあなただけのスクリーニング結果を自分のスマホへ通知させることができるようになります。
面倒なことはPythonにやってもらいましょう。
そして、一緒にPythonで豊かな生活を目指しましょう。
本ブログでは、株式やプログラミングに関する記事を投稿しています。
プログラミング(Python)を学びたい方におすすめの書籍やプログラミングスクール、おすすめの学習方法などをご紹介しておりますのでぜひご覧ください。
は、プログラミングスクールという方法がおすすめです。
私の一押しは『TechAcademy』です。
質問することですぐに分からないところをクリアにできますし、進捗をサポートしてくれるため確実に成長することができます。
無料相談を実施しているため、まずは話を聞いてあなたのスタイルに合っているかどうか確認してみるのが良いと思います。
コメント