# Local Hurst Exponent for ThinkorSwim

#### KKaiser

##### Member
VIP
Dear Members,

I am trying to locate Hurst Exponent. I came this while reading thinkScript manual where @AlphaInvestor uses it as follow: I use it to gauge whether the price is Random (Chop) HE = 0.5, Trending (HE>0.5), or Mean Reverting (HE<0.5). Please advice where i can get the script and more info about this indicator for day trading/scalping.

Thank you,
KKaiser

#### sniktau

##### New member
Hello,

I am fascinated by the Hurst Exponent and interested in its use in determining if a price is persisting, reverting, or random across timescales. This is a lovely departure from the i.i.d. stochastic processes touched upon in my undergraduate probability and signal processing courses. I am still absorbing the significance and nuance of Mandelbrot's: The (Mis)Behavior of Markets, and scrutinizing the heaps of curious tools, scripts, and scratches I've trawled up from the internet which are in varying degrees of disrepair and decay.

Given that neither of us can find such a function within ToS or just about on the wide web, I have been interested in implementing the following approximation of the Hurst Exponent, which I found in a YouTube Video from Paralax Research (the manual for their Bloomberg Application is here, page 37 onwards is interesting for our purposes). The approximation discussed in their YouTube video is as follows:

• Where h is the highest high in the time range,
• l is the lowest low in the time range,
• t is the time period over which measurements are taken
• average_*true*_range is the average true price range
• C is a correction factor... ExtremeHurst has some other part that considers log-periodic oscillations... not going into that
EDIT Correcting an error.

I've tracked down the YouTube video here

Let me know what you think of this approximation. I have been a little bit frozen on this because I also want to check it against calculating the Hurst Exponent with the same data in a different tool, and probability was not my strong point in engineering school.

Last edited:

#### KKaiser

##### Member
VIP
Hi @sniktau After searching whole day I came across Hurst channel code from Trendxplore website. Hopefully @BenTen @markos @horserider can help us with this topic. Thank you for the Paralax Reseach. I am not at all a coder but trying to learn. This site is great place to understand all the fancy and useful tools and suggestions.

Code:
# Hurst_Channels
#
# www.trendxplorer.info
# [email protected]
#
# Build: July 25, 2012
# Rev 1: July 27, 2012: ExtrapolatedMA based on Kirills code
# Rev 2: July 29, 2012: FlowPrice value for better extremes
# Rev 3: Sept 9, 2012: Coloring for ExtrapolatedCMA added
#

#
# --- script begin ----
#

declare upper;

input price = hl2;
input length = 10;
input InnerValue = 1.6;
input OuterValue = 2.6;
input ExtremeValue = 4.2;
input showFlowPrice = NO;
input showPriceBar = YES;
input smooth = 1;

def displacement = (-length / 2) + 1;
def dPrice = price[displacement];

rec CMA = if !IsNaN(dPrice) then Average(dPrice, AbsValue(length)) else CMA[1] + (CMA[1] - CMA[2]);

plot CenteredMA = if !IsNaN(dPrice) then CMA else Double.NaN;
CenteredMA.SetDefaultColor(GetColor(1));
CenteredMA.SetLineWeight(2);

plot ExtrapolatedMA = if !IsNaN(price) and IsNaN(dprice[-1]) then CMA else
Double.NaN;
ExtrapolatedMA.SetDefaultColor(GetColor(0));
ExtrapolatedMA.SetLineWeight(2);
ExtrapolatedMA.SetStyle(Curve.SHORT_DASH);
ExtrapolatedMA.DefineColor("Up", Color.Magenta);
ExtrapolatedMA.DefineColor("Down", Color.Yellow);
ExtrapolatedMA.AssignValueColor(if ExtrapolatedMA >= ExtrapolatedMA[1] then ExtrapolatedMA.color("Up") else ExtrapolatedMA.color("Down"));

def ExtremeBand = CMA * ExtremeValue / 100;;
def OuterBand = CMA * OuterValue / 100;
def InnerBand   = CMA * InnerValue / 100;

