在技術分析,或是籌碼分析的流派中,其中有流派是會用成交量和 K 線一起看,然後進行股票進出的判斷。
大盤的成交量資料,也可以在台灣證交所網站上看到。
下載的地方和前面一樣,date 換成今天的 yyyyMMdd 即可。而中文版的 csv 檔不意外的又是 big5 編碼,真心建議使用英文版的資料,選擇 utf8 ,會讓你省下很多時間。
台灣證交所-成交資訊畫面
我們需要的欄位 [日期] [成交金額] [加權指數] [漲跌點數]。
不過,實際下載的是英文 csv,相對應的欄位是 [Date], [Trade Value], [TAIEX], [Change]
宣告台股加權指數量能的 Data Model
import Foundation
struct TwMarketTradingInfo: Hashable {
let date: Date
let tradeVolumeString: String
let tradeValueString: String
let transactionString: String
let taiexString: String
let changeString: String
}
參考之前下載 Manager 的程式碼,就可以完成了
import Foundation
// https://www.twse.com.tw/en/exchangeReport/FMTQIK?response=csv&date=20210910
// 證交所 https://www.twse.com.tw/en/page/trading/exchange/FMTQIK.html
class TwMarketTradingInfoManager {
private var dateUtility: DateUtility {
return DateUtility()
}
private lazy var alamofireAdapter: AlamofireAdapter = {
return AlamofireAdapter()
}()
func requestTwMarketDailyTradingInfo(date: Date, completion: @escaping (([TwMarketTradingInfo], Error?) -> Void)) {
let format = "yyyyMMdd"
let string = dateUtility.getString(date: date, format: format)
let urlString = "https://www.twse.com.tw/en/exchangeReport/FMTQIK?response=csv&date=\(string)"
alamofireAdapter.requestForString(urlString, method: .get) { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let string):
let tradingInfoDataSet = self.convertToTwMarketTradingInfo(string)
completion(tradingInfoDataSet, nil)
case .failure(let error):
completion([], error)
}
}
}
private func convertToTwMarketTradingInfo(_ string: String) -> [TwMarketTradingInfo] {
var dataSet = [TwMarketTradingInfo]()
let trimmedString = trimmedFirstLine(string)
if let csv = try? CSVAdapter(rawString: trimmedString) {
for each in csv.namedRows {
let dateString = each["Date"] ?? ""
let tradeVolume = each["Trade Volume"] ?? ""
let tradeValue = each["Trade Value"] ?? ""
let transaction = each["Transaction"] ?? ""
let taiex = each["TAIEX"] ?? ""
let change = each["Change"] ?? ""
if let date = dateUtility.getDate(from: dateString, format: "yyyy/MM/dd") {
// 這一份資料的最後面有 remarks 欄位,所以我們只拿轉得成 date 的資料
let info = TwMarketTradingInfo(
date: date,
tradeVolumeString: tradeVolume,
tradeValueString: tradeValue,
transactionString: transaction,
taiexString: taiex,
changeString: change)
dataSet.append(info)
}
}
}
return dataSet
}
private func trimmedFirstLine(_ string: String) -> String {
return CSVAdapter.removeLine(string, at: 1)
}
}