Yahooファイナンスの値上がりランキングの銘柄の出来高が、平均の何倍出来ているか?を出すPythonのシステム

●概要

予め各銘柄の平均出来高のリストを作成しておき、
Yahooファイナンスの値上がりランキングに表示されている銘柄と、
何倍の出来事があるか、一瞬で出すプログラムコード

●平均出来高のリストの作成

まず各銘柄のデイリーの情報を取得する必要がありますので、
以前作成しました下記の記事の方法で取得します

●Stooqを使って全ての株価情報を、ほぼ一括で取得する方法

ファイルを任意をフォルダに格納しておき、下記のコードで各銘柄の平均出来高の一覧を作成する
●コード全般

# インポート系
import pandas as pd

# フォルダに入っているファイル数を取得する
dir = ""銘柄のファイルを入れた、フォルダのURL""
code_range = sum(os.path.isfile(os.path.join(dir,name)) for name in os.listdir(dir))

# 平均出来高の期間
span200=200

# 最終処理を終えた物を格納する用のデータフレーム
financial_data03=  pd.DataFrame(index= [], columns=[])

# フォルダに入っているファイル数分、処理を行う
for p in range(code_range):
    # CSVの読み込み
    files = os.listdir(dir)
    file_path = str(dir+"/"+files[p])
    file_name = Path(file_path).stem
    print(file_name)
    financial_data =  pd.read_csv(file_path)
   
    #出来高リストで使う物の処理を行う
    financial_data =  financial_data.sort_values('Date', ascending=True)

    #ファイル名が「●●●●.jp」という名称なので、「.jp」を削除した、名称だけの関数を作成する
    financial_data['コード名'] =file_name.replace('.jp', '')

    #読み込んだファイルの小数点を切り捨てる
    financial_data['Open'] =financial_data['Open'].round()
    financial_data['High'] =financial_data['High'].round()
    financial_data['Low'] =financial_data['Low'].round()
    financial_data['Close'] =financial_data['Close'].round()

    financial_data02 =  financial_data.copy()
    financial_data02 =  financial_data02.set_index('Date')

    financial_data02['日付'] =financial_data02.index

    #各日の200日平均の出来高を出す
    financial_data02['平均出来高'] =financial_data02['Volume'].rolling(window=span200).mean()
    financial_data02['平均出来高'] =financial_data02['平均出来高'].round()

    #対象日の出来高が平均出来高の何倍かを出す
    financial_data02['出来高倍率'] =financial_data02['Volume']/financial_data02['平均出来高'].round()
    financial_data02['出来高倍率'] =financial_data02['出来高倍率'].round(+2)

    #一番最後の日付だけ抽出する
    financial_data02 = financial_data02.tail(1)

    #最後の日だけまとめ用のデータフレームに追加する
    financial_data03 = financial_data03.append(financial_data02)


#まとめ用のデータフレームをExcelファイルで保存する
# 計算した出来高を書きこみ
file_name01 = "ファイル名.xlsx"
rows = dataframe_to_rows(financial_data03, index=False, header=True) 

wb = openpyxl.load_workbook(file_name01)
ws = wb.worksheets[0]

# ファイルを初期化
for row in ws:
    for cell in row:
        cell.value = None

# ワークシートへデータを書き込む
row_start_idx = 1
col_start_idx = 1
for row_no, row in enumerate(rows, row_start_idx):
    for col_no, value in enumerate(row, col_start_idx):
        ws.cell(row=row_no, column=col_no, value=value) # 1セルづつ書込む

#ファイルの保尊
wb.save(file_name01)

●出来高リストを基に、値上がりランキングの出来高とリストの出来高を比較をする一覧作成する

ウェブスクレイピングで、Yahooファイナンスの値上がりランキングを抽出し、データクレンジングをしてから上記の出来高リストと比較して、今の出来高が平均出来高の何倍かを出すコードを各
●コード全般

import pandas as pd
import os
from selenium import webdriver
import numpy as np
import datetime
import openpyxl
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows


chromedriver_path = "chromedriver.exeがあるフォルダをしてする"
chromedriver = os.listdir(chromedriver_path)
chromedriver_files =chromedriver_path+chromedriver[0]
browser = webdriver.Chrome(chromedriver_files)

IncreaseURL_01 =  "https://finance.yahoo.co.jp/stocks/ranking/up?market=all&term=daily&page="
Increase_Table01=  pd.DataFrame(index= [], columns=[])
Increase_Table10=  pd.DataFrame(index= [], columns=[])

for i in range(4):
    url=IncreaseURL_01+str(i)
    print(url)
    
    browser.get(url)
    data = pd.read_html(url)
    Base_table01 = data[0].dropna()
    Base_table01["区分"] = "値上がり"
    Increase_Table01=Increase_Table01.append(Base_table01)

#値上がりテーブルのクリーニング

