在技术分析,或是筹码分析的流派中,其中有流派是会用成交量和 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)
}
}
<<: Flutter体验 Day 23-WebSocket
存放题目和读取题目的google 试算表搞定了 呈现题目的google 表单也搞定了 接下来来说说记...
嗨大家好~我是凯西!接下来是我开学的三十天实力增进计画的纪录 规划上会刷leetcode加强我的py...
延续昨天的内容,今天我们要完成写入&读取的功能 将信件内容写入到 Google Sheet ...
今天要介绍 TypeScript 的基本型别,TypeScript 跟 JavaScript 一样拥...
现在要来处理上一篇文章的红框部分,输入N个np.arange让他跑for loop。今天在网路上看了...