pwd
'/home/sergey/Py_Models_at_Work'
Распределение объема торгов по часам в течение дня неравномерно.
Сначала приблизительно оценим эту неравномерность:
- Шаг 1. Просуммируем объем всех сделок в течение данного часа по всем торговым дням.
- Шаг 2. Нормируем полученные значения на общую сумму проведенных сделок.
usdrub = pd.read_csv('./data/SiZ5.csv',index_col=[0],usecols=[0,5], parse_dates=True)
usdrub.columns = ['volume']
(usdrub.groupby(usdrub.index.hour).agg('sum')/usdrub.sum()).\
plot(kind='bar', title='Распределение объема сделок в течение дня');

Теперь попробуем усреднить объем торгов внутри 30-минутных отрезков как процент от оборота внутри данного торгового дня:
vol30 = usdrub.resample('30Min','sum')
vol30['daily_vol'] = vol30.groupby(pd.TimeGrouper('1D')).transform('sum')
vol30['daily_pc'] = vol30.volume/vol30.daily_vol
vol30.tail()
volume | daily_vol | daily_pc | |
---|---|---|---|
2015-10-02 16:00:00 | 323279 | 3100475 | 0.104268 |
2015-10-02 16:30:00 | 210483 | 3100475 | 0.067887 |
2015-10-02 17:00:00 | 152571 | 3100475 | 0.049209 |
2015-10-02 17:30:00 | 124096 | 3100475 | 0.040025 |
2015-10-02 18:00:00 | 48425 | 3100475 | 0.015619 |
Результаты оформим в виде DataFrame
, где колонки:
mn
— процент сделок (от общего внутридневного оборота) в данном временном отрезке, усредненный по всему торговому периоду.sd
— стандартное отклонение процента сделок, рассчитанное по всему торговому периоду
results = pd.DataFrame()
results['mn'] = vol30.daily_pc.groupby(vol30.index.time).agg('mean').dropna()
results['sd'] = vol30.daily_pc.groupby(vol30.index.time).agg('std').dropna()
yerr_low = results.mn - results.sd
yerr_high = results.mn + results.sd
results['mn'].plot(kind='bar',
figsize=(10,3),
yerr=[yerr_low, yerr_high],
title='Внутридневной объем торгов с дисперсией');

Следует отметить, что хотя «средние» значения и демонстрируют хорошо известный U-паттерн в течение дня, ВОЗМОЖНЫ ЗНАЧИТЕЛЬНЫЕ ОТКЛОНЕНИЯ от средних значений.
Write a comment: