2017年5月29日 星期一

[JS] 用 NodeJS 製作記錄日間股價的csv檔(Yahoo Finance)

學習Node.JS 有兩個目標希望可以寫到的,一個是自己的後台程式可以按需要查詢自定的指標,二是在日間抓取 網上免費的「即時」股票報價 ( Intraday Data),儲存做本機上的數據庫。兩個需求都在過往星期有所進展,比較接近完成的是日間股價的數據庫。

這個數據庫的建立可以分為兩大部份,首先要可以定時提取數據源的財經數據,免費的當然要數Yahoo Finance,可以自行寫GET request 去用他「隱藏」的接口拿數據,(這是Yahoo Finance 的 CSV API,用Excel的話會用到這方法,它另外還有一套下載歷史股價的方法就好像在這次改版中失效了。以往Yahoo和Google都有股價的API,但似乎在逐漸放棄。原本Yahoo都有寫一些 License上不可 redistribute / commercial usage 的條款,但現在根本連這個功能的說明版面都找不到了)。另外也有現成的Node package,我就當然懶得 Reinvent the wheel,所以這方面就用現有的 node-yahoo-finance。雖然這個Yahoo的API可以有historical 和snapshot的數據,但免費數據一般都沒有即時更新,Snapshot固然一般有15分鐘滯後,所以一定要看Last-Trade-Time。Historical 的也可以留意到一些日子的Close 和ratio數據有點奇怪,引申到52周高低有點問題,大概免費的東西質量總是少點保證的,所以如果打算直接使用的話,一定要小心,不然類似出現 Fat Finger Error 就慘慘了 ( T_T ) ~~

Node package: yahoo-finance

今次的目的是想做一個 Intraday 的數據庫,讓之後可以有數據基礎去研究分析。因為會經過檢查,所以要求並不高。先安裝node-yahoo-finance:
$ npm install yahoo-finance --save

NPM - yahoo-finance
Github - pilwon/node-yahoo-finance
(留意Yahoo在改動原本的API接口 -16May2017,不過見一些常用的field依然可用。open-source的強大之處就是己經有高手去解決 26May2017,原來的snapshot() 功能將被棄用,由新的quotes()。historical() 聲稱不受影響。)

要知如何使用,最好先對Yahoo Finance的接口有點經驗。例如在網址上試試輸入:
http://download.finance.yahoo.com/d/quotes.csv?s=^HSI+0005.HK&f=nsl1t1opc1p2&e=.csv

2017年5月18日 星期四

[JS] Node.JS 開始使用 Express 和 Express-Generator

繼續之前的<Node.JS>記錄。開始了Node.JS的學習,當可以架設到一個簡單Server之後,在Coursera找了一個Node.JS的 Open Course (這應該有三個星期前了)。下一步就是用Express模組來建構同樣的伺服器端程序,Express是一個Node.js 的Web應用程式架構,方便創建各種Web應用、APIs等。今後就會用到它實現旳路由控制(Route),去代替之前要自行寫代碼解析URL中的的請求;用它對模板(Template)的支援,去更方便地回傳HTTP的內容。另外,還會多看幾個模組:Morgan、body-parser,這些稱為Middleware的東西。最後會用Express Generator去生成Express架構。

Express

首先,為你的新專案開啟一個新資料夾,cd到這個資料夾中:
$ npm init  //用npm init開始建立一個專案
$ npm install express --save  //安裝Express, 新增至相依關係清單

例子: server-1.js 。可以看到己經在使用app.get、res.send,去代替url的解析工作和內容顯示:
var express = require('express');
var app = express();

app.get('/', function (req, res) { //當收到 "/" 這個請求時,回應下面的 "Hello World!"
  res.send('Hello World!');
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

METHOD 可以使用的 GET, POST, PUT, DELETE 的作用好比: Read, Write, Append, Delete。
路由定義的結構:app.METHOD(PATH, HANDLER)。其中一種 app.all() 是所有的request都會被觸發,適合處理必需執行的部份。下面的例子中應用到。

2017年5月14日 星期日

生活周記:一級運動攀登;檔案研究(香港前途談判)

一級運動攀登 (07 May)

朋友報了攀總的一級運動攀登課程讓我頂上了,上星期就上了一晚理論課,和星期日一次朝九晚六的練習堂。上水這個攀石場在保榮路運動場,距離車站都有段距離,中午要找食飯的地方,最近要到清河邨或彩園邨的商場。攀石有三種路線,我們預了右邊六塊板的範圍,開了4線作課堂練習。