plot UpperExtremeBand = if !IsNaN(price) then CMA + ExtremeBand else Double.Nan;
plot LowerExtremeBand = if !IsNaN(price) then CMA - ExtremeBand else Double.Nan;
plot UpperOuterBand = if !IsNaN(price) then CMA + OuterBand else Double.Nan;
plot LowerOuterBand = if !IsNaN(price) then CMA - OuterBand else Double.Nan;
plot UpperInnerBand = if !IsNaN(price) then CMA + InnerBand else Double.Nan;
plot LowerInnerBand   = if !IsNaN(price) then CMA - InnerBand else Double.Nan;

UpperExtremeBand.SetDefaultColor(GetColor(4));
UpperExtremeBand.SetLineWeight(2);
LowerExtremeBand.SetDefaultColor(GetColor(4));
LowerExtremeBand.SetLineWeight(2);
UpperExtremeBand.hide();
LowerExtremeBand.hide();

UpperOuterBand.SetDefaultColor(GetColor(5));
UpperOuterBand.SetLineWeight(2);
LowerOuterBand.SetDefaultColor(GetColor(6));
LowerOuterBand.SetLineWeight(2);

UpperInnerBand.SetDefaultColor(GetColor(5));
UpperInnerBand.SetLineWeight(1);
UpperInnerBand.SetStyle(Curve.SHORT_DASH);
LowerInnerBand.SetDefaultColor(GetColor(6));
LowerInnerBand.SetLineWeight(1);
LowerInnerBand.SetStyle(Curve.SHORT_DASH);

# Turn AddClouds off by putting a #-sign at the first position of the lines

#Rev 2:
#def FlowValue = if close > close[1] then high else if close < close[1] then low else (high + low)/2;
def FlowValue =
if high >= high[1] and low <= low[1]
then
if close >= close[1] #or high >= high[2]
then high
else low
else
if high > high[1]
then high
else
if low < low[1]
then low
else
if close > close[1]
then high
else
if close < close[1]
then low
else (high + low) / 2;

plot FlowPrice = if showFlowPrice then Average(FlowValue, smooth) else double.nan;
FlowPrice.SetDefaultColor(GetColor(9));
FlowPrice.SetLineWeight(2);

hidePricePlot(!showPriceBar);

#
# --- script end ----
#

#### horserider

##### Well-known member
VIP
Looked at these long ago. If I remember correctly the inputs need to be specific for the stock you are charting. Maybe that was a different band indicator. Just too long ago to remember correctly. Anyway I dropped it due to that problem.

VIP

#### sniktau

##### New member
Thank you, @KKaiser, this is another interesting tidbit but just like I've observed from looking at other tools scattered about, there's clear deficiencies or missing dependencies that make them hard to use, as @horserider mentioned. Now, with that in mind, I'd like to pore over the code you posted and see what else is associated with it.

... the inputs need to be specific for the stock you are charting

What do you mean by this, Horserider? How did do you tune the inputs? How do you know if they're set sane or insane?

##### Active member
As a word of caution to those looking at Hurst bands, the indicator repaints many candles back as it uses forward price action to adjust where "center" is. @sniktau what horserider is saying is that you will need to adjust the settings for each time frame and each asset you trade. For example: I use hurst bands on a 1min chart for MES with length 400 and deviations set at .5, 1.0, and 1.5 respectively. I start scaling in shorts when price enters the upper highlighted zone, start scaling in longs when it enters lower highlighted zone, with the expectation of scalping profits the other way back towards center channel. BUT if I switch to a different time frame, these settings will not work. If I go with still a 1min time frame but on SPY instead, those settings most likely are far from optimal. This is a usable tool, but important to understand its limitations.

#### sniktau

##### New member
Thanks for the reply @tradebyday, I will apply your defaults to this interesting plugin and see what it does with that instrument and timescale to calibrate my sense of what it "should" look like, but I still am without a means to systematively calibrate the Hurst bands study for other times scales or instruments. How did you figure it out the first time?

I am also a bit disinclined from using this tool because I want to do analysis at multiple timescales and present it in the "thermo" style window. Hurst at one timescale? Good, but not especially insightful.

