Contents

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/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{
        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]`)

Author

Aleksandr Dremov, dremov.me@gmail.com

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