SwiftYFinanceで株価を取得し手チャートに表示してみる

SwiftYFinance

SwiftYFinanceはYahooFinanceをスクレイピングして指定された銘柄の情報を返してくれるフレームワークです。

以下のような形で帰ってきますが今回は簡易的に寄り付きの価格で過去100日間の値を取得してチャート表示をしてみました。

struct StockChartData{
    var date: Date?
    var volume: Int?
    var open: Float?
    var close: Float?
    var adjclose: Float?
    var low: Float?
    var high: Float?
}

コード

import SwiftUI
import SwiftYFinance
import Charts

struct StockData: Identifiable {
    var id = UUID()
    var date: Date
    var value: Float
}

struct ContentView: View {
    @State private var stockData: [StockData] = []
    @State private var highestPrice: Int = 0
    
    let startDate = Calendar.current.date(byAdding: .day, value: -100, to: Date()) ?? Date()
    let endDate = Date()
    
    var body: some View {
        Chart {
            ForEach(stockData) {
                LineMark(
                    x: .value("日時", $0.date, unit: .day, calendar: .autoupdatingCurrent),
                    y: .value("株価", $0.value)
                )
                .foregroundStyle(.blue)
            }
        }
        .frame(height: 250)
        .chartXScale(domain: startDate ... endDate)
        .chartYScale(domain: 0 ... highestPrice)
        .task {
            fetchStockData()
        }
    }
    
    func fetchStockData() {
        SwiftYFinance.chartDataBy(
            identifier: "5246.T",
            start: startDate,
            end: endDate){
                data, error in
                
                if error != nil {
                    return
                }
                
                guard var data = data else {
                    return
                }
                
                stockData = data.compactMap{ .init(date: $0.date!, value: $0.open!)}
                data.sort(by: { a, b -> Bool in
                    return Int(a.open ?? 0) > Int(b.open ?? 0)
                })
                highestPrice = Int(data.first?.open ?? 0)
        }
    }
}

#Preview {
    ContentView()
}

株価を取得するAPIは有料のものが多いので無料で提供されてるのはありがたい🙏