Refactored v3.0.0 with Swift concurrency support is coming!
I used Swift 5.0 and backward compatibility is not guranteed. IOS 13+
SwiftYFinance is available through Swift Package Manager.
Add dependency to your Package file:
dependencies: [
.package(url: "https://github.com/AlexRoar/SwiftYFinance", .upToNextMajor(from: "1.4.0")),
]
Or add dependency to your XCode project: File
> Swift Packages
> Add Package Dependency
https://github.com/AlexRoar/SwiftYFinance
/*
* 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:
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, ...)
Fetches the most recent data about identifier collecting basic information.
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")
}
Fetches chart data points
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")
}
Sometimes, you need to fetch data at some moment in the past. Use chartDataBy(..., moment: Date, ...)
for that.
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")
}
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 | ✅ | recommendationTrend | ✅ |
summaryProfile | ✅ | quoteType | ✅ |
industryTrend | ✅ | price | ✅ |
summaryDetail | ✅ | incomeStatementHistoryQuarterly | ❌ |
assetProfile | ❌ | balanceSheetHistoryQuarterly | ❌ |
incomeStatementHistory | ❌ | cashFlowStatementHistory | ❌ |
balanceSheetHistory | ❌ | cashFlowStatementHistoryQuarterly | ❌ |
financialData | ❌ | secFilings | ❌ |
upgradeDowngradeHistory | ❌ | institutionOwnership | ❌ |
fundOwnership | ❌ | majorDirectHolders | ❌ |
majorHoldersBreakdown | ❌ | insiderTransactions | ❌ |
insiderHolders | ❌ | netSharePurchaseActivity | ❌ |
sectorTrend | ❌ | earnings | ❌ |
companyOfficers | ❌ | earningsHistory | ❌ |
earningsTrend | ❌ | indexTrend | ❌ |
symbol | ❌ | fundProfile | ❌ |
topHoldings | ❌ | fundPerformance | ❌ |
defaultKeyStatistics | ❌ |
You can fetch modules by calling summaryDataBy(...)
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]
)
Aleksandr Dremov, [email protected]
SwiftYFinance is available under the MIT license. See the LICENSE file for more info.