# SwiftYFinance **Repository Path**: mirrors_daimajia/SwiftYFinance ## Basic Information - **Project Name**: SwiftYFinance - **Description**: The best Yahoo Finance library with the power of Swift - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-10-22 - **Last Updated**: 2025-11-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SwiftYFinance [![Language](https://img.shields.io/github/languages/top/AlexRoar/SwiftYFinance)](https://cocoapods.org/pods/SwiftYFinance) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/AlexRoar/SwiftYFinance/Swift)](https://cocoapods.org/pods/SwiftYFinance) [![codecov](https://img.shields.io/codecov/c/github/AlexRoar/SwiftYFinance)](https://codecov.io/gh/AlexRoar/SwiftYFinance) [![CodeFactor](https://www.codefactor.io/repository/github/alexroar/swiftyfinance/badge)](https://www.codefactor.io/repository/github/alexroar/swiftyfinance) [![Version](https://img.shields.io/cocoapods/v/SwiftYFinance.svg?style=flat)](https://cocoapods.org/pods/SwiftYFinance) [![License](https://img.shields.io/cocoapods/l/SwiftYFinance.svg?style=flat)](https://cocoapods.org/pods/SwiftYFinance) [![Platform](https://img.shields.io/cocoapods/p/SwiftYFinance.svg?style=flat)](https://cocoapods.org/pods/SwiftYFinance) ## Example To run the example project, clone the repo, and run `pod install` from the Example directory first. Example project includes basic features demonstration.
*You asked about this beautiful chart in the preview gif: [AlexRoar/BeautyChart](https://github.com/AlexRoar/BeautyChart)* ## Requirements I used Swift 5.0 and backward compatibility is not guranteed. IOS 13+ ## Installation SwiftYFinance is available through [CocoaPods](https://cocoapods.org). To install it, simply add the following line to your Podfile and run `pod install`: ```ruby pod 'SwiftYFinance' ``` You can try Example project on your device by running: ```bash pod try SwiftYFinance ``` ## Basic Usage ### Search ```swift /* * Main class of SwiftYFinance. Asynchronous method's callback always will * have format: (Some Data?, Error?). If error is non-nil, then data is going to be nil. * Review Error description to find out what's wrong. * Synchronous API is also provided. The only difference is that it blocks the thread and * returns data rather than passing it to the callback. */ import SwiftYFinance // Searches quote in Yahoo finances and returns found results SwiftYFinance.fetchSearchDataBy(searchTerm:"AAPL", quotesCount=20) { data, error in /* callback: ([YFQuoteSearchResult]?, Error?) -> Void struct YFQuoteSearchResult{ var symbol: String? var shortname: String? var longname: String? var exchange: String? var assetType: String? } */ if error == nil{ return } print(data!.longname ?? "No long name") } ``` The same thing but synchronously: ```swift let (data, error) = SwiftYFinance.syncFetchSearchDataBy(searchTerm:"AAPL", quotesCount=20) if error == nil{ return } print(data!.longname ?? "No long name") ``` **Even though executing commands in the main thread synchronously is not the best practice, I added this feature to the project. It's on your account to write fast, non-freezing apps, so use synchronous methods wisely.** Search for news is also awailable through `fetchSearchDataBy(searchNews:String, ...)` ### Basic recent data Fetches the most recent data about identifier collecting basic information. ```swift SwiftYFinance.recentDataBy(identifier:"AAPL"){ data, error in /* data ~> struct RecentStockData{ var currency: String? var symbol: String? var exchangeName: String? var instrumentType: String? var firstTradeDate: Int? var regularMarketTime: Int? var gmtoffset: Int? var timezone: String? var exchangeTimezoneName: String? var regularMarketPrice: Float? var chartPreviousClose: Float? var previousClose: Float? var scale: Int? var priceHint: Int? } */ if error == nil{ return } print(data!.regularMarketPrice ?? "No regularMarketPrice") } ``` ### Chart data Fetches chart data points ```swift SwiftYFinance.chartDataBy( identifier:"AAPL", start: Date(...), end: Date(...), interval = .oneday){ data, error in /* data ~>[ struct StockChartData{ var date: Date? var volume: Int? var open: Float? var close: Float? var adjclose: Float? var low: Float? var high: Float? } ] */ if error == nil{ return } print(data![0]?.open ?? "Open price is unavailable") } ``` ### Chart data at moment Sometimes, you need to fetch data at some moment in the past. Use `chartDataBy(..., moment: Date, ...)` for that. ```swift SwiftYFinance.chartDataBy( identifier:"AAPL", moment: Date(...), futureMargin: TimeInterval(...) ){ data, error in /* data ~>[ struct StockChartData{ var date: Date? var volume: Int? var open: Float? var close: Float? var adjclose: Float? var low: Float? var high: Float? } ] */ if error == nil{ return } print(data![0]?.open ?? "Open price is unavailable") } ``` ### Identifier Summary This part of API is MASSIVE. Yahoo Finance has a lot of summary modules and I implemented several of them. Still, you can fetch data from raw JSON parameter. I will add new modules with every version. Currently, only essential modules are implemented. | Module | Support | Module | Support | |-----------------------------------|---------|-----------------------------------|---------| | calendarEvents | :white_check_mark: | recommendationTrend | :white_check_mark: | | summaryProfile | :white_check_mark: | quoteType | :white_check_mark: | | industryTrend | :white_check_mark: | price | :white_check_mark: | | summaryDetail | :white_check_mark: | incomeStatementHistoryQuarterly | :x: | | assetProfile | :x: | balanceSheetHistoryQuarterly | :x: | | incomeStatementHistory | :x: | cashFlowStatementHistory | :x: | | balanceSheetHistory | :x: | cashFlowStatementHistoryQuarterly | :x: | | financialData | :x: | secFilings | :x: | | upgradeDowngradeHistory | :x: | institutionOwnership | :x: | | fundOwnership | :x: | majorDirectHolders | :x: | | majorHoldersBreakdown | :x: | insiderTransactions | :x: | | insiderHolders | :x: | netSharePurchaseActivity | :x: | | sectorTrend | :x: | earnings | :x: | | companyOfficers | :x: | earningsHistory | :x: | | earningsTrend | :x: | indexTrend | :x: | | symbol | :x: | fundProfile | :x: | | topHoldings | :x: | fundPerformance | :x: | | defaultKeyStatistics | :x: | | | You can fetch modules by calling `summaryDataBy(...)` ```swift SwiftYFinance.summaryDataBy(identifier: "AAPL", selection = .all){ data, error in if error != nil{ return } print(data) /* data ~> struct IdentifierSummary { var recommendationTrend:RecommendationTrend? var summaryProfile:SummaryProfile? var quoteType:QuoteType? var price:Price? var indexTrend:IndexTrend? var calendarEvents:CalendarEvents? var summaryDetail:SummaryDetail? var dataStorage:JSON? } */ // Raw JSON: print(data.dataStorage) } ``` Several types of selection are available. `.all` will fetch every method, even not supported yet so that you can get data from raw JSON. You can select `.supported`, then only supported data will be fetched. Also, you can specify specific module (ex: `.price`) or list of modules (ex: `[.price, .summaryDetail]`) ## Author Aleksandr Dremov, dremov.me@gmail.com ## License SwiftYFinance is available under the MIT license. See the LICENSE file for more info.