2017年1月18日 星期三

用 Python pandas_datareader 抓台灣股價

Using Python pandas_datareader get Taiwan Stock Price

在網路上看到之前的 pandas.io 已經分出來成為獨立的 package 叫 pandas_datareader

所以以後

from pandas.io import data, wb

要變成

from pandas_datareader import data, wb

用 pandas_datareader 的好處是不用自己去看 csv 或是研究 Yahoo 或 Google 的 API 了,

而且 pandas_datareader 的回傳值就已經是 pandas 的 dataframe 或 panel, 很方便。

還有可以抓世界銀行的一些經濟數據,但留著下次研究。

In [1]:
import pandas as pd
import pandas_datareader.data as web
import datetime
In [2]:
# 用 yahoo finance 
start = datetime.datetime(2016, 9, 1)
end = datetime.datetime(2017, 1, 10)
# 台灣股市的話要用 股票代號 加上 .TW
df_2330 = web.DataReader('2330.TW', 'yahoo', start, end)
In [3]:
df_2330.tail(5)
Out[3]:
Open High Low Close Volume Adj Close
Date
2017-01-04 183.0 184.0 181.5 183.0 24369000 183.0
2017-01-05 182.0 183.5 181.5 183.5 20979000 183.5
2017-01-06 184.0 184.5 183.5 184.0 22443000 184.0
2017-01-09 184.0 185.0 183.0 184.0 18569000 184.0
2017-01-10 184.5 185.5 183.5 184.0 20198000 184.0
In [4]:
# 也可以同時抓多檔股票,但回傳的是 pandas panel 要注意
df_stock = web.DataReader(['2330.TW', '0050.TW', '2412.TW'], 'yahoo', start, end)
In [5]:
df_stock
Out[5]:
<class 'pandas.core.panel.Panel'>
Dimensions: 6 (items) x 94 (major_axis) x 3 (minor_axis)
Items axis: Open to Adj Close
Major_axis axis: 2016-09-01 00:00:00 to 2017-01-10 00:00:00
Minor_axis axis: 0050.TW to 2412.TW
In [6]:
df_stock[:,:,'2330.TW'].tail(5)
Out[6]:
Open High Low Close Volume Adj Close
Date
2017-01-04 183.0 184.0 181.5 183.0 24369000.0 183.0
2017-01-05 182.0 183.5 181.5 183.5 20979000.0 183.5
2017-01-06 184.0 184.5 183.5 184.0 22443000.0 184.0
2017-01-09 184.0 185.0 183.0 184.0 18569000.0 184.0
2017-01-10 184.5 185.5 183.5 184.0 20198000.0 184.0
In [7]:
df_stock[:,:,'0050.TW'].tail(5)
Out[7]:
Open High Low Close Volume Adj Close
Date
2017-01-04 72.00 72.10 71.75 71.85 4278000.0 71.85
2017-01-05 71.85 72.50 71.80 72.50 4566000.0 72.50
2017-01-06 72.45 72.75 72.45 72.65 3746000.0 72.65
2017-01-09 72.75 72.95 72.30 72.45 5032000.0 72.45
2017-01-10 72.45 72.60 72.40 72.40 1854000.0 72.40