##### Active member
No problem @sniktau . Ya a trader on twitter had some settings he shared, so that's how I got something close to his. The longer length is needed to keep the repaint from being too drastic, but the deviations of the bands will need major modifications between each ticker symbol and each timeframe. The hurst bands I have settings for are a tad extreme and therefore do not yield reversal trades every day, which I prefer since I trade multiple strategies in a given day based on what is presented to me. But at the end of the day, it is more of a scalpers tool, rather than a trend trading tool

#### sniktau

##### New member
Hello forum members,

I am happy to release the first pass at a simple, local approximation of the Hurst exponent. This is a work in progress and this post is already taking up too much of my lunch hour.

### What is the Hurst Exponent?

It's a measure of a time-series' feedback on itself, or its memory. If the exponent is found to be 1/2, the time series is moving "truly" randomly, and towards 1 or 0 it is either displaying positive feedback or negative feedback, respectively. It was developed by the hydrologist Harol Edwin Hurst in the 1950's to figure out how large to make a dam to deal with all of the possible flooding outcomes. It is directly related to the fractal dimension D. Please read more from Wikipedia or (Mis)Behavior of Markets by Mandelbrot.

The equation from Wikipedia is as follows:

Hurst used the following equation for the Nile. He found it to be ~0.73 for that river.

• R( n) is the range of the first n cumulative deviations from the mean, and S( n) their standard deviation, in the case of Hurst's research, the regular standard distribution is used. Mandelbrot cautions again and again in his book about being wary of such a measure because he claims markets are not governed by Gaussians, but by a mix of Cauchy and Gaussian distributions.
• E s the expected value
• n is the time span of the observation (number of data points in a time series)
• C is a constant.

Mandelbrot suggests the following for R/S from p. 288 of the referenced book:

(LaTeX because it was a pain to write: \frac{R( n)}{S( n)} = \frac {\max\limits_{1 \leq k \leq n} \sum\limits_{j=1}^k (r_j - \bar{r_n}) - \min\limits_{1 \leq k \leq n} \sum\limits_{j=1}^k (r_j - \bar{r_n})} {\bigg( \sum\limits_{j} (r_j - \bar{r_n})^2\bigg)^\frac{1}{2}} )

• r is the return
• r bar is the average return
• n is the max time range
• k is the index for the sums

### ... What?

Okay what does it mean that it's related to the fractal dimension? It basically means that for a time series, the value of H corresponds to how rough the time series is. Let me break it down:
• When H is near 1 is implies persistency:
• positive feedback is at work
• all investors are bullish or bearish
• what to watch for: volume dropping off since everyone has made their bets, the market losing steam and going sideways
• When H is exactly 1/2 is implies random:
• The stochastic time-series events are independent of each other. No memory or feedback
• What to watch for: conventional finance theories rejoicing temporarily
• When H is near 0 it implies reversion:
• negative feedback
• tug-of-war, choppy, rough
• what to watch for: chartists mentioning the market coiling up, possibly a change in volatility
This measurement is taken over multiple timescales, ideally disparate-scaled ones extending deep, deep into the past.

### That seems like that math takes ages to do in thinkscript, is there a faster way?

As mentioned in another post, here is a local approximation of the Hurst exponent which can be used:

• Where h is the highest high in the time range,
• l is the lowest low in the time range,
• t is the time period over which measurements are taken
• average_*true*_range is the average true price range
• C is a correction factor... ExtremeHurst has some other part that considers log-periodic oscillations... not going into that
Local to what? That time range. The Hurst exponent for one time range is hardly insightful. It is more useful to see what it is at multiple timescales. Which, finally brings us to:

### Plotting Hurst in ThinkorSwim

Here is the thinkscript study:

Rich (BB code):
input length = 4;
input averageType = AverageType.EXPONENTIAL;

def ll = Lowest(low[1], length);
def hh = Highest(high[1], length);
def atr = MovingAverage(averageType, TrueRange(high, close, low), length);

plot H;

def tmp_H = (Log(hh - ll) - Log(atr)) / (Log(length));

if H > 1 then {
H = 1;
} else if H < 0 {
H = 0;
} else {
H = tmp_H;
}

I suggest you run it in thermo mode. I've been using a range of 3-32. I tried making defaults in the above script but it breaks ToS...

