pythonカスタム関数§07:download_mujinzo() 無尽蔵さんのサイトから指定日の全株価データをダウンロードする

Pythonをもっと便利にしよう!

カスタム関数シリーズでは、便利に使えるオリジナル関数を紹介しています。

※カスタム関数は、一般的には「ユーザー定義関数」と呼ばれています

日本株のデータを無料でダウンロードする方法

株価データをpythonで処理すると、さまざまな観点から解析ができます。

まずは、その株価データを入手する必要があります。ここでは、次のような方の要望に応じるための便利なpythonプログラムを紹介します。

  • 株価データを無料でダウンロードしたい
  • pythonのpandasを習得したい
  • 株価データを解析して、一儲けしたい(^^;)

無料で株価データをダウンロードする方法はいくつかあり、このブログでもAPIを使った方法やスクレイピングを使った方法で指定コードの株価データを取得する方法を紹介しました。

カスタム関数:read_stockdata() 株価ダウンロード

ここでは、ファイルを自動ダウンロードする方法を紹介します。

使用させたもらったサイトは「無尽蔵」さんです。

無尽蔵さんからは以下のような注意事項のお知らせがありますので、永久にダウンロードできる保証がないことを覚悟して使ってください。

無尽蔵データーご利用(一般)の方へ

株式及び先物のデーター掲載に付きましては、継続のお約束は出来ません。

出来るだけ、他のデーターサイトを ご利用下さるよう お願いします。

また掲載データーは、ファミリー補完資料としての、性格のものですので、

掲載時刻も定まっておりません。ご承知下さい。

一部を除き、閲覧は制限していませんが、ご理解のうえ自己責任でお使い下さい。

download_mujinzo(date_str,folder) 株価をダウンロードする

まずインポート文です。プログラムファイルの先頭部分に入れてください。

import datetime
import pandas as pd
from pandas import DataFrame,Series
import requests
import os
import sys

 

つぎは、本日の主役であるカスタム関数の中身です。

def download_mujinzo(date_str='2020-08-14',folder='./'):
    #無尽蔵さんから指定日付の株価データをダウンロード
    year, month, day = date_str.split('-')
    fileName = 'T{0}{1}{2}.zip'.format(year[-2:], month, day)
    url= 'http://mujinzou.com/d_data/{0}d/{1}_{2}d/{3}'.format(year, year[-2:], month, fileName)  #2020
    filename = url.split('/')[-1]
    r = requests.get(url, stream=True)

    if  "<Response [200]>" in str(r):
        filepath=os.path.join(folder, filename)
        with open(filepath, 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)
                    f.flush()
        print(f'Download Success:{filename}')
    else:
        print('Open Error')
    return filename

 

引数は、download_mujinzo(date_str=’2020-08-14′,folder=’./’)のようにdete_strにハイフンを使った書式で年-月-日を文字列として設定します。folderは、ダウンロードしたzipファイルを保存するフォルダーを指定します。ここでは、スクリプトファイルと同じ場所になります。(なると思います)

関数の使い方

if __name__ == '__main__':
    #スクリプトを実行するバッチファイルを生成
    fname=os.path.splitext(os.path.basename(sys.argv[0]))[0]+'.bat'
    with open(fname,'w') as f:f.write(f'python "{sys.argv[0]}" \n pause \n')

    #日付と保存フォルダを指定して、株価データをダウンロード
    
    date='2020-08-14'   #ここを変更して利用する
    
    filename=download_mujinzo(date_str=date,folder='./')
    print('*'*30)
    print(f'Download Filename:{filename}')
    print('*'*30)
    
    #zipファイルを読み込み、DataFrameに変換する → その後列名をセットする
    df=pd.read_csv(filename,encoding="shift_jis",header=None)    
    df.columns=['date','code','no','name','open','high','low','close','volume','market']#列名をセット

    #データフレームの内容を表示
    print('*'*10,'DataFrame information','*'*10)
    print(df.info())    #各列の情報
    
    print('*'*10,'DataFrame first 10 data ','*'*10)
    print(df.head(10))  #先頭10個のデータ表示
    
    #一時停止のための入力待ち
    print('*'*30)
    a=input('Program finished!')

最初の三行はおまけです。実行して一時停止するためのバッチファイルを作成しています。

このバッチファイルの生成については、こちらで詳しく説明しています。→

カスタム関数:CreateBatfile() Pythonファイルを実行できるバッチファイルを自動生成

#スクリプトを実行するバッチファイルを生成
    fname=os.path.splitext(os.path.basename(sys.argv[0]))[0]+'.bat'
    with open(fname,'w') as f:f.write(f'python "{sys.argv[0]}" \n pause \n')

