【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"
最近のコメント