iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
Mobile Development

使用 Swift 和公開資訊,打造投資理財的 Apps系列 第 22

D21 - 用 Swift 和公開資訊,打造投資理財的 Apps { 台股成交量實作.1 }

  • 分享至 

  • xImage
  •  

在技術分析,或是籌碼分析的流派中,其中有流派是會用成交量和 K 線一起看,然後進行股票進出的判斷。

大盤的成交量資料,也可以在台灣證交所網站上看到。

https://ithelp.ithome.com.tw/upload/images/20210930/20140622TJWbBV0AON.png

下載的地方和前面一樣,date 換成今天的 yyyyMMdd 即可。而中文版的 csv 檔不意外的又是 big5 編碼,真心建議使用英文版的資料,選擇 utf8 ,會讓你省下很多時間。

https://ithelp.ithome.com.tw/upload/images/20210930/20140622iu2jK72baT.png

台灣證交所-成交資訊畫面

我們需要的欄位 [日期] [成交金額] [加權指數] [漲跌點數]。

不過,實際下載的是英文 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)
    }
}

上一篇
D20 - 用 Swift 和公開資訊,打造投資理財的 Apps { 移動平均線(MA線)實作.3 }
下一篇
D22 - 用 Swift 和公開資訊,打造投資理財的 Apps { 台股成交量實作.2 }
系列文
使用 Swift 和公開資訊,打造投資理財的 Apps37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言