傳說中,股票交易會從三個面向作分析: 技術面、籌碼面、基本面。以量化程式交易來說,技術面就是透過券商API取得即時資料與歷史資料,轉換成K棒做技術分析;籌碼面是透過買賣日報取得分點資料作分析;基本面則是透過臺灣證券交易所與證券櫃檯買賣中心OpenAPI取得公司治理與財務報表等資料進行分析。
本篇主要介紹如何利用OpenAPI取得相關資料。這邊用一個簡單的例子當作範例,來取得目前上市與上櫃的股票代碼。當開發量化交易程式的時候,我們會發現上市上櫃股票家數不宜寫死,因為隨時有新的公司上市上櫃,也會有下市下櫃的狀況發生,所以最好是透過一個隨時更新的表格做後續處理。至於如何取得現有的上市上櫃股票代碼,我們可以利用臺灣證券交易所與證券櫃檯買賣中心OpenAPI。
臺灣證券交易所OpenAPI的網址為https://openapi.twse.com.tw/
證券櫃檯買賣中心OpenAPI的網址為https://www.tpex.org.tw/openapi/
讀者可以點進這兩個網址挑選喜歡的功能來做其他功能的開發。因為筆者習慣把這些資料都轉為csv格式,所以我們會透過CsvHelper與Newtonsoft.Json將網站丟進來的Json格式轉換為csv格式。實際的流程也很簡單,對OpenAPI的網誌發起要求,將收到的資料做格式轉化,實際程式碼如下所示:
private async Task GetAllTWSEStockInfo(string path)
{
string reqtwse = "https://openapi.twse.com.tw/v1/exchangeReport/BWIBBU_d";
string csvtwse = await GetHttpData(reqtwse);
//Debug.WriteLine(csv);
File.WriteAllText(path, csvtwse);
}
private async Task GetAllTPEXStockInfo(string path)
{
string reqtpex = "https://www.tpex.org.tw/openapi/v1/tpex_mainboard_peratio_analysis";
string csvtpex = await GetHttpData(reqtpex);
//Debug.WriteLine(csv);
File.WriteAllText(path, csvtpex);
}
private async Task<string> GetHttpData(string weblink)
{
HttpClientHandler handler = new HttpClientHandler();
handler.UseDefaultCredentials = true;
HttpClient client = new HttpClient(handler);
try
{
HttpResponseMessage response = await client.GetAsync(weblink);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
string csv = jsonToCSV(responseBody, ",");
return csv;
}
catch (HttpRequestException e)
{
Debug.WriteLine("Exception Caught! Message :{0} ", e.Message);
return null;
}
}
private static DataTable jsonStringToTable(string jsonContent)
{
DataTable dt = JsonConvert.DeserializeObject<DataTable>(jsonContent);
return dt;
}
private static string jsonToCSV(string jsonContent, string delimiter)
{
StringWriter csvString = new StringWriter();
var configuration = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = delimiter,
MissingFieldFound = null
};
using (var csv = new CsvWriter(csvString, configuration))
{
using (var dt = jsonStringToTable(jsonContent))
{
foreach (DataColumn column in dt.Columns)
{
csv.WriteField(column.ColumnName);
}
csv.NextRecord();
foreach (DataRow row in dt.Rows)
{
for (var i = 0; i < dt.Columns.Count; i++)
{
csv.WriteField(row[i]);
}
csv.NextRecord();
}
}
}
return csvString.ToString();
}
這樣就完成了這段簡單的範例。至於不同的資料,如何進行分析,可以參考財報狗或是玩股網的資料格式,自己做個轉換。資料的收集與累積需要長時間的耐力進行,這也是資料庫分析可貴的地方,與大家共勉之。