下載證交所交易歷史資料

Bash 命令稿

#!/Bash/bash STOCK_FILE_PATH=./data function GetStockQuoteByDate { local STOCK_YEAR=`echo $1 | cut -d - -f 1` local STOCK_MONTH=`echo $1 | cut -d - -f 2` local STOCK_DAY=`echo $1 | cut -d - -f 3` local STOCK_DATE=`expr $STOCK_YEAR - 1911`/$STOCK_MONTH/$STOCK_DAY local STOCK_FILE=$2-$STOCK_YEAR$STOCK_MONTH$STOCK_DAY.csv local STOCK_URL=http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/MI_INDEX.php local URL_POST_STRING="download=csv&selectType=$STOCK_TYPE&qdate=$STOCK_DATE" wget --post-data $URL_POST_STRING -O $STOCK_FILE_PATH/$STOCK_FILE $STOCK_URL } function GetStockQuoteByMonth { local STOCK_DATE_BEGIN=$1 for i in `seq 1 31`; do local STOCK_MONTH=`echo $STOCK_DATE_BEGIN | cut -d - -f 2` local STOCK_DATE_NEXT=`/Bash/date -d "$STOCK_DATE_BEGIN 1day" +%Y-%m-%d` local STOCK_MONTH_NEXT=`echo $STOCK_DATE_NEXT | cut -d - -f 2` if [ "$STOCK_MONTH" -eq "$STOCK_MONTH_NEXT" ]; then GetStockQuoteByDate $STOCK_DATE_NEXT $2 STOCK_DATE_BEGIN=$STOCK_DATE_NEXT fi done } STOCK_DATE=2015-04-01 STOCK_TYPE=25 GetStockQuoteByMonth $STOCK_DATE $STOCK_TYPE

程式碼

# -*- coding: utf-8 -*- import os import requests import calendar import datetime class StockQuote: stockURL = 'http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/MI_INDEX.php' stockType = { u'大盤統計資訊': 'MS', u'委託及成交統計資訊': 'MS2', u'全部': 'ALL', u'全部(不含權證、牛熊證、可展延牛熊證)': 'ALLBUT0999', u'封閉式基金': '0049', u'ETF': '0099P', u'受益證券': '019919T', u'認購權證(不含牛證)': '0999', u'認售權證(不含熊證)': '0999P', u'牛證': '0999C', u'熊證': '0999B', u'可展延牛證': '0999X', u'可展延熊證': '0999Y', u'附認股權特別股': '0999GA', u'附認股權公司債': '0999GD', u'認股權憑證': '0999G9', u'可轉換公司債': 'CB', u'水泥工業': '01', u'食品工業': '02', u'塑膠工業': '03', u'紡織纖維': '04', u'電機機械': '05', u'電器電纜': '06', u'化學生技醫療': '07', u'玻璃陶瓷': '08', u'造紙工業': '09', u'鋼鐵工業': '10', u'橡膠工業': '11', u'汽車工業': '12', u'電子工業': '13', u'建材營造': '14', u'航運業': '15', u'觀光事業': '16', u'金融保險': '17', u'貿易百貨': '18', u'綜合': '19', u'其他': '20', u'化學工業': '21', u'生技醫療業': '22', u'油電燃氣業': '23', u'半導體業': '24', u'電腦及週邊設備業': '25', u'光電業': '26', u'通信網路業': '27', u'電子零組件業': '28', u'電子通路業': '29', u'資訊服務業': '30', u'其他電子業': '31', u'存託憑證': '9299' } fileFolder = '' def __init__(self, fileFolder='.'): self.fileFolder = fileFolder def getStockType(self, nameStockType): return self.stockType[nameStockType] def getCSVByDate(self, catName, tradeY, tradeM, tradeD): stockDate = datetime.date(tradeY, tradeM, tradeD) today = datetime.date.today() if (stockDate <= today): if stockDate.weekday() in [0, 6]: print u'周末日期: %s (%d)' % (stockDate, stockDate.weekday()) else: urlPostData = { 'download': 'csv', 'selectType': catName, 'qdate': '%03d/%02d/%02d' % (tradeY - 1911, tradeM, tradeD) } urlResponse = requests.post(url=self.stockURL, data=urlPostData) csvFileName = '%s/%s-%04d%02d%02d.csv' % (self.fileFolder, catName, tradeY, tradeM, tradeD) print csvFileName with open(csvFileName, 'wb') as f: for chunk in urlResponse.iter_content(chunk_size=1024): if chunk: f.write(chunk) f.flush() os.fsync(f) else: print u'未來日期: %s' % (stockDate) def getCSVByDate2(self, catName, tradeDate): (tradeY, tradeM, tradeD) = (tradeDate.year, tradeDate.month, tradeDate.day) stockDate = datetime.date(tradeY, tradeM, tradeD) today = datetime.date.today() if (stockDate <= today): if stockDate.weekday() in [0, 6]: print u'周末日期: %s (%d)' % (stockDate, stockDate.weekday()) else: self.getCSVByDate(catName, tradeY, tradeM, tradeD) else: print u'未來日期: %s' % (stockDate) def getCSVBetweenDates(self, catName, tradeDate_from, tradeDate_to): today = datetime.date.today() for day in range(0, (tradeDate_to - tradeDate_from).days): stockDate = tradeDate_from + datetime.timedelta(days=day) if (stockDate <= today) and (stockDate.weekday() not in [0, 6]): self.getCSVByDate2(catName, stockDate) def getCSVByMonth(self, catName, tradeY, tradeM): (weekdayOfFirstDay, lastDay) = calendar.monthrange(tradeY, tradeM) for tradeD in range(1, lastDay + 1): self.getCSVByDate(catName, tradeY, tradeM, tradeD) def getCSVByYear(self, catName, tradeY): for tradeM in range(1, 13): self.getCSVByMonth(catName, tradeY, tradeM) if __name__ == '__main__': fileFolder = './data' stockQuote = StockQuote(fileFolder) jobTask = [False, False, True, False] catName = stockQuote.getStockType(u'電腦及週邊設備業') tradeY_from = 2015 tradeM_from = 1 tradeD_from = 1 tradeY_to = 2015 tradeM_to = 1 tradeD_to = 31 if jobTask[0]: stockDate_from = datetime.date(tradeY_from, tradeM_from, tradeD_from) stockQuote.getCSVByDate2(catName, stockDate_from) if jobTask[1]: stockDate_from = datetime.date(tradeY_from, tradeM_from, tradeD_from) stockDate_to = datetime.date(tradeY_to, tradeM_to, tradeD_to) stockQuote.getCSVBetweenDates(catName, stockDate_from, stockDate_to) if jobTask[2]: stockQuote.getCSVByMonth(catName, tradeY_from, tradeM_from) if jobTask[3]: stockQuote.getCSVByYear(catName, tradeY_from)