joshuaulrich / quantmod

Quantitative Financial Modelling Framework
http://www.quantmod.com/
GNU General Public License v3.0
798 stars 219 forks source link

How to add expense ratio to the list of fields we can source from yahoo #335

Closed Courvoisier13 closed 1 year ago

Courvoisier13 commented 3 years ago

Description

For a fund or ETF, SPY for example: I would like to add the Expense Ratio (net) (under Summary) or Annual Report Expense Ratio (net) (under profile) to the list of fields that can be scraped. Using my best guess and looking at the html, I added

"Expense Ratio (net)", "Expense Ratio (net)", "annualReportExpenseRatio"

to the end of the variable .yahooQuoteFields in the file getQuote.R. After building the package and try it out, unfortunately I get the following error:

Error in `[.data.frame`(sq, , "regularMarketTime") : 
  undefined columns selected
Called from: `[.data.frame`(sq, , "regularMarketTime"

Is it possible to get some help on rules for .yahooQuoteFields and is it possible to add new fields to extract new info?

Expected behavior

I expect to get the expense ratio for a fund, SPY for example.

Minimal, reproducible example

syms <- "SPY"
what_metrics <- yahooQF(c("Name", "Expense Ratio (net)"))
getQuote(syms, what=what_metrics)

Session Info

R version 4.0.5 (2021-03-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19041)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] quantmod_0.4.18.1 TTR_0.24.2        xts_0.12.1        zoo_1.8-9        

loaded via a namespace (and not attached):
[1] compiler_4.0.5  tools_4.0.5     yaml_2.2.1      curl_4.3.1      grid_4.0.5      jsonlite_1.7.2  lattice_0.20-41 fortunes_1.5-4 
joshuaulrich commented 3 years ago

I don't know how to do this. It doesn't look like it's returned by the quote API. You can hit the API in your browser: https://query1.finance.yahoo.com/v7/finance/quote?symbols=SPY&fields=annualReportExpenseRatio

Here's the result:

{
    "quoteResponse": {
        "error": null,
        "result": [
            {
                "esgPopulated": false,
                "exchange": "PCX",
                "exchangeDataDelayedBy": 0,
                "exchangeTimezoneName": "America/New_York",
                "exchangeTimezoneShortName": "EDT",
                "firstTradeDateMilliseconds": 728317800000,
                "fullExchangeName": "NYSEArca",
                "gmtOffSetMilliseconds": -14400000,
                "language": "en-US",
                "market": "us_market",
                "marketState": "CLOSED",
                "priceHint": 2,
                "quoteSourceName": "Delayed Quote",
                "quoteType": "ETF",
                "region": "US",
                "sourceInterval": 15,
                "symbol": "SPY",
                "tradeable": false,
                "triggerable": true
            }
        ]
    }
}
Courvoisier13 commented 3 years ago

Ah I see. Where can I see the endpoints of this API? I went on Rapid API and found that it is on get-profile endpoint. But that is a different API to the one you use.