Блог им. Buybuy
Добрый день, коллеги!
С большим удивлением выяснил, что мои серьезные посты про рынок кого-то интересуют...
Поверить в это было сложно, т.к. камменты под ними обычно насыщены г@вном и хейтом.
Но раз интерессанты есть — пора прервать молчание и написать что-то про рынок.
Сегодня мы еще раз обсудим вопрос «правильных» цен для формирования маркетной эквити.
Итак — сейчас мы используем маркетную модель торговли, т.е. торгуем только маркетными ордерами (по рынку).
Пусть цена разбита на интервалы/бары от C(n) до C(n+1) (C от Close).
Пусть Id(n) — индикатор торговой системы (любой) в начале бара n.
Он может принимать значения +1 (покупка) или -1 (продажа).
Наша система реверсивная, т.е. всегда находится либо в покупке, либо в продаже.
Пусть d(n) — приращение цены на баре n — d(n)=C(n+1)-C(n)
Тогда простейшая формула для приращения маркетной эквити на баре n — это
dEq(n)=d(n)*Id(n)
Эквити — это сумма приращений
Eq(n)=sum(dEq(n))
В такой модели очевидно, что успешный неопережающий индикатор следует строить по предыдущим приращениям цен — d(n).
Здесь неявно используется предположение, что цена исполнения маркетного ордера, выставляемого в самом начале бара (с очень малой задержкой), скорее всего близка к последней известной цене C(n).
Для вопросов максимизации эквити, минимизации просадки, максимизации эквити, деленной на просадку, такой модели достаточно.
Для реальной торговли такая модель не подходит категорически (для малых таймфреймов, для больших все несколько проще).
Дело в том, что маркетный ордер никогда не исполнится по цене C(n), более того, цена исполнения ордера отличается от последней известной цены C(n) достаточно фантазийно.
В реале на любом рынке мы имеем цены bid/ask (массивы Bid(n) и Ask(n)), которые соответствуют лучшим заявкам на покупку/продажу.
Далее есть варианты:
1. На площадках с обычным стаканом исполнение происходит не по bid/ask, а хуже, если ордер превосходит по объему лучшие ордера bid/ask
2. На американском фондовом рынке за счет механизма NBBO (national best bid&offer, он же price improvement) исполнение происходит систематически лучше, чем по bid/ask (вот она — правильная модель торговли в отличие от тухлого MOEX)
В обоих случаях цена исполнения маркетного ордера значительно лучше коррелирует с bid/ask, нежели с последней известной ценой close.
Пусть маркетный ордер исполняется точно по bid/ask (в зависимости от его направления — покупка/продажа). Это вполне разумное допущение, т.к. в варианте 1 мы можем статистически расширить спред bid/ask, а в варианте 2 — сузить и работать уже с модифицированными рядами Bid(n)/Ask(n).
<censored>
Немного повозившись, можно вывести формулу для приращения маркетной эквити в таких предположениях. Так же, как и раньше, мы ничего не знаем про вид индикатора Id(n), знаем лишь, что он всегда равен +1 или -1. Формула выглядит так:
dEq(n)=-0.25*(Ask(n)-Bid(n))*(1-Id(n)*Id(n-1)) + d~(n)*Id(n)
где d~(n)=0.5*(Bid(n+1)+Ask(n+1))-0.5(Bid(n)+Ask(n))
Если теперь ввести новые ряды
C~(n)=0.5*(Bid(n)+Ask(n)) — модифицированный ряд close
S(n)=Ask(n)-Bid(n) — спред
то формулы упростятся
d~(n)=C~(n+1)-C~(n)
dEq(n)=-0.25*S(n)*(1-Id(n)*Id(n-1))+d~(n)*Id(n)
Это не вполне формальное преобразование. Из него видно, что
1. К финрезу бара (d~(n)*Id(n)) добавился снос. Он состоит из постоянной (не зависящей от индикатора) и переменной части
2. Постоянный снос составляет 0.25 спреда на баре
3. Общий снос составляет 0.5 спреда на перевороте (когда Id(n)*Id(n-1)=-1)
4. Новый индикатор разумно строить как функцию от модифицированных приращений d~(n)
Далее, реверсивная торговая система осуществляет переворот сделкой двойного объема.
Тем не менее, расходы на спред составляют 0.5 спреда на переворот (а не полный спред, как это кажется правильным для двойного объема).
Расходы на переворот составляют в точности 0.5 спреда (а не в-среднем 0.5 спреда, как нам вещает AI).
Дальше — круче)
На американском фондовом рынке на ТФ 1min построение индикатора на базе модифицированных приращений цен d~(n) вместо обычных приращений close d(n) позволяет в-среднем поднять доходность субоптимальных торговых систем в 4-5 раз (!), что кагбэ подтверждает правильность такого подхода.
ЗАДАЧКА ДЛЯ ЛЮБОЗНАТЕЛЬНЫХ:
Кто-нибудь сможет выписать формулу для эквити/приращения эквити в случае, когда индикатор Id(n) может принимать 3 значения — +1 (покупаем), -1 (продаем) и 0 (закрываем позу или ничего не делаем)?
Эта формула окажется значительно более сложной и громоздкой, зато из нее легко понять, почему реверсивные системы — это лучшие кирпичики для построения сложных портфелей, а добавление нулей в индикатор ощутимо портит результат.
С уважением
Вчера с товарищем выпил много вкусной финской водки «Коскенкорва» (кошачий глаз по-ихнему).
Сегодня осторожно отхожу...
С уважением
и останутся нормальные люди
Вот только торговать эту иллюзию плюсовой доходности не получается...
С уважением
Но ход мыслей правильный)
С уважением
Если есть лишь такой индикатор, IMO полезнее сосредоточиться на другом, показывающий примерный характер рынка и диапазон цен в ближайщем будущем. Тогда и не понадобиться сочинять сложные портфели. Сложные портфели — разумный вариант для многих сотен млн долл; на меньших объемах — индикатор интеллектуальной импотенции, IMO.
Это горадо ближе к реальности, чем по bid/ask предыдущих заявлениях.
точнее считать половину н-1 спреда + половину н.
Если ни чего не делать добавить вариант то будет както так.
но это не точно
Выкладки в студию, плз
Ну и Id(n) в квадрате — это всегда 1 )))
С уважением
Тогда формула очевидно неверна
1. S(n-1) в нее входить не может по определению — в момент n все сделки совершаются по Bid(n) или Ask(n). Члены для приращения эквити, конечно, можно перегруппировать, но особого смысла в этом нет.
2. Если Id(n)=0, то снос на этом баре будет 0 вне зависимости от значения Id(n-1)
С уважением
Потому что иначе при Id(n)=0 снос уже есть, по определению, потому что вы купили в н-1'вом по аску… Хотя если по середине то нет да
Но тогда противоречие с тем что при Id(n)=0 позиция переносится через нный бар — и снос образуется на н+1'вом.
Да, кажется, что при закрытии позы (Id(n)=0) возникают расходы на спред, в действительности же (при аккуратном выводе) они пакуются внутрь результата бара d~(n)*Id(n).
Вообще вывод прост
1. Рассмотреть 4 кейса (Id(n)=1,-1 и Id(n-1)=1,-1)
2. Посчитать 4 финреза на баре
3. Придумать коэффициенты, соответствующие каждому из 4-х кейсов, чтобы взвесить с этими коэффициентами 4 финреза
Это для того, что написано в топике.
Для поставленной задачки кейсов будет 9, а расчеты усложнятся.
С уважением
Это как? Реверс это выход в кэш и затем снова вход, только одной сделкой.
Транзакционные издержки те же…
1. На американском рынке среднее время стабильности пары bid/ask (не объемов по bid/ask) составляет 2.2 сек, так что обычно гранды не успевают ее поменять и налить по худшей цене
2. Торговать в плюс не понимая, как конкретно формируется финрез, это торговать по чуйке. Тоже можно, но это не мое.
3. Я с дивана торгую на ТФ 15s. Четко понимаю (статистика набрана подробная) эффект от price improvement по каждому из торгуемых тикеров. И это мой живой монетизированный плюс.
С уважением
Берем референсный поток тиков SIP по выбранному тикеру, смотрим bid/ask и проверяем частоту изменения одной из ног.
Простая программа и не сильно дорогая ($99/мес. у Alpaca, у IBKR дороже) подписка на тиковый поток SIP.
С уважением
Нет никакого способа на баре n узнать его значение. Запаздывание расчёта.
Ну т.е. любая формула, зависящая от прошлых приращений цены (d(n-1), d(n-2), ...).
С уважением
Id(n) — это неопережающий индикатор, т.е. он зависит от d(n-1), d(n-2), ...
А 0.5*(Bid(n+1)+Ask(n+1)) — это синтетическая цена в конце бара n.
Т.е. оценка финреза в конце того бара, в начале которого была сделка.
Вы можете выбрать любые другие индексы на свое усмотрение.
С уважением
А это как? Ожидалось d(n)=C(n)-C(n-1).
"приращение цены на баре n" не означает ли что бара n+1 и в помине еще нет?
Финрез сделки по последнему значению индикатора будет известен только через бар в будущем.
Можете спокойно вычесть -1 из всех индексов и пересчитать в удобном Вам варианте. В моей нотации формулы выглядят проще. Ваш вариант я тоже пробовал несколько лет назад — он мне не понравился.
С уважением
Бар сам по себе в природе не существует. Если Вы его выдумали, то неплохо было бы сообщить его параметры. Например — это отрезок (на временной шкале), интервал или полуинтервал? И в последнем случае какого конца у него не хватает. А еще модно считать его отрезком между первой и последней сделкой в интервале. И т.д., и т.п…
Бар с номером n начинается в момент n и заканчивается в момент n+1
(применяемая мной нотация)
С уважением
PS. А еще глаз режет, когда в одном уравнении смешиваются почти всегда непрерывные величины (Bid/ask) и точки (цена сделки). Например кумулятивная сумма приращений цены вполне себе непрерывная.
С уважением
bid/ask считаются на начало бара, что отражено в нотации массивов Bid(n) и Ask(n).
С уважением
Как рассчитывать оптимальный индикатор и как правильно продолжать его в будущее — это целая отдельная наука.
И конечно, ни МА, ни 2 МА-шки, ни моментум здесь близко не стояли...
С уважением
Я останусь при своем.
С уважением
Трудно пытаться что-то вещать, когда это никому не интересно...
С уважением
P.S. Поэтому и пост назван «По просьбам...»
Я же меряю эффект от price improvement не линейкой с дивана, а реальной торговой статистикой.
И категорически заявляю, что по торгуемым мной 20+ тикерам (NYSE, NASDAQ, BATS, ARCA) на маркетных ордерах объемом до $100k никакого эффекта бабочки (явного во всяком случае) не наблюдается — выигрыш от price improvement составляет от 20% до 40% от спреда)
С уважением
1. Есть синтетические close C~(n)=0.5*(Bid(n)+Ask(n))
(bid/ask меряем на конец бара — 15-секундного в моем случае)
2. Есть цена исполнения ордера (iBid на продажу, iAsk на покупку)
3. Эффективность NBBO на продажу — это среднее (iBid-Bid)/(C~-Bid)
4. Эффективность NBBO на покупку — это среднее (Ask-iAsk)/(Ask-C~)
5. Средняя эффективность NBBO — это среднее из пп. 3 и 4
Все числа положительны, что явным образом свидетельствует об экономии относительно сделок по чистым bid/ask.
С уважением
Спасибо за разбор. Попробовал посчитать и для третьего состояния — когда система может оставаться вне рынка.
Если позиция p(n) принимает значения −1, 0, +1, сделки исполняются в начале бара по Bid/Ask, а счёт оцениваем по середине котировок, получается:
dEq(n) = p(n)·[M(n+1) − M(n)] − S(n)/2 · |p(n) − p(n−1)|,
где M = (Bid + Ask)/2, S = Ask − Bid.
Первая часть — результат движения цены. Вторая — издержки: половина спреда за каждую единицу изменения позиции.
Правда, для реверсивного случая у меня отсюда получается коэффициент 0,5 вместо вашего 0,25, поскольку |p(n) − p(n−1)| = 1 − p(n)·p(n−1).
Простейшая проверка: уже держим лонг в одну единицу, середина 100, Bid 99,5, Ask 100,5. Для переворота продаём две единицы по 99,5. Относительно исполнения по середине теряем 2 × 0,5 = 1, то есть полный спред. Возможно, у вас иначе нормирован объём позиции?
С нулями получается так: при одинаковом спреде переход +1 → 0 → −1 по спредовым издержкам равен прямому перевороту. Если действия разнесены во времени, спреды уже могут отличаться.
Дополнительный выход и возврат +1 → 0 → +1 добавляет издержки относительно удержания позиции. Но за время вне рынка можно и избежать убытка. Поэтому из одной формулы издержек я бы не делал вывода, что нулевое состояние обязательно ухудшает общий результат.
В правильной формуле
1. Снос при перевороте (Id(n)*Id(n-1)=-1) равен 0.5 спреда
2. Снос при сохранении позиции (Id(n)*Id(n-1)=1) отсутствует
3. Снос при закрытии/сквере (Id(n)=0) отсутствует
Для вывода правильной формулы нужно рассмотреть 9 вариантов (Id(n)=1,0,-1 и Id(n-1)=1,0,-1), посчитать их финрез и понять с какими коэффициентами взвесить эти финрезы, чтобы получить правильный результат ))) Поэтому я и написал, что сами расчеты громоздкие и результат тоже достаточно громоздкий.
С уважением
Попробую показать, где у меня возникает расхождение, на полностью закрытом цикле.
Bid 99,5 / Ask 100,5 не меняются. Торгуем единичную позицию, без комиссий и других издержек:
1. Купили 1 по 100,5: денежный поток −100,5.
2. Перевернулись в шорт, продали 2 по 99,5: +199.
3. Перевернулись в лонг, купили 2 по 100,5: −201.
4. Закрылись, продали 1 по 99,5: +99,5.
В начале и в конце позиции нет. Сумма денежных потоков: −3.
При оценке открытой позиции по середине котировок это раскладывается на 0,5 за первоначальный вход, по 1 за два переворота и 0,5 за окончательный выход.
Допускаю, что вы иначе распределяете издержки между барами или оцениваете открытую позицию. Но тогда как ваша формула воспроизводит итог −3 на этом примере? Хотелось бы понять конкретное место расхождения.
1. На каждом баре n мы применяем расчетную цену C~(n)=0.5*(Bid(n)+Ask(n))
2. Соответственно финрез на первом баре равен
2.1. C~(2)-Bid(1) если купили
2.2. Ask(1)-C~(2) если продали
2.3. 0 если ничего не делали
3. На следующих барах будет сложнее — надо учитывать и Id(n), и Id(n-1)
4. Считать денежный поток неправильно (IMHO). Часть издержек, которые Вы считаете, при аккуратном подсчете упакуются в оценку финреза бара d~(n)*Id(n), в расчет которой ровно так же входят bid/ask
С уважением
Спасибо, теперь вижу конкретное расхождение в расчёте первого бара.
В п. 2.1 при покупке по рынку должно быть C~(2) − Ask(1), а в п. 2.2 при продаже — Bid(1) − C~(2). В вашем ответе стороны стоят наоборот.
При неизменных Bid = 99,5 и Ask = 100,5 середина равна 100. Ваши выражения дают +0,5 и для покупки, и для продажи. Но после покупки по 100,5 позиция, оценённая по середине 100, имеет результат −0,5. После открытия шорта по 99,5 — тоже −0,5.
При этом d~(n) = 0: середина котировок не меняется. Поэтому в данном примере издержки не могут оказаться внутри слагаемого d~(n)*Id(n).
Возможно, в пунктах 2.1 и 2.2 просто опечатка? Но именно с этими сторонами возникает расхождение. А на полностью закрытом цикле из предыдущего примера итог остаётся −3: распределение издержек между барами не должно менять общую сумму.
С уважением
Собссно правильность формулы проверяется как раз конкретной симуляцией)
С уважением
Чё-то думала-думала....))))
У меня для неё другие задачки есть. По-проще.
У меня подписка pro на ChatGPT за скромные) $200/мес.
Свои идеи я через эту энжину не гоняю (во избежание утечек), но раз в месяц проверяю ее интеллект на задачах сходного уровня.
Ни одну пока, сцуко, не решила )))
А это практически лучшее, что есть на рынке...
С уважением
В смысле, что Алиска не одинока в этом плане.
Проще DeepSeek юзать и не заморачиваться)
В не слишком сложных задачах он прям очень хорош
С уважением
Первая любовь она такая!
Да и вообще. Всё, что нужно было мне в прикладном смысле (скрипты для терминала) она с БЛЕСКОМ порешала.
Теперь так. По инерции юзаю. Хотя...
Как сказать. До бэк-тестов добрались с ней. Есть такая буква.
Так что интерес не полностью потерян.
Кста о тестах.
Самую свою фичу решил прогнать с ней в симуляции (на минутках выгруженных).
Капец. Вердикт заглавными буквами написала: «Это КАТАСТРОФА, Капитан!»
Так или иначе, но IB регулярно присылает предупреждение, вроде «мы заметили, что вы покупаете по рынку и предупреждаем, что цена может быть не лучшей»