Calculating adjusted open, high, low, and volume for certain low-price, high-dividend tickers

I have come across a handful of tickers with negative values in the adj_close historical data. This is due to a dividend larger than the close price. See for example, TEPCF: prior to 2024-03-28, the adj_close price is $-3.16.

Adjusting the open, high, and low price to match is straightforward, just [o,h,l]*(adj_close/close). For typical (non-negative) adj_close prices, adjusting the volume is performed with an inverse operation, v/(adj_close/close). This equation falls apart when the adj_close goes negative, however, since you can’t have negative volume (you can’t really have negative price either, but that feels a bit easier to understand).

What is the best way to handle this corner case? I have come across 10-20 stocks so far that have negative adj_close values.

Looking through the docs for the old QUANDL database, it looks like they handled adj_volume by only adjusting for splits, ignoring dividends and spinoffs (the OHLC prices included all three). Financial, Economic and Alternative Data | Nasdaq Data Link

Maybe that is the right way to handle it, although it does mean a bit more number crunching to get right.

Hello. Negative adjusted prices come primarily from tickers with dividends in a different currency that that of the ticker itself (in case of TEPCF, however, I don’t see an issue, suppose it’s been automatically corrected by now).

In any case, the volume that is provided in the API is already adjusted - to splits, that is, if there were any. Volume is not adjusted to dividend adjustments. Reverse adjusting the volume to splits is simple - you can use the split data from the Splits API to get the reversed, non-adjusted volume of the day.

I think there are a handful of tickers with foreign currency dividends that are not having the currency properly set, so they are showing up as USD. Here are a few more examples I saw possible issues with (some may have been corrected already): GERS, LTGHF, PRAC, CIERF, IDKOF, SGIPF.

This is good to know though, I didn’t realize that was happening. So if I want to display a fully adjusted OHLC I only need to adjust the open, high, and low prices and I can leave volume alone across the board?