SwiftでCSVが簡単に出力できる

GASで銘柄のスクリーニングや株価の分析をしている際に手入力で入れてくのがきついなと思っていたんですが、SwiftでCSVの出力が可能なのでSwiftYFinanceで銘柄の株価の動きを取得して作成したCSVをGoogle Driveに移動させて計算などができたので個人的なメモ

コード

iPO銘柄の分析をしたのでこんな感じに使っていた。

import SwiftUI
import SwiftYFinance
import Charts

struct ContentView: View {
    var body: some View {
        Text("TODO")
            .task {
                let stockData = await fetchStockData()
                saveCSV(stockData: stockData)
            }
    }
    
    func saveCSV(stockData: [[String]]) {
        // CSV文字列を生成
        var csvText = Constant.header.joined(separator: ",") + "\n" // ヘッダー行
        for row in stockData {
            csvText += row.joined(separator: ",") + "\n" // 各データ行
        }
        
        // ファイルの保存先パス
        let fileName = "output.csv"
        let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent(fileName)
        
        // CSVを保存
        do {
            try csvText.write(to: path, atomically: true, encoding: .utf8)
            print("😺CSV file saved at: \(path)")
        } catch {
            print("Failed to create file: \(error)")
        }
    }
    
    func fetchStockData() async -> [[String]] {
        var stocks: [[String]] = .init()
        
        for stock in Constant.ipo2021 {
            do {
                // `SwiftYFinance.chartDataBy`を非同期呼び出しに変換
                let data = try await fetchChartData(
                    identifier: "\(stock.code).T",
                    start: stock.startDate,
                    end: stock.endDate
                )
                
                // データを加工
                let value: [[String]] = data.compactMap {
                    guard let open = $0.open,
                          let close = $0.close,
                          let high = $0.high,
                          let low = $0.low else {
                        return []
                    }
                    return [open.description, close.description, high.description, low.description]
                }
                
                var resultValue = value.flatMap { $0 }
                resultValue.insert(stock.market.rawValue, at: 0)
                resultValue.insert(stock.code, at: 0)
                stocks.append(resultValue)
            } catch {
                print("エラー: \(error.localizedDescription)")
            }
        }
        
        return stocks
    }
    
    private func fetchChartData(identifier: String, start: Date, end: Date) async throws -> [StockChartData] {
        return try await withCheckedThrowingContinuation { continuation in
            SwiftYFinance.chartDataBy(identifier: identifier, start: start, end: end) { data, error in
                if let error = error {
                    continuation.resume(throwing: error)
                    return
                }
                
                guard let data = data else {
                    continuation.resume(throwing: NSError(domain: "DataError", code: -1, userInfo: nil))
                    return
                }
                
                continuation.resume(returning: data)
            }
        }
    }
}

失敗ログ

IPO銘柄を見ていく中で初日に下落していく銘柄がかなり多いなと感じました、実際どうなのかを新規上場会社情報を見て分析を行い実際にオープン価格で空売りをした場合平均して約65%程度の勝率があることがわかりました。

毎年100銘柄程度あるiPOで65%の確率で勝てたら億万長者だ!よし実行するぞ!と思ったんですがiPOは初日の空売りが禁止されているよでした、今までIPO触っていなかったので知らなかったんですが2023年から成り行き注文も制限がかかったようです。

IPOで当たった時にオープン価格で売り抜けるのは良い作戦何だなと実感しました、全然当たりませんが..

株を初めて5年程度経ちますがまだまだ知らないことがあるなぁと実感しました、αを求めて頑張るぞ💪