TL;DR: Shared link. This is on top of @YungTraderFromMontana's wonderful charting setup, FYI: https://tos.mx/mFd0SQZ

### What about that correction factor? Where's the _______ ?

This script ****s. I have the following improvements to make:
• Make it work over multiple time frames. Right now it just descends some length ticks into the past at the current timescale. This limits the utility
• Make defaults. Especially the mid color and range for the thermo plot
• Make it display semilog data; we want to peek deep deep into the time series and see what's frothing in the short term.
• Make alerts for when persistency or antipersistency is appearing across multiple timescales.
• Model log-periodic oscillations, esp. near binary events
• Account for the multifractal nature of trading time

Last edited:

##### Well-known member
great detailed post

#### BenTen

Staff member
Staff
VIP
Thanks for the detailed post.

##### Well-known member
thermo mode is a revelation for me, thank you so much.

##### Well-known member
Thanks for the detailed post.
Thermo mode may be cool for an indicator release in the future. I never knew about it but it could have a lot of cool applications.

#### sniktau

##### New member
Oooh! If you haven't already, look at my first post for more on thermo mode!

The entire documentation on the thermo commands is as follows as an afterthought in an Appendix, and if you try it, it might break TOS:

Rich (BB code):
#thermo plot : Data
#thermo input : length
#thermo minValue : 10
#thermo maxValue : 50
#thermo minColor : 0, 0, 255
#thermo maxColor : 255, 255, 255

That's it.

Those aren't comments, either, they're meaningful settings and for me it broke things when I tried it out. In a way, the form reminds me of C pragmas, but I doubt that's what these are called since I'm assuming that thinkscript is interpreted. Anyway, point is: this is a very weird and underdocumented part of the thinkorswim platform. Not many settings, which makes my goal to see semi-log plots of H frustrating.

I want to know more and I am at my limits. I'll reach out to TD Ameritrade to see if I can enrich our hot, entropic, thermo-charting.

##### Well-known member
in variables ll and hh why is the previous bars values used?

#### sniktau

##### New member
Good question, I think I somehow assumed along the way that high and low had to be indexed into and just never went back, I think I should change it to be at the current tick.

For the heck of it I tried using LowestAll(low) and HighestAll(high). I'm quite surprised at the difference!

Old way (well, without the unhelpful -1 indexing).

LowestAll/HighestAll usage:

The second case is interesting, and I suspect it might be more on the right track actually and my old plot approach is suspect.

Re-scaled magenta to be 0.5:

Like I said, this script needs more work...

#### sniktau

##### New member
This is a little awkward, @KKaiser. I don't mean to be rude in any way by posting about this subject. I realized in my response to your post, I had so much more to say and explore, that I realized I should just make a new thread with my attempt at a specific approximation. I'm not quite sure to what you're taking offense? Posting a response to your thread or posting this new thread?

As an aside: I joined this forum initially to work out how to present the Hurst exponent as well as multifractal time in a technical indicator or series of indicators, and so I had collected some stuff on the matter, but didn't know how to put it together or who to share it with, until I came here...

If its a matter of "hey I brought it up first": @BenTen can look at the edit history of my very first post here from last Thursday and see that I actually removed a reference to the Hurst exponent (I thought that it was irrelevant to that specific question and edited it after the fact, but I guess I should have been talking about Hurst in every single post after all.).

#### sniktau

##### New member
@tradebyday I would like to investigate KKaiser's Hurst find some more because it never occurred to me there was a way to map that measure to bounds on a price. I haven't looked at the script too closely yet but I've tried a few input parameters against a few stocks but I don't know good cal from bad cal.

What is the handle for that Twitter trader? Do they give out unique calibration parameters for the Hurst channels when they discuss a stock?

#### KKaiser

##### Member
VIP
Hi @sniktau, no offense, just thought we could have continue this conversation on the post I posted. I am very thankful that you that you came up with a cool formula. Sorry if I made you feel uncomfortable

## The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
• Exclusive indicators
• Proven strategies & setups
• Private Discord community
• Exclusive members-only content
• 1 full year of unlimited support

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?