これの続き。
モジュールを使用した登録処理系のソースコードを記す。
Contents
first_insert_DB.py
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '../../localData'))
sys.path.append(os.path.join(os.path.dirname(__file__), '../database_module'))
sys.path.append(os.path.join(os.path.dirname(__file__), '../self_made_module'))
import kabu_plus_read as k
import operationTool as o
import localData as A
import tradeHelpTool as t
import sqlite3
import pandas as pd
import workdays
from datetime import date, datetime
import os
#祝日一覧作成
holidayPath = A.holidayPath
holidayList = t.getHolidayList(holidayPath)
#最初の日付(20180104)
firstDate = datetime(2018,1,4)
tmpDate = firstDate
#最終日付
filePath = A.stockDataDailyPath + "/japan-all-stock-data.csv"
createDta = os.path.getmtime(filePath)
tmpNewestDate=datetime.fromtimestamp(createDta)
o.deleteTable()
while tmpDate > tmpNewestDate :
#dateを文字列に変換
print(tmpDate)
dateStr = tmpDate.strftime('%Y%m%d')
o.insertStockData(dateStr)
tmpDate = workdays.workday(tmpDate,1,holidayList)
ローカルに落とした過去のCSVファイルをDBに登録する関数。
祝日一覧を途中で作成しているが、これはworkdays関数で必要なため。
面倒なのでモジュールはのせていないが、workdays関数で読み込める形で祝日のCSVを作ればいい。
最初の日付は所有しているCSVの最初の日付。
今加入したのなら2020/1/4とかになるはず。
download_StockData_Daily.py
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '../../localData'))
sys.path.append(os.path.join(os.path.dirname(__file__), '../database_module'))
#import localData as A
import kabu_plus_download as kd
import kabu_plus_read as kr
import operationTool as o
#当日のデータをダウンロード
kd.downloadNewPrices2()
kd.downloadNewStockData()
#ダウンロードしたデータの読み込み
newStockData = kr.getNewStockData()
newPrices2 = kr.getNewPrices2()
mergeData = kr.mergePrices2AndStockData(newPrices2,newStockData)
#ダウンロードしたデータがDBにあるか確認
#適当に最初の1行と日付を取得
firstRow = mergeData.head(1)
downloadDate = firstRow['Timestamp'].iloc[-1]
#同じデータがあるか(空か)確認
if o.searchTableStockAndDate("0001",downloadDate).empty :
#空=同じデータがない場合、DBへ追加の処理を行う
o.insertStockData(mergeData)
新規のCSVをダウンロードして、データを読み込み、DBに新規追加する関数。
基本的には作成したモジュールを呼び出すだけだが、重複して登録されないように0001(日経平均)のデータだけ確認して、同じデータがないか確認している。
3.自動化の流れ
基本的な流れは下記。
①初期データとして公式からデータをローカルにダウンロード
②それをDBに登録
③日々の更新データを取得してDBに登録まで自動化
あまり大したことではないが、解説してく。
①初期データとして公式からデータをローカルにダウンロード
今回作ったプログラムにダウンロード機能もあるが、公式から自作スクリプトを用いたダウンロードは禁止されており、
過去のCSVを取得するには公式のスクリプトを使用するしかない。
基本的には公式を参照にダウンロードすればよい。
ただし、デフォの設定だとダウンロードされないフォルダがあるので、コメントアウトを解除しておくこと。
また今回の手法だと以後公式のダウンロードスクリプトを使用する必要はないが、DB消しちゃったりした際に戻せなくなるので、月末とかでいいので定期的にダウンロードはしたほうがいい。
その他、今回のプログラムで使用しないデータが欲しい場合も同様に定期的に公式スクリプトでのダウンロード推奨。
②それをDBに登録
ここから作ったプログラムの出番。
exe_program配下のfirst_insert_DB.pyを実行。
$ python3 first_insert_DB.py
firstDate = datetime(2018,1,4)の個所は①でダウンロードできた最も古いデータの日付を設定。
holidayList = t.getHolidayList(holidayPath)は祝日の日付ファイルを取得してる。
国のHPとかにデータがあったはずだからそこからデータをコピーしてcsvを作成、読み込ませればいい。
上記コマンドが終了した時点でDBの作成は終了。
念のためデータがちゃんと入ったか確認しておく。
operationTool.pyにDB検索関数があるから適当に実行してデータが出力されるかを確認する。
下記をfirst_insert_DB.pyの最後に追記でもしておけば登録と同時に確認ができる。
ちなみにトヨタの株価データが出力されるはず。
print(o.searchTableStock(7203))
③日々の更新データを取得してDBに登録まで自動化
download_StockData_Daily.pyを適当な時間に実行すれば新規分のデータ取得から登録までできる。
ただKABU+の更新の時間もあるため16:30?以降での実施が必要。
自動実行のやり方は好きにしてくれていいが、linuxなのでcronを使用。
$ crontab -e
一番下に下記を追記。
環境独自の所は適当に編集。
30 16 * * 1-5 python3 /ソースコードまでの絶対パス/download_StockData_Daily.py
自分の場合は祝日ファイルと合わせて平日のみ実行、実行ファイルはshにしてpython実行コマンドはshに記載にしている。
上記だと祝日も実行されてしまうが、データがDBにある場合はDBに新規追加しないようになっているので祝日に実施しても問題はないはず。
4.まとめ
これで日々のデータ取得が楽になる。
更新プログラムの後に次の日のサインを出すプログラムを走らせたりすると、
絞られた銘柄群のみを見るだけになるので非常に日々の負荷が減る。
KABU+の場合、簡単なファンダメンタルデータも含まれているため、そこも含めてサイン自動化とかしたいならそれなりに有用かもしれない。
あとはトレードで勝てればいうことなしだが。。。。
コメントを残す