joshuaulrich / quantmod

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

Dividend Ex-Date returns Dividend Pay Date #287

Closed matiasandina closed 4 years ago

matiasandina commented 4 years ago

Description

I'm trying to get the dividends dates (I see "Dividend Pay Date" is commented out in getQuote() source code). So I should probably not get the "Dividend Pay Date" but I should be getting the "Ex-Dividend Date".

library(quantmod)
library(dplyr)

what_metrics <- yahooQF(
  c("Dividend Yield", "Dividend/Share",
    "Ex-Dividend Date",
    "dividendDate",
    "Dividend Pay Date",
    "Earnings Timestamp")
)

df <- getQuote("MSFT", what=what_metrics) %>% as.data.frame()
yahoo_time <- function(x){
  as.POSIXct(x,
             origin = "1970-01-01 00:00:00.000 UTC")
}
df %>%
  mutate(`Ex-Dividend Date` = yahoo_time(`Ex-Dividend Date`),
         `Earnings Timestamp` = yahoo_time(`Earnings Timestamp`))

Produces

           Trade Time Dividend Yield Dividend/Share    Ex-Dividend Date  Earnings Timestamp
1 2019-11-08 16:00:01     0.01310135           1.89 2019-12-11 19:00:00 2019-10-23 12:08:39

Expected behavior

https://finance.yahoo.com/quote/MSFT?p=MSFT https://www.nasdaq.com/market-activity/stocks/msft


Somewhat separate issue, the Earnings timestamp shows the past timestamp (not sure if this is correct behavior, given yahoo shows an estimate future earnings report)

joshuaulrich commented 4 years ago

I don't think anything's wrong with getQuote. Yahoo returns the POSIX timestamp in UTC, so your transformation works if you specify the timezone.

yahoo_time <- function(x) { .POSIXct(x, tz = "UTC") }
msft <- getQuote("MSFT", what = what_metrics)
# don't have dplyr installed in my dev environment
within(msft, {
  `Ex-Dividend Date` <- from_utc(`Ex-Dividend Date`)
  `Earnings Timestamp` <- from_utc(`Earnings Timestamp`)
})

Regarding the Earnings Timestamp column, I can't fix that. getQuote returns the data returned by the Yahoo Finance server.

matiasandina commented 4 years ago

I'm sorry, I might have not been clear, I don't think this is a problem of date calculation.

Ex Dividend Date >> Nov 20, 2019 and Dividend Pay Date >> Dec 12, 2019

Your code is also returning the Dividend Pay Date instead of the Ex-Dividend Date

I would also expect to be able to have access to both dates (I understand if yahoo API might not give that but the naming of the variable is confusing).

joshuaulrich commented 4 years ago

I didn't read your initial post carefully enough. Thanks for clarifying!

So getQuote is returning the dividend pay date labelled as the ex-dividend date. I probably messed up that mapping when they switched from a CSV-based API to the JSON version. The JSON has dividendDate = 1576108800, so I assumed that was the ex-dividend date.

I'll fix. Thanks for the report!

joshuaulrich commented 4 years ago

Thanks again for the report! This should be fixed now. Please let me know if I missed something.