# 出来高を数字に変換
Increase_Table10_Volumcolumn_list = Increase_Table01["出来高"].tolist()
Increase_Table10_Volumcolumn_list = [item.replace('株', '') for item in Increase_Table10_Volumcolumn_list]
Increase_Table10_Volumcolumn_list = [item.replace(',', '') for item in Increase_Table10_Volumcolumn_list]
Increase_Table10_Volumcolumn_list = [item.replace('---','0') for item in Increase_Table10_Volumcolumn_list]
Increase_Table10_Volumcolumn_list = list(map(int, Increase_Table10_Volumcolumn_list))
Increase_Table01["出来高"]=Increase_Table10_Volumcolumn_list


# 名称・コード・市場の入れ替え。
Increase_Table01_list = Increase_Table01["名称・コード・市場"].tolist()
Increase_Table01_list = [item.replace('掲示板', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('外国掲示板', '') for item in Increase_Table01_list]

Increase_Table01_list = [item.replace('東証STD', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証PRM', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証GRT', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証PRM外国', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証GRT外国', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証ETF', '') for item in Increase_Table01_list]

Increase_Table01_list = [item.replace('名証PRM', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('名証NXT', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('名証MN', '') for item in Increase_Table01_list]


Increase_Table01_list = [item.replace('福証', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('札証', '') for item in Increase_Table01_list]

Increase_Table01_list = [item.replace('札幌ア', '') for item in Increase_Table01_list]

Increase_Table01_list = [item.replace('外国', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証', '') for item in Increase_Table01_list]

Increase_Table01["Base"] =Increase_Table01_list
Increase_Table01["コード"] =Increase_Table01["Base"].str[-4:]
Increase_Table01["名称"] =Increase_Table01["Base"].str[:-4]

# マージ用のテーブルを
Increase_Table10["順位"] =Increase_Table01["順位"]
Increase_Table10["コード"] =Increase_Table01["コード"].astype(np.int64)
Increase_Table10["名称"] =Increase_Table01["名称"]
Increase_Table10["出来高"] =Increase_Table01["出来高"]
Increase_Table10["区分"] =Increase_Table01["区分"]

file_path = "出来高リスト.xlsx"
averageVolume01 =   pd.read_excel(file_path,sheet_name=0)
averageVolume10 =  pd.DataFrame(index= [], columns=[])

averageVolume10["コード"] = averageVolume01["コード名"]
averageVolume10["コード"] =averageVolume10["コード"].astype(np.int64)
averageVolume10["最終日"] = averageVolume01["日付"]
averageVolume10["基準日出来高"] = averageVolume01["Volume"]
averageVolume10["平均出来高"] = averageVolume01["平均出来高"]


SummaryTable10 = pd.merge(Increase_Table10,averageVolume10, on='コード',how='left')
SummaryTable10 =SummaryTable10.fillna(0)
SummaryTable10["当日出来高/平均出来高"] =SummaryTable10["出来高"]/SummaryTable10["平均出来高"]
SummaryTable10["当日出来高/平均出来高"] =SummaryTable10["当日出来高/平均出来高"].round(2)
# SummaryTable10["当日出来高/基準日出来高"] =SummaryTable10["出来高"]/SummaryTable10["基準日出来高"]
# SummaryTable10["当日出来高/基準日出来高"] =SummaryTable10["当日出来高/基準日出来高"].round(2)


# SummaryTable20= SummaryTable10[(SummaryTable10["当日出来高/基準日出来高"]>=5) | (SummaryTable10["当日出来高/平均出来高"]>=5)]
SummaryTable20= SummaryTable10[(SummaryTable10["当日出来高/平均出来高"]>=5)]
SummaryTable20= SummaryTable20[(SummaryTable20["平均出来高"]>0)]
SummaryTable20= SummaryTable20.sort_values('当日出来高/平均出来高', ascending=False)
SummaryTable20= SummaryTable20.drop_duplicates(subset=['コード'])

t_delta = datetime.timedelta(hours=9)
JST = datetime.timezone(t_delta, 'JST')
now = datetime.datetime.now(JST)
d = now.strftime('%Y_%m_%d_%H_%M')


●各コードの解説

使用するパッケージをインストールする

import pandas as pd
import os
from selenium import webdriver
import numpy as np
import datetime
import openpyxl
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows

起動する「chromedriver」を指定する。
、他のプログラムでも使いまわせるに、このようにフォルダを指定して管理をしておく

chromedriver_path = "chromedriver.exeがあるフォルダをしてする"
chromedriver = os.listdir(chromedriver_path)
chromedriver_files =chromedriver_path+chromedriver[0]
browser = webdriver.Chrome(chromedriver_files)

Yahooファイナンスのページ指定と、空白のデータフレームを作成する。
URLはFOR文を使って末尾にページ数を入れるので、空白にしておく

IncreaseURL_01 =  "https://finance.yahoo.co.jp/stocks/ranking/up?market=all&term=daily&page="
Increase_Table01=  pd.DataFrame(index= [], columns=[])
Increase_Table10=  pd.DataFrame(index= [], columns=[])

Yahooファイナンスの値上がりランキングに遷移して、
ランキング情報をBase_table01に追加する。

for i in range(4):
    url=IncreaseURL_01+str(i)
    print(url)
    
    browser.get(url)
    data = pd.read_html(url)
    Base_table01 = data[0].dropna()
    Increase_Table01=Increase_Table01.append(Base_table01)

出来高の項目を数字にするための、データクレンジングを行う
まず出来高の項目をリストに入れて、そこから不要な文字を消して、
最後にint型に変更して、出来高の項目を上書きする

Increase_Table10_Volumcolumn_list = Increase_Table01["出来高"].tolist()
Increase_Table10_Volumcolumn_list = [item.replace('株', '') for item in Increase_Table10_Volumcolumn_list]
Increase_Table10_Volumcolumn_list = [item.replace(',', '') for item in Increase_Table10_Volumcolumn_list]
Increase_Table10_Volumcolumn_list = [item.replace('---','0') for item in Increase_Table10_Volumcolumn_list]
Increase_Table10_Volumcolumn_list = list(map(int, Increase_Table10_Volumcolumn_list))
Increase_Table01["出来高"]=Increase_Table10_Volumcolumn_list

企業の名称・銘柄コード・上場市場が1つにまとまってるので、
各項目に分けるようデータクレンジングを行います。

まず項目内で市場の情報は不要なので、項目をリストに入れて、
市場の名称をを削除します。
削除が完了後に項目をリストに入れて、Baseという項目を代入します。
銘柄コードはBaseの後ろ4字を指定し、
企業名はBaseの後ろ4字より前の文字全て指定する。

# 名称・コード・市場の入れ替え。
Increase_Table01_list = Increase_Table01["名称・コード・市場"].tolist()
Increase_Table01_list = [item.replace('掲示板', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('外国掲示板', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証STD', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証PRM', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証GRT', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証PRM外国', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証GRT外国', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証ETF', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('名証PRM', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('名証NXT', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('名証MN', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('福証', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('札証', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('札幌ア', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('外国', '') for item in Increase_Table01_list]
Increase_Table01_list = [item.replace('東証', '') for item in Increase_Table01_list]

Increase_Table01["Base"] =Increase_Table01_list
Increase_Table01["コード"] =Increase_Table01["Base"].str[-4:]
Increase_Table01["名称"] =Increase_Table01["Base"].str[:-4]

一度データフレームを整形します

# マージ用のテーブルを
Increase_Table10["順位"] =Increase_Table01["順位"]
Increase_Table10["コード"] =Increase_Table01["コード"].astype(np.int64)
Increase_Table10["名称"] =Increase_Table01["名称"]
Increase_Table10["出来高"] =Increase_Table01["出来高"]
Increase_Table10["区分"] =Increase_Table01["区分"]

出来高リストを読み込み、上記のデータフレームとマージするため、
一度整形する。

file_path = "出来高リスト.xlsx"
averageVolume01 =   pd.read_excel(file_path,sheet_name=0)
averageVolume10 =  pd.DataFrame(index= [], columns=[])

averageVolume10["コード"] = averageVolume01["コード名"]
averageVolume10["コード"] =averageVolume10["コード"].astype(np.int64)
averageVolume10["最終日"] = averageVolume01["日付"]
averageVolume10["基準日出来高"] = averageVolume01["Volume"]
averageVolume10["平均出来高"] = averageVolume01["平均出来高"]

Yahooファイナンスを読みこんだデータフレームと、
出来高リストのデータフレームをマージをする。
またこの際欠損値を0にする

SummaryTable10 = pd.merge(Increase_Table10,averageVolume10, on='コード',how='left')
SummaryTable10 =SummaryTable10.fillna(0)

マージしたデータフレームに現在の出来高を分子に、
出来高リストでの平均出来高を分母とした値を出し、
現在の出来高が平均の何倍の出来高を計算します。

SummaryTable10["当日出来高/平均出来高"] =SummaryTable10["出来高"]/SummaryTable10["平均出来高"]
SummaryTable10["当日出来高/平均出来高"] =SummaryTable10["当日出来高/平均出来高"].round(2)

上記の処理を行ったうえで、
現在の出来高が平均より5倍以上のだけを出します。
条件抽出後に降順で並べなおし、重複している銘柄コードを削除します

SummaryTable20= SummaryTable10[(SummaryTable10["当日出来高/平均出来高"]>=5)]
SummaryTable20= SummaryTable20.sort_values('当日出来高/平均出来高', ascending=False)
SummaryTable20= SummaryTable20.drop_duplicates(subset=['コード'])

以上で完成です

最後に

これで事前に出来高リストを作成していれば、システムを起動するだけで、
出来高が普段より多く出来ている銘柄を瞬時に把握できます

おまけ

このシステムをChatGPTにお願いすれば、もっと短い物で簡単にだせるんだろうな、と思う今日この頃です・・・


この記事が気に入ったらサポートをしてみませんか?