Country momentum factors

Greetings all,

I was wondering if anyone has incorporated country momentum factors in their ranking systems, much like industry momentum that is more commonly used. How would one go about creating such a factor?

Best,

Victor

iM-Country Rotation System
https://imarketsignals.com/2018/performing-us-market-im-country-rotation-system/

YTD return = +20.87% vs. Benchmark SPY = -18.07%

Thank you Geov. I actually meant country momentum as a stock factor, not with ETF’s, but your link is an interesting read though.

Best,

Victor

If you search the Forum there was a detailed discussion on this several years ago.

Here is the Forum link:

We are planning to introduce #country as a scope and series parameter for stocks.

Georg’s suggestion is based on currency momentum, not stock momentum.

Until we introduce #country as a scope and series parameter, the best solution I’ve come up with is as follows. Let’s say you determine that you want to rank stocks on the country’s 11-month momentum. Look up the ETF for each country. Then create a bunch of custom formulas that look more or less like this: Eval(Country(“CAN”),Close_D(0,GetSeries(“EWC:USA”))/Close_D(240,GetSeries(“EWC:USA”)),0)+Eval(Country(“CHL”),Close_D(0,GetSeries(“ECH:USA”))/Close_D(240,GetSeries(“ECH:USA”)),0)+Eval(Country(“CHN”),Close_D(0,GetSeries(“GXC:USA”))/Close_D(240,GetSeries(“GXC:USA”)),0)+Eval(Country(“COL”),Close_D(0,GetSeries(“GXG:USA”))/Close_D(240,GetSeries(“GXG:USA”)),0)+Eval(Country(“DNK”),Close_D(0,GetSeries(“EDEN:USA”))/Close_D(240,GetSeries(“EDEN:USA”)),0)+Eval(Country(“EGY”),Close_D(0,GetSeries(“EGPT:USA”))/Close_D(240,GetSeries(“EGPT:USA”)),0)
This is basically a list that evaluates each stock; if it’s domiciled in the country in question, then it calculates the 240-day momentum of the ETF that consists of stocks of that country. Add them all up and you’ll get a country momentum factor. When you do that, you should probably use IsZero([formula],NA) so that stocks in countries without an associated ETF (e.g. Lithuanian companies) do not get ranked.

Please note that you’re not going to get a very good quantile performance because all US stocks will rank the same and will therefore leave some quantiles blank in each testing period. Also please note that these ETFs are all cap-weighted and may not give you a very good indication of the momentum of small cap stocks in countries with lots of large caps. In periods in which large caps outperform/underperform small caps in general, countries with lots of large caps will outperform/underperform countries with lots of small caps. Equal-weighted indices would be preferable, but they’re not easy to find.

I didn’t spend time on this, but wouldn’t something like this be much simpler?
Close_D(0, $CountryETF)/Close_D(0, $Country_EFT)

Secondly, are you considering creating a MATCH() function to avoid the mess (and inevitable bugs) of nested EVAL’s?

We don’t have the country ETFs as time series, so you have to use GetSeries to call up their prices.

For this you don’t have to use nested Evals. You just sum them up.

Yuval, yes, many times you can work around the nested EVAL() issue like you did, but there are times when a MATCH() statement would make things much simpler.

As for simplifying this particular example, here are two screener rules to get you started:

ShowVar(@Country_ETF, IsZero(Country(“CAN”)*GetSeries(“EWC:USA”) + Country(“CHL”)*GetSeries(“ECH:USA”) + Country(“CHN”)*GetSeries(“GXC:USA”) + Country(“COL”)*GetSeries(“GXG:USA”) + Country(“DNK”)*GetSeries(“EDEN:USA”) + Country(“EGY”)*GetSeries(“EGPT:USA”), NA))

ShowVar(@Country_Mom, Eval(@Country_ETF>0, Close_d(0, @Country_ETF)/Close_d(240, @Country_ETF), Na))

It saves a bit of repetition.

Thanks, Chaim! I did not know that one could use a custom formula like this in place of a time series as the second parameter of Close. Nice work!

Yes. But replace series 0 with NA.