orz

趣味のブログです

株価銘柄の売り時・買い時を判別するプログラム


前書き

以前書いた↓の記事の続きです。
ossanengineer.hatenablog.com
銘柄リストのデータを読み込む =>ボリンジャーバンドのロジックに従って、株の買い時・売り時を判別する
プログラムを書いてみました。
以下、ソースコードです。

ソースコード

from bs4 import BeautifulSoup
import pandas as pd
import requests
from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt
from statistics import mean

#単純に現在の株価がボリンジャーバンドのどのラインにいるのかを判別
def hanbetsu(stock_number,owarine,sma25,std):
    print ("-----")
    print ("銘柄",stock_number,"の買い時を判別します\n結果:\n")
    if owarine[-1:] > (sma25[-1:]+2*std[-1:]):
        print ("昨日の終値は",owarine[-1],"円でした\n移動平均線+2σの値は", int(sma25[-1:]+2*std[-1:]),"円でした")
        print ("この株は上昇トレンドです。買い時です\n逆張りするなら売り時です\n")
    elif owarine[-1:] < (sma25[-1:]-2*std[-1:]):
        print ("昨日の終値は",owarine[-1],"円でした\n移動平均線+2σの値は", int(sma25[-1:]-2*std[-1:]),"円でした")
        print ("この株は下降トレンドです。売り時です\n逆張りするなら買い時です\n")
    else:
        print ("この株は買い時でも、売り時でもありません")
    print ("-----")

def kabu(stock_number):
    url = 'https://kabuoji3.com/stock/{}/'.format(stock_number)
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"}
    soup = BeautifulSoup(requests.get(url,headers = headers).content,'html.parser')

    tag_tr = soup.find_all('tr')
    head = [h.text for h in tag_tr[0].find_all('th')]
    #テーブルのヘッドの取得
    #テーブルの各データの取得
    data = []
    for i in range(1,len(tag_tr)):
        data.append([d.text for d in tag_tr[i].find_all('td')])
        df = pd.DataFrame(data, columns = head)
                #終値と日付を抜き出す
    owarine = []
    day = []
    #dfの要素をリストに転換させる, try~exceptで余計な文字列はフィルタリングできている
    for x in range(len(df['終値'])):
        try:
            owarine.append(int(df.終値[x]))
            day.append(str(df.日付[x]))
        except:
            continue
    #データの日付が古い順から新しい方向に逆転させる
    owarine.reverse()
    day.reverse()

    sma5 = []
    day_sma5 = day[4:]
    for x in range(len(owarine)):
        if (x-4) >= 0:
            sma5 = np.append(sma5,mean(owarine[(x-4):x]))
        else:
            continue
    #25日移動平均線と標準偏差の算出
    sma25 = []
    day_sma25 = day[24:]
    std=[]

    for x in range(len(owarine)):
        if (x-24) >= 0:
            sma25 = np.append(sma25,mean(owarine[(x-24):x]))
            std = np.append(std,np.std(owarine[(x-24):x]))
        else:
            continue
    hanbetsu(stock_number,owarine,sma25,std)

#銘柄リストを作って読み込む
#1321 = NEXT FUNDS 日経225連動型上場投信
#1570 = NEXT日経平均レバレッジ
#8591 = オリックス
meigara = [1321,1570, 8591]
for x in meigara:
    kabu(x)

実行結果

例えば、1321(NEXT FUNDS 日経225連動型上場投信)のデータを読み込ませると、
f:id:orshibuya0926:20210111081046p:plain
こんな感じで出力されます。
例えば、自分が気になる銘柄がある場合、
meigara = [1321,1570, 8591]
このように変えると、
f:id:orshibuya0926:20210111081248p:plain
出力してくれます。

自分が気になっている銘柄が買い時なのかいちいちチャートを巡回するのはめんどくさいですよね。
こんな風に楽できるのもプログラムの力かなぁとは思います。

次の課題

  • CSVファイルから銘柄コードを抽出して、銘柄名を取得する。↑のプログラムに銘柄名を追加させたい。
  • 一目均衡表で判別するプログラムを書いてみる