日本株銘柄の52週高値・安値株価を取得する方法【Python利用】

※アフィリエイト広告を含む場合があります

株価の高値・安値について、米国株では52週高値・安値が表示されるのが一般的です。

一方、日本株では年初来高値・安値が表示されることが多いです。

 

52週高値・安値は対象期間の長さが一定ですが、年初来高値・安値は対象期間が変動します。

対象期間
52週高値・安値過去52週間(約1年間)
年初来高値・安値その年(3月までは前年とその年)

例えば、2023年3月の年初来高値・安値は2022年1月~2023年3月の15か月間が対象なのに対し、2023年4月の年初来高値・安値は2023年1月~4月の4か月間が対象です。

そのため、個人的には52週高値・安値の方が妥当と考えております。

ですが、日本株銘柄の52週高値・安値を表示しているサイトはほとんどありません。

 

「バフェットコード」では各銘柄ページで「1年高値・安値」を確認できますので、1銘柄だけ確認するのであれば便利です。

ですが、「バフェットコード」では※スクレイピングが禁止されていますので、複数銘柄を調べたいときには各銘柄ページを手動で表示していく必要があり大変です。

※スクレイピング

プログラムを使用して、Webサイトのデータを自動取得すること。
サーバーに負荷がかかるため、禁止しているサイトがあります。

 

この記事では、Pythonを使用し、各日の株価データから52週高値・安値を算出し、Excelに出力する方法を紹介します。

Excelで銘柄分析を行っている場合、VLOOKUP関数で他のブックからも読み込むことができるので利用しやすいです。

本記事では、大まかな値が分かればよい方を対象としております。

正確なデータが必要な場合は、他の方法をご検討ください。

 

株価は以下サイトのデータを使用させていただいております。

汲めども尽きない 無尽蔵

「当日株価データー」から各日の株価データを取得することができます。

 

 

スポンサーリンク

事前準備

Pythonのインストール

まずはPythonをインストールしておく必要があります。

インストール手順は以下の記事で解説しています。

パッケージのインストール

プログラム内で使用するパッケージをインストールします。

①コマンドプロンプトを起動する

コマンドプロンプトを起動します。

Win + R キーを押して「ファイル名を指定して実行」を表示し、「cmd」と入力します。

ファイル名を指定して実行(「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週前の日付まで繰り返します。

  1. 株価のデータを取得。
  2. 各銘柄について、保持している高値・安値よりも高い株価・安い株価であれば値を更新。

②処理した株価データを出力

「株価.xlsx」の「Sheet1」シートに以下のデータを出力します。

  • 銘柄コード
  • 銘柄名
  • 52週高値
  • 52週安値
  • 最新株価

③最新株価データの日付を出力

「株価.xlsx」の「Sheet2」シートに最新株価データの日付を出力します。

フォルダ構成

以下のようなフォルダ構成を作成します。

(任意のフォルダ名) ┬ data ┬ …
                   |      └ yymm
                   ├ stock.bat
                   └ stock.py

 

dataフォルダは、株価データをダウンロードした際に作成したフォルダです。

stock.batには以下のコードを記述します。

@echo off
python stock.py

プログラム実行

stock.batをダブルクリックするとプログラムが実行されます。

stock.bat

 

stock.pyと同じフォルダ内に「株価.xlsx」が出力されます。

 

スポンサーリンク

まとめ

日本株の52週高値・安値を公開しているサイトはほとんどないため、一覧で取得したい場合には自分で作成する必要があります。

この記事では「汲めども尽きない 無尽蔵」様の株価データを使用し、52週高値・安値をPythonで算出する方法を紹介しました。

コードを書き換えれば、他サイト様の株価データでも対応可能だと思います。

コメント