Skip to content

Instantly share code, notes, and snippets.

@uberscientist
Last active October 24, 2023 03:08
Show Gist options
  • Save uberscientist/3e902c91b2286948e736e1e77e79b3b5 to your computer and use it in GitHub Desktop.
Save uberscientist/3e902c91b2286948e736e1e77e79b3b5 to your computer and use it in GitHub Desktop.
def dc(ohlcv, thresh=0.005):
upturn_event = True
p_h = p_l = ohlcv['close'][0]
dc_ranges = defaultdict(list)
tuples = tuple(ohlcv.itertuples())
# here we find the timedelta between the timeseries index, 1 and 0, so 1 day for daily data
step = tuples[1].Index - tuples[0].Index
# loop over tuples of ohlcv and time as Index,
# I name variables in the style of the paper http://www.economics-ejournal.org/economics/journalarticles/2012-36
# Algorithm 1 on page 9 of 19
for i, t in enumerate(tuples):
p_t = t.close
if upturn_event:
if p_t <= p_h * (1 - thresh):
upturn_event = False
p_l = p_t
# Here is where I think I've made my mistake, instead of appending the dates to a list,
# there needs to be alternative logic in order to create the proper start/end ranges for both the
# DC event and the overshoot...
dc_ranges['t_dt_end'].append(t.Index)
dc_ranges['t_dos_start'].append(t.Index + step)
else:
if p_h < p_t:
p_h = p_t
dc_ranges['t_dt_start'].append(t.Index)
dc_ranges['t_uos_end'].append(t.Index - step)
else: # if we're in a downturn
if p_t >= p_l * (1 + thresh):
upturn_event = True
p_h = p_t
dc_ranges['t_ut_end'].append(t.Index)
dc_ranges['t_uos_start'].append(t.Index + step)
else:
if p_l > p_t:
p_l = p_t
dc_ranges['t_ut_start'].append(t.Index)
dc_ranges['t_dos_end'].append(t.Index - step)
index = None
for k,v in dc_ranges.items():
dc_ranges[k] = sorted(v)
try:
index = index.union(DatetimeIndex(v))
except:
index = DatetimeIndex(v)
up = zip(dc_ranges['t_ut_start'], dc_ranges['t_ut_end'])
down = zip(dc_ranges['t_dt_start'], dc_ranges['t_dt_end'])
up_os = zip(dc_ranges['t_uos_start'], dc_ranges['t_uos_end'])
down_os = zip(dc_ranges['t_dos_start'], dc_ranges['t_dos_end'])
out = {
'up': up,
'down': down,
'up_os': up_os,
'down_os': down_os,
'index': index
}
return dc_ranges
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment