株価の高値・安値について、米国株では52週高値・安値が表示されるのが一般的です。
一方、日本株では年初来高値・安値が表示されることが多いです。
52週高値・安値は対象期間の長さが一定ですが、年初来高値・安値は対象期間が変動します。
対象期間 | |
---|---|
52週高値・安値 | 過去52週間(約1年間) |
年初来高値・安値 | その年(3月までは前年とその年) |
例えば、2023年3月の年初来高値・安値は2022年1月~2023年3月の15か月間が対象なのに対し、2023年4月の年初来高値・安値は2023年1月~4月の4か月間が対象です。
そのため、個人的には52週高値・安値の方が妥当と考えております。
ですが、日本株銘柄の52週高値・安値を表示しているサイトはほとんどありません。
「バフェットコード」では各銘柄ページで「1年高値・安値」を確認できますので、1銘柄だけ確認するのであれば便利です。
ですが、「バフェットコード」では※スクレイピングが禁止されていますので、複数銘柄を調べたいときには各銘柄ページを手動で表示していく必要があり大変です。
この記事では、Pythonを使用し、各日の株価データから52週高値・安値を算出し、Excelに出力する方法を紹介します。
Excelで銘柄分析を行っている場合、VLOOKUP関数で他のブックからも読み込むことができるので利用しやすいです。
株価は以下サイトのデータを使用させていただいております。
「当日株価データー」から各日の株価データを取得することができます。
事前準備
Pythonのインストール
まずはPythonをインストールしておく必要があります。
インストール手順は以下の記事で解説しています。
パッケージのインストール
プログラム内で使用するパッケージをインストールします。
①コマンドプロンプトを起動する
コマンドプロンプトを起動します。
Win + R キーを押して「ファイル名を指定して実行」を表示し、「cmd」と入力します。
Enterキーを押すと、コマンドプロンプトが起動します。
②パッケージをインストールする
プログラム内で使用するパッケージをインストールします。
今回は以下のパッケージが必要になります。
- numpy
- pandas
- openpyxl
コマンドプロンプトに、以下のコマンドを順に入力します。
pip install numpy
pip install pandas
pip install openpyxl
株価データのダウンロード
以下サイトから株価データを1年分取得します。
初回は量が多く大変ですが、一度やってしまえば以降は差分をダウンロードするだけでよいのでそれほど大変ではありません。
①「当日株価データー」をクリックする
トップページの「当日株価データー」をクリックします。
②日付をクリックする
日付をクリックします。
クリックした日付の株価データがダウンロードできます。
過去の年については、画面右上の「※ 過去株価データー」で年を切り替えれば取得できます。
なお、こちらのサイトで配布されている株価データの各列は以下のようになっています。
- 日付
- 銘柄コード
- 市場コード?
- 銘柄コード + 銘柄名
- 始値
- 1日高値
- 1日安値
- 終値
- 出来高
- 市場名
③zipファイルを解凍し、年月ごとにフォルダ分けする
zipファイルを解凍し、以下のようなフォルダ構成を作成します。
data ┬ 2212 ┬ T221201.csv
│ ├ T221202.csv
│ ├ …
│ └ T221230.csv
├ 2211 ┬ T221101.csv
│ ├ T221102.csv
│ ├ …
│ └ T221130.csv
├ …
…
└ yymm ┬ Tyymm01.csv
├ …
└ Tyymm31.csv
プログラム
プログラム作成
以下のようなプログラムを作成します。
ファイル名は「stock.py」としています。
import numpy as np import pandas as pd import datetime as dt import openpyxl # 銘柄コード列 COLUMN_CODE = 1 # 銘柄名列 COLUMN_NAME = 3 # 高値列 COLUMN_MAX = 5 # 安値列 COLUMN_MIN = 6 # 終値列 COLUMN_PRICE = 7 # ファイルパス取得 def get_file_path(target_date): year = target_date.strftime('%y').zfill(2) month = str(target_date.month).zfill(2) day = str(target_date.day).zfill(2) dir_name = "./data/" + year + month file_name = "T" + year + month + day + ".csv" return dir_name + "/" + file_name # CSV読み込み def read_csv(file_path): return pd.read_csv(filepath_or_buffer=file_path, encoding="ms932", sep=",", header=None) # 株価データ変換 def convert_stock(csv_data): df = pd.DataFrame( data={ '銘柄コード': csv_data.iloc[:, COLUMN_CODE], '銘柄名': csv_data.iloc[:, COLUMN_NAME].str[5:], '高値': csv_data.iloc[:, COLUMN_MAX], '安値': csv_data.iloc[:, COLUMN_MIN], '株価': csv_data.iloc[:, COLUMN_PRICE]} ) df = df.set_index(csv_data.iloc[:, COLUMN_CODE]) return df # 株価データ比較 def diff_stock(df_output, df_tmp): # 株価が0になっているデータはエラーデータとして除外 df_output = df_output[df_output['株価'] != 0] df_tmp = df_tmp[df_tmp['株価'] != 0] # マージ df_output = pd.concat([df_output, df_tmp]) df_output = df_output[~df_output.index.duplicated()] df_tmp = pd.concat([df_tmp, df_output]) df_tmp = df_tmp[~df_tmp.index.duplicated()] # 昇順にソート df_output.sort_index(inplace = True) df_tmp.sort_index(inplace = True) try: df_output['高値'] = np.where(df_output['高値'] > df_tmp['高値'], df_output['高値'], df_tmp['高値']) df_output['安値'] = np.where(df_output['安値'] < df_tmp['安値'], df_output['安値'], df_tmp['安値']) except: print(target_date) print(df_output) print(df_tmp) df_output.to_csv('df_output.csv') df_tmp.to_csv('df_tmp.csv') quit() return df_output ############## # メイン処理 # ############## target_date = dt.date.today() end_date = dt.date.today() - dt.timedelta(weeks=52) df_output = None # ①株価データを処理 while target_date > end_date: try: print(target_date) filePath = get_file_path(target_date) csv_data = read_csv(filePath) if df_output is None: df_output = convert_stock(csv_data) update_date = target_date else: df_tmp = convert_stock(csv_data) df_output = diff_stock(df_output, df_tmp) except FileNotFoundError: pass target_date -= dt.timedelta(days=1) # ②処理した株価データを出力 df_output.to_excel('株価.xlsx', index=False) # ③最新株価データの日付を出力 wb = openpyxl.load_workbook('株価.xlsx') wb.create_sheet(index=1, title='Sheet2') wb['Sheet2']['A1'] = update_date wb.save('株価.xlsx')
大まかな処理の流れは以下です。
①株価データを処理
以下の処理を今日の日付から52週前の日付まで繰り返します。
- 株価のデータを取得。
- 各銘柄について、保持している高値・安値よりも高い株価・安い株価であれば値を更新。
②処理した株価データを出力
「株価.xlsx」の「Sheet1」シートに以下のデータを出力します。
- 銘柄コード
- 銘柄名
- 52週高値
- 52週安値
- 最新株価
③最新株価データの日付を出力
「株価.xlsx」の「Sheet2」シートに最新株価データの日付を出力します。
フォルダ構成
以下のようなフォルダ構成を作成します。
(任意のフォルダ名) ┬ data ┬ …
| └ yymm
├ stock.bat
└ stock.py
dataフォルダは、株価データをダウンロードした際に作成したフォルダです。
stock.batには以下のコードを記述します。
@echo off python stock.py
プログラム実行
stock.batをダブルクリックするとプログラムが実行されます。
stock.pyと同じフォルダ内に「株価.xlsx」が出力されます。
まとめ
日本株の52週高値・安値を公開しているサイトはほとんどないため、一覧で取得したい場合には自分で作成する必要があります。
この記事では「汲めども尽きない 無尽蔵」様の株価データを使用し、52週高値・安値をPythonで算出する方法を紹介しました。
コードを書き換えれば、他サイト様の株価データでも対応可能だと思います。
コメント