【Python Program】出来高異常銘柄をエクセルに書き出す

出来高が異常値を示す銘柄をエクセルに書き出す

「【Python Program】指定した条件の銘柄をエクセルに書き出す」プログラムにて保存したファイル
「全銘柄.xlsx」の銘柄から出来高が異常値を示す銘柄を選んで、エクセルファイルに保存するプログラムです。

#全候補銘柄から出来高異常をチェック
import openpyxl
from stock_history import search_one 
fname = "C:/Users/user/Documents/銘柄候補/全銘柄.xlsx"
wb = openpyxl.load_workbook(fname)
ws = wb["全銘柄"]
num = 0
for row in ws.iter_rows(min_row=2):
    if row[0].value == None:
        break
    try:
        if search_one(str(row[0].value)) == "ok":
            print(num + 1, row[0].value, row[1].value)
            num = num + 1
    except:
        continue

以下のコードを「stock_history.py」というファイル名で保存します。

#出来高異常値を発見してエクセルに保存
def search_one(s_code):
    import math
    import numpy
    import csv
    import openpyxl
    import time
    import datetime
    import pandas as pd
    import urllib3
    from bs4 import BeautifulSoup

    url = "https://stocks.finance.yahoo.co.jp/stocks/history/?code=" + s_code + ".T"
    http = urllib3.PoolManager()
    response = http.request('get', url)
    soup = BeautifulSoup(response.data, 'html.parser')
    title = soup.find('title').text
    if title == "Yahoo!ファイナンス":
        url = "https://finance.yahoo.co.jp/quote/"  + s_code + ".N/history"
        response = http.request('get', url)
        soup = BeautifulSoup(response.data, 'html.parser')
        title = soup.find('title').text

    dfs = pd.read_html(url, match = '出来高')
    dfs[0].columns = ['日付', '始値', '高値', '安値', '終値', '出来高', '調整後終値']

    fname = "C:/Users/user/Documents/new_search/出来高異常判定.xlsx"
    wb = openpyxl.load_workbook(fname)
    ws = wb["Sheet1"]
    wsd = wb["出来高の異常判定"]

    dekid = []
    lastv = []
    r_num = 0
    e_num = 0
    while e_num < 20:
        if isinstance(dfs[0].iloc[r_num,6], str):
            if dfs[0].iloc[r_num,6][:2] == "分割":
                r_num = r_num + 1
                continue
            ws.cell(e_num + 2, 1).value = dfs[0].iloc[r_num,0]
            ws.cell(e_num + 2, 2).value = int(dfs[0].iloc[r_num,5])
            ws.cell(e_num + 2, 3).value = float(dfs[0].iloc[r_num,6])
            dekid.append(int(dfs[0].iloc[r_num,5]))
            lastv.append(float(dfs[0].iloc[r_num,6]))
        else:
            ws.cell(e_num + 2, 1).value = dfs[0].iloc[r_num,0]
            ws.cell(e_num + 2, 2).value = dfs[0].iloc[r_num,5]
            ws.cell(e_num + 2, 3).value = dfs[0].iloc[r_num,6]
            dekid.append(dfs[0].iloc[r_num,5])
            lastv.append(dfs[0].iloc[r_num,6])
        r_num = r_num + 1
        e_num = e_num + 1

    wsd["E2"].value = title

    d_num = 0
    r_num = 0
    d_bun = 0.0
    d_max = 0
    d_ave = numpy.average(dekid)
    for data in dekid:
        d_bun = d_bun + (data - d_ave) ** 2
        if data > d_max and r_num < len(dekid) - 1:
            d_max = data
            d_num = r_num
            zen_hi = abs((lastv[r_num]-lastv[r_num + 1])/lastv[r_num + 1]*100)
        r_num = r_num + 1
    d_sig = math.sqrt(d_bun / len(dekid))

    if d_max > d_ave + d_sig * 4 and zen_hi <= 3.0:
        nname = "C:/Users/user/Documents/new_search/出来高異常判定" + s_code + ".xlsx"
        wb.save(nname)
        return "ok"

Posted by Ish