次から本題です。

    #日付と保存フォルダを指定して、株価データをダウンロード
    
    date='2020-08-14'   #ここを変更して利用する
    
    filename=download_mujinzo(date_str=date,folder='./')
    print('*'*30)
    print(f'Download Filename:{filename}')
    print('*'*30)

 

date変数に日付を入れます。保存フォルダもfolder変数に指定します。(この場合は、スクリプトファイルのある場所と同じです。

そして、download_mujinzo()を呼び出します。成功したら「Download Success」、失敗したら「Open Error」と表示があります。失敗のほとんどは、データがない場合です。証券取引所が休みの日は、データが存在しませんので、このエラーが出たときは、日付を確認してください。

このとき、ダウンロードしたファイル名が返ってきます。(成功しても失敗してもファイル名は返ってきます)このファイル名を表示しています。

    #zipファイルを読み込み、DataFrameに変換する → その後列名をセットする
    df=pd.read_csv(filename,encoding="shift_jis")    
    df.columns=['date','code','no','name','open','high','low','close','volume','market']#列名をセット

 

ダウンロードがうまくいったら、次はファイルの変換です。pandasのread_csvメソッドは、CSVファイルだけでなく、圧縮されたファイル(.zip)も自動的に解凍して、読み込んでくれます。

ここで注意はencoding=”shift_jis” でエンコードを設定しないとエラーで止まってしまいます。

    #データフレームの内容を表示
    print('*'*10,'DataFrame information','*'*10)
    print(df.info())    #各列の情報
    
    print('*'*10,'DataFrame first 10 data ','*'*10)
    print(df.head(10))  #先頭10個のデータ表示

 

ここでは、DataFrameであるdfの情報を表示したり、内容を10個だけ表示したりしています。表示結果は以下のとおりです。

Download Success:T200814.zip
******************************
Download Filename:T200814.zip
******************************
********** DataFrame information **********
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4052 entries, 0 to 4051
Data columns (total 10 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   date    4052 non-null   object
 1   code    4052 non-null   int64
 2   no      4052 non-null   int64
 3   name    4052 non-null   object
 4   open    4052 non-null   float64
 5   high    4052 non-null   float64
 6   low     4052 non-null   float64
 7   close   4052 non-null   float64
 8   volume  4052 non-null   int64
 9   market  4052 non-null   object
dtypes: float64(4), int64(3), object(3)
memory usage: 316.7+ KB
None
********** DataFrame first 10 data  **********
        date  code  no           name  ...      low    close      volume  market
0  2020/8/14  1002  11     1002 TOPIX  ...   1619.0   1623.0  1055530000    東証1部
1  2020/8/14  1301  11        1301 極洋  ...   2693.0   2706.0       11900    東証1部
2  2020/8/14  1305  11    1305 ダイワTPX  ...   1690.0   1691.0       41620    東証1部
3  2020/8/14  1306  11    1306 TOPIX投  ...   1667.0   1671.0     1194770    東証1部
4  2020/8/14  1308  11     1308 上場TPX  ...   1649.0   1655.0      111500    東証1部
5  2020/8/14  1309  11    1309 上海上証50  ...  37350.0  37650.0         151    東証1部
6  2020/8/14  1311  11    1311 T30連動投  ...    737.0    737.0        2250    東証1部
7  2020/8/14  1312  11    1312 野村小型コア  ...      0.0      0.0           0    東証1部
8  2020/8/14  1313  11  1313 KODEX200  ...   2822.0   2855.0          20    東証1部
9  2020/8/14  1319  12    1319 日経300F  ...    308.0    308.0        1000    東証2部

[10 rows x 10 columns]
******************************
Program finished!

これで、一日だけですが、全株データを取得することができました。1日だけのデータですが、以下のリストのようにいろいろなことがわかります。

  • 銘柄コードの検索 → リスト化して、自動で複数日の株価データ取得するプログラムにいかす
  • 始値→高値の割合が高かった(その日内での値上がり率)の算出
  • 始値→終値 (その日の値上がり、値下がり銘柄)※一般的には前日比で議論されることが多いですが、その日の中での変化は、デイトレードにも有用な情報です。
  • 高値=終値 調子のよい銘柄の抽出(明日も上がるかも)
  • 安値=終値 下がり調子の銘柄の抽出(明日も下がるかも)
  • 終値(close)×出来高(volume) で売買代金を計算する。(売買代金が多い銘柄は流動性が高いと言われています。

このあとのdfをどのように料理するか、また別の記事で紹介していきます。

pandasの基本的な解説をしている記事も参考にしてください→

pandasを徹底解説します

 

コメント

タイトルとURLをコピーしました