voice32/stock_market_indicators

chaikin_oscillator

Closed this issue · 2 comments

  1. Money Flow Multiplier = [(Close - Low) - (High - Close)] /(High - Low)

  2. Money Flow Volume = Money Flow Multiplier x Volume for the Period

  3. ADL = Previous ADL + Current Period's Money Flow Volume

  4. Chaikin Oscillator = (3-day EMA of ADL) - (10-day EMA of ADL)


Функция не учитывает предыдущее значение ADL, а в целом спасибо!
ADL = Previous ADL + Current Period's Money Flow Volume

def chaikin_oscillator(data, periods_short=3, periods_long=10, high_col='',
low_col='', close_col='', vol_col=''):
ac = pd.Series([])
val_last = 0
for index, row in data.iterrows():
if row[high_col] != row[low_col]:
val = val_last + ((row[close_col] - row[low_col]) - (row[high_col] - row[close_col])) / (row[high_col] - row[low_col]) * row[vol_col]
else:
val = val_last
ac.set_value(index, val)
val_last = val
ema_long = ac.ewm(ignore_na=False, min_periods=0, com=periods_long, adjust=True).mean()
ema_short = ac.ewm(ignore_na=False, min_periods=0, com=periods_short, adjust=True).mean()
data['ch_osc'] = ema_short - ema_long

return data

Спасибо! Пофиксил :)

Надо тогда еще поправить Accumulation/Distribution line =)

def acc_dist(data, trend_periods=21, series=True, open_col='Open', ema=False, high_col='High', low_col='Low', close_col='Close', vol_col='Volume'):
    ######## val_last = 0
    for index, row in data.iterrows():
        if row[high_col] != row[low_col]:
            ac = val_last + ((row[close_col] - row[low_col]) - (row[high_col] - row[close_col])) / (row[high_col] - row[low_col]) * row[vol_col]
        else:
            ac = 0
        ######## val_last  = ac
        data.set_value(index, 'acc_dist', ac)
    data['acc_dist_ema' + str(trend_periods)] = data['acc_dist'].ewm(ignore_na=False, min_periods=0, com=trend_periods, adjust=True).mean()