前回の内容
前回は、 KABU+ を契約してCSVを取得するところまでやった。
how-to-make-stock-trading-system.dogwood008.com
今回の内容
取得したCSVには、調整後終値が入っていない。これを入れる戦略を考える。
調整後終値とは
調整後終値とは、過去に「株式併合」「株式分割」が発生していたとしても、1株あたりの価値を過去と今で比較できるように、「当時併合・分割していたら、現在の価値に換算するといくら」を計算した終値のことである。
株式併合・株式分割とは
株式は、「株式併合」「株式分割」により、ある日を境にそれまで持っていた株数が一定の定められた割合数分に変化する。
なお、株数が変わっても、1株あたりの価値もその株数の逆数倍になるので、「単価*株数=評価額」は、分割/併合の前後で理論上は変わらない。 (実際には、需要と供給のバランスによって、分割併合前より安くなったり高くなったりする)
株式併合であれば、減る方向に変化する。例えば1000株が1/10倍の100株になり、理論上は株価は10倍になる。一方、株式分割であれば、例えば100株が10倍の1000株になり、理論上は株価は1/10倍になる。
戦略・アイデアメモ
この調整後終値を算出するため、下記の情報が必要になる。
- 株式分割・併合の年月日
- 分割・併合前後の換算比率
これらを掲載しているWebページに、auカブコム証券がある。
実体のJSを直接読みに行くのは、あまり行儀が良いとは言えないと考える1。なので、Webページを Chrome で表示させ、その内容をローカルに保存し、そのファイルをスクレイピングすることにする。
まずは、HTML を DataFrame に変換するところまで
コードは見た目やコメントを整えていないが、一旦動作させることができたので、参考のために貼っておく。後日解説を入れたり、整えたりする予定。
heigou.py
# heigou.py import pandas as pd from bs4 import BeautifulSoup html = open('heigou.html').read() soup = BeautifulSoup(html, 'html.parser') table = soup.find('table', {'class': 'tbl01'}) rows = table.findAll('tr') csv = [ [cell.get_text() for cell in row.findAll(['td', 'th'])] for row in rows ] pd.DataFrame(csv) df = pd.DataFrame(csv, columns=csv.pop(0)) df = df.set_index(['効力発生日', '銘柄コード']) df
出力
-
管理しやすくするためにファイルの実体を切り離している説、機械的に高頻度クロールさせたくない説があると考えている。主に後者への配慮として、ローカル保存を経由している。↩