[Python] 股價查詢

程式語言:Python
Package:
requests
time
logging
Alpha Vantage 官網
台灣證券交易所-基本市況報導

功能:股價查詢

Alpha Vantage (美股為主)
請先申請 API Key
API 說明
股票代碼,其他國家可嘗試加上後繏,例:0050.TW,但不一定有資料
使用方法
a = AlphaVantage(api_key="your key")
a.intraday('VTI', '1min')
a.daily('VTI')
a.daily_adj('VTI')
a.weekly('VTI')
a.weekly_adj('VTI')
a.monthly('VTI')
a.monthly_adj('VTI')
a.batch_quotes('VTI, VBR')
程式碼
  1. import requests
  2. import time
  3. import logging
  4.  
  5.  
  6. class AlphaVantage:
  7. def __init__(self, api_key):
  8. """
  9. api_key: 申請網址:https://www.alphavantage.co/support/#api-key
  10. """
  11. self.api_key = api_key
  12. self.logger = logging.getLogger(self.__class__.__name__)
  13. def _api(self, func, **params):
  14. """Return data
  15. func: alphaVantage 的 API
  16. params: API 的相關參數
  17. """
  18. url = "https://www.alphavantage.co/query"
  19. headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; rv:57.0) Gecko/20100101 Firefox/57.0",
  20. }
  21. baseParams = {"function": func,
  22. "apikey": self.api_key,
  23. "datatype": "json"}
  24. params = {**baseParams, **params}
  25. r = requests.get(url, params=params, headers=headers)
  26. data = r.json()
  27. if "Error Message" in data:
  28. self.logger.debug('{} error => url: {}'.format(func, r.url))
  29. return None
  30. elif len(data) < 2:
  31. self.logger.debug('{} error => url: {}'.format(func, r.url))
  32. # AlphaVantage 有限定 1s 一次
  33. time.sleep(1)
  34. return self._api(func, **params)
  35. return data
  36.  
  37.  
  38. def intraday(self, symbol, interval, **params):
  39. """Return data
  40. https://www.alphavantage.co/documentation/#intraday
  41. symbol: 股票代碼,其他國家可嘗試加上後繏,例:0050.TW,但不一定有資料
  42. interval: 間隔時間 (1min, 5min, 15min, 30min, 60min)
  43. params: 其他相關參數
  44. """
  45. return self._api("TIME_SERIES_INTRADAY", symbol=symbol, interval=interval, **params)
  46.  
  47.  
  48. def daily(self, symbol, **params):
  49. """Return data
  50. https://www.alphavantage.co/documentation/#daily
  51. symbol: 股票代碼,其他國家可嘗試加上後繏,例:0050.TW,但不一定有資料
  52. params: 其他相關參數
  53. """
  54. return self._api("TIME_SERIES_DAILY", symbol=symbol, **params)
  55. def daily_adj(self, symbol, **params):
  56. """Return data
  57. https://www.alphavantage.co/documentation/#dailyadj
  58. symbol: 股票代碼,其他國家可嘗試加上後繏,例:0050.TW,但不一定有資料
  59. params: 其他相關參數
  60. """
  61. return self._api("TIME_SERIES_DAILY_ADJUSTED", symbol=symbol, **params)
  62.  
  63. def weekly(self, symbol, **params):
  64. """Return data
  65. https://www.alphavantage.co/documentation/#weekly
  66. symbol: 股票代碼,其他國家可嘗試加上後繏,例:0050.TW,但不一定有資料
  67. params: 其他相關參數
  68. """
  69. return self._api("TIME_SERIES_WEEKLY", symbol=symbol, **params)
  70. def weekly_adj(self, symbol, **params):
  71. """Return data
  72. https://www.alphavantage.co/documentation/#weeklyadj
  73. symbol: 股票代碼,其他國家可嘗試加上後繏,例:0050.TW,但不一定有資料
  74. params: 其他相關參數
  75. """
  76. return self._api("TIME_SERIES_WEEKLY_ADJUSTED", symbol=symbol, **params)
  77. def monthly(self, symbol, **params):
  78. """Return data
  79. https://www.alphavantage.co/documentation/#monthly
  80. symbol: 股票代碼,其他國家可嘗試加上後繏,例:0050.TW,但不一定有資料
  81. params: 其他相關參數
  82. """
  83. return self._api("TIME_SERIES_MONTHLY", symbol=symbol, **params)
  84. def monthly_adj(self, symbol, **params):
  85. """Return data
  86. https://www.alphavantage.co/documentation/#monthlyadj
  87. symbol: 股票代碼,其他國家可嘗試加上後繏,例:0050.TW,但不一定有資料
  88. params: 其他相關參數
  89. """
  90. return self._api("TIME_SERIES_MONTHLY_ADJUSTED", symbol=symbol, **params)
  91. def batch_quotes(self, symbols, **params):
  92. """Return data
  93. https://www.alphavantage.co/documentation/#batchquotes
  94. symbols: 所有股票的代碼,只支援美股
  95. params: 其他相關參數
  96. """
  97. return self._api("BATCH_STOCK_QUOTES", symbols=symbols, **params)
台灣證券交易所 (台股)
symbol: 股票代碼,上市後繏 .TW,上櫃後繏 .TWO
使用方法
t = TWSE()
t.real_time('0050.TW')
t.real_time('1258.TWO')
程式碼
  1. import requests
  2. import time
  3. import logging
  4.  
  5. class TWSE:
  6. def __init__(self):
  7. self.logger = logging.getLogger(self.__class__.__name__)
  8. self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; rv:57.0) Gecko/20100101 Firefox/57.0",
  9. "Connection": "keep-alive",
  10. }
  11. url = 'http://mis.twse.com.tw/stock/fibest.jsp'
  12. r = requests.get(url, headers=self.headers)
  13. self.cookies = r.cookies
  14. def _rename(self, symbol):
  15. """Return quote symbol name
  16. symbol 命名規則 上市或上櫃_股票代號.Channel,例:tse_0050.tw
  17. 上市/上櫃,tse/otc
  18. """
  19. symbol = symbol.upper()
  20. try:
  21. symbol, kind = symbol.split(".", 1)
  22. if kind == "TWO":
  23. return "otc_{}.tw".format(symbol)
  24. except ValueError:
  25. pass
  26.  
  27. return "tse_{}.tw".format(symbol)
  28. def real_time(self, symbol):
  29. """Return real-time price
  30. https://github.com/Asoul/tsrtc
  31. symbol: 股票代碼,上市後繏 .TW,上櫃後繏 .TWO
  32. """
  33. symbol = self._rename(symbol)
  34. url = "http://mis.twse.com.tw/stock/api/getStockInfo.jsp"
  35. millis = int(round(time.time() * 1000))
  36. params = {"ex_ch": symbol,
  37. "_": millis,
  38. "json": 1,
  39. "delay": 0,
  40. }
  41. r = requests.get(url, params=params, headers=self.headers, cookies=self.cookies)
  42. data = r.json()
  43. return data['msgArray']

參考

台灣股票即時爬蟲。Taiwan Stock Exchange Real Time Crawler

留言