株価をスクレイピングして、グラフ表示する。 いろいろググって、やっと収まった。

プログラムを2つに分けて

(1)データ取得編
Yahoo financeから「安川電機:6506」の2016/4/1-2017/5/1 の株価をGet


(2)グラフ化編
CSVに落としたデータを成形してグラフ化


(1)データ取得編
stockDataGet.py
最初のSSL 2行は、Yahoo Webでの SSLでつまずいたので入れた。

# -*- coding: utf-8 -*-
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

from bs4 import BeautifulSoup
import urllib2
import time
import numpy as np
import pandas as pd

page_num = 90 #適当に多めのページ数
stock_temp = []

# Code
# 6506.T : yasukawa 

for i in range(page_num):
   url = "https://info.finance.yahoo.co.jp/history/?code=6506.T&sy=2016&sm=4&sd=1&ey=
2017&em=5&ed=1&tm=d&p=" + str(i+1)

   html = urllib2.urlopen(url)
   soup = BeautifulSoup(html,"lxml")

   table = soup.find_all("table",{"class":"boardFin yjSt marB6"})[0]
   stock_extract = [value.get_text() for value in table.find_all("td")]
   stock_temp.extend(stock_extract)

   time.sleep(0.4)

stock_temp = np.array(stock_temp)

stock = stock_temp.reshape(int(len(stock_temp)/7), 7) #取得データは7項目
stock = pd.DataFrame(stock[:,1:8],index=stock[:,0])
#stock = pd.DataFrame(stock[:,1:8],columns=["date","start","high","low","end","volumn
s","adjusted"], index=stock[:,0])

# 取得した株価データのカンマ , を外す作業。ほんとに必要?
for i in range(6):
   stock.ix[:,i] = stock.ix[:,i].astype(str)
   stock.ix[:,i] = stock.ix[:,i].str.replace(",","").astype(float)

# Save to csv file.
stock.to_csv('stock_yasukawa.csv',encoding='UTF-8')



(2)グラフ化編
つぎに、入手した株価データをグラフ化する

stockAnalyse.py 

# -*- coding: utf-8 -*-
 
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.finance as mpf
from matplotlib.dates import date2num

fig = plt.figure()
ax = plt.subplot()

# indexとして使う日付を、matplotlib.finance.candlestick_ohlc関数で使えるようにtype変換する
# 日本語がなければ、pandas.read_csv の parse_dates で変換できたそうだ。
# Japanese date (string) -> Timestamp date
fmt='%Y年%m月%d日'
my_parser=lambda date: pd.datetime.strptime(date,fmt)
df=pd.read_csv('stock_yasukawa.csv',index_col=0,parse_dates=0,date_parser=my_parser)
df=df.sort_index(ascending=True)

# mpf.candlestick_ohlc use "datetime"
xdate = [x.date() for x in df.index]  # Timestamp -> datetime
ohlc = np.vstack((date2num(xdate),df.values.T)).T
mpf.candlestick_ohlc(ax,ohlc,width=0.7,colorup='g',colordown='r')

ax.grid()
ax.set_xlim(df.index[0].date(),df.index[-1].date())  # range of X-axis
fig.autofmt_xdate()

plt.show()


取り敢えずグラフ化できた。

★お世話になったページ
pandasで様々な日付フォーマットを取り扱う
Pythonでローソク足チャートの表示(matplotlib編)