alexdremov/SwiftYFinance
The best Yahoo Finance library with the power of Swift
Requirements
I used Swift 5.0 and backward compatibility is not guranteed. IOS 13+
Installation
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/SwiftYFinanceBasic 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{
print(error!.localizedDescription)
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{
print(error!.localizedDescription)
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{
print(error!.localizedDescription)
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{
print(error!.localizedDescription)
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{
print(error!.localizedDescription)
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{
print(error!.localizedDescription)
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]`)License
SwiftYFinance is available under the MIT license. See the LICENSE file for more info.
Package Metadata
Repository: alexdremov/SwiftYFinance
Stars: 75
Forks: 17
Open issues: 1
Default branch: master
Primary language: swift
License: MIT
Topics: api, finance-api, ios, mobile, mobile-app, stock, stock-api, stock-market, swift, yahoo, yahoo-finance, yahoo-finance-api
README: README.md