カスタム関数シリーズでは、便利に使えるオリジナル関数を紹介しています。
※カスタム関数は、一般的には「ユーザー定義関数」と呼ばれています
日本株のデータを無料でダウンロードする方法
株価データを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ファイルを実行できるバッチファイルを自動生成
j#スクリプトを実行するバッチファイルを生成
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を徹底解説します
コメント