Доделан функционал расчета доходности в процентах годовых на основании средневзвешенной суммы в рынке

Что это такое и где об этом почитать написано в самом первом посте на настоящему кубику, в дополнение привожу еще несколько статей:
Что изменилось в кубике:
===============================
  • Так как настроек кубика уже довольно внушительное кол-во, то все настройки распределены по группам, чтобы было проще ориентироваться
  • убран вывод эквити по закрытым сделкам, т.к. это былf тестовая кривая, которая полностью повторяла штатную с вкладки "Доход"
  • добавлена опция "Вывод в оптимизацию: AWAProfit" (AWA - Average Weighted Assets). При установленной опции в процессе оптимизации рассчитываются параметры доходности по средневзвешенной стоимости активов, в оптимизацию выводится доходность в процентах годовых за каждый календарный год тестируемого интервала. Необходимо понимать, что параметр показывает доходность, приведенную к годовым значениям, то есть если стратегия за 1 день получила прибыль 1%, то это равносильно годовой доходности 365%, при этом если тестируемый период до года, то расчет производится линейным методом, если тестируемый период более 365 дней, то расчет производится с учетом ежегодного реинвеста. Линейный метод: прибыль в процентах делится на кол-во дней ее получения и умножается на 365, например, 1%, заработанный за 5 торговых дней равен ежегодной доходности 1%*(365/5) = 73% годовых. С реинвестом доход считается по формуле (1+1%) в степени 365/5, то есть показывает сколько процентов было бы заработано, если бы темп получения прибыли оставался прежним, и при этом сумма постоянно реинвестировалась, в данном случае - это 100% годовых

  • добавлена опция Показать панель "Доходность % годовых по периодам". При установке опции выводится панель доходности по периодам в процентах годовых. Данная панель отображает 2 графика: доходность средств, вложенных в тестируемую стратегию и доходность средств, вложенных в стратегию \"Бай Энд Холд\" на тестовом интервале. Обе кривые рассчитываются на основании средневзвешенной стоимости активов в рынке, при этом для стратегии "Бай Энд Холд" начальный депо определяется из размера средств, необходимых на фактическое совершение первой сделки, то есть стоимость активов + комиссия на вход на свече совершения первой сделки по цене Open. При расчете кривой "Бай Энд Холд" не используется настройка лаборатории \"начальный депо\", т.к. расчет производится на основании фактического кол-ва средств, требуемых для для тестируемой стратегии. Фактически в результате на графиках имеет место сравнение доходности рынка и доходности действий трейдера на этом рынке. Также на график выводятся 2 линии: это доходность рынка и доходность действий трейдера (стратегии) за весь тестируемый исторический период.
    В чем основное отличие от доходности, рассчитываемой ТСЛаб? Платформа рассчитывает доходность на основании CAGR, который не учитывает время вложения средств, фактическое кол-во вложенных средств, изменение кол-ва вложенных средств в процессе исполнения стратегии, фактическое время нахождения денежных средств в рынке, то есть по-простому, данный показатель рассчитывает не эффективность капитала, а скорость роста кривой эквити. Рассчитываемые ТСЛаб и кубиком показатели будут до определенной точности равны только при соблюдении всех условий: 1. работа одним лотом или указание в настройках платформы корректной суммы начального депозита, то есть если мы собираемся открыть сделку на 2 лота, то депозит должен быть указан в размере не менее двух лотов + комиссия на вход; 2. в процессе исполнения стратегии ни в один момент времени не должно быть превышения фактически располагаемой суммы. Превысить довольно легко, например, можно указать начальный депозит 100.000, но при этом на первой же сделке приобрести 500 лотов фьючерса на RTS и платформа без проблем даст это сделать, однако при расчете показателей доходности цифры будут совершенного некорректными, т.к. начальный депозит 100.000, а полученная доходность в разы превосходит реальную возможную сумму в силу того, что фактически покупка была совершена в тех объемах, которых у трейдера попросту не было. Расчет доходности на основании AWA лишен этого недостатка, т.к. считает доходность исходя из фактических объемов и времени сделок.
    Основное отличие: текущий кубик рассчитывает эффективность вложения денежных средств с точки зрения фактических сумм и времени нахождения в рынке, платформа ТСЛаб рассчитывает скорость роста кривой эквити. При правильных настройках платформы оба расчета будут совпадать с определенной точностью, но это не обязательное условие, например, разница может быть в том, что платформа ТСЛаб считает вход в рынок с момента окончания настройки "Торговать с бара", кубик рассчитывает вход в рынок с бара фактического входа в рынок.

  • добавлена опция "Тесты: Выводить в Excel расчет AWAProfit". При установленной опции при пересчете скрипта в папке "C:\TSLabStats\" будут созданы 4 файла формата Excel, в которых будут содержаться данные по расчету доходности на основании суммы средневзвешенных активов, то есть доходности с учетом фактического нахождения денежных средств в рынке. Денежные средства считаются находящимися в рынке полный торговый день, если в этот день был хотя бы один вход, все движения внутри дня суммируются в общий итог по внесению и по выводу средств (по покупке и продаже активов). Расчет доходности по средневзвешенным суммам более корректно отображается годовую ставку доходности по используемым средствам, в том числе в целях сравнения с доходностью рынка - кривая "БайЭндХолд". Примечания: для выгрузки в эксель в папку Handlers необходимо поместить библиотеку EPPlus, сайт разработчика: epplussoftware.com; выгрузка Не производится при оптимизации и в режиме Агента, то есть получить данные можно только при запуске пересчета в режиме лаборатории.


Для понимания того, что находится внутри Excel-файлов приводится настоящая методика расчета
===========================================================================================

Термины и определения
  • операционная дата - дата, в которую была какая-либо операция в рынке, либо дата начала периода, на которую происходит перенос открытых позиций с прошлого операционной даты, либо дата окончания периода, на которую производится фиксация финансового результата по закрытым и/или открытым позициям - далее по тексту "ОперДата". Термин "Операционный день" не используется, т.к. фактически рынки могут работать круглосуточно, поэтому ОперДата в данном контексте наиболее удачное определение конкретного периода в 24 часа.
  • операционный период - кол-во полных дней с окончания прошлой ОперДаты до конца текущей ОперДаты, то есть включая текущую ОперДату - далее по тексту "ОперПериод".
  • расчетный период - период времени, за который определяется доходность в процентах годовых: весь тестовый исторический период, месяц, год
  • Date - ОперДата
  • LastBar - номер последнего бара ОперДаты
  • MoneyIn - Общая сумма денежных средств поступившая в рынок в связи с открытием длинной/короткой позиции (включая комиссии)
  • MoneyOut - Общая сумма денежных средств полученная с рынка в связи с закрытием длинной/короткой позиции (за минусом комиссий)
  • MoneyInFact - сумма денежных средств фактически поступившая в рынок в связи с открытием длинной/короткой позиции (включая комиссии). Более детальная информация указана в описании расчета AccumOperSum
Для упрощения расчетов принимается следующие допущения:
  • время вклада/изъятия денежных средств внутри ОперДаты не учитывается, вклад денежных средств в рынок считается совершенным в начала ОперДаты, а изъятие денежных средств считается произведенным в момент окончания ОперДаты. Имеющиеся и/или вложенные на начало ОперДаты денежные средства сохраняются до ее окончания и изымаются только в конце ОперДаты, то есть фактически принимается допущение, что все входы в позицию осуществляются в начале ОперДаты, а выход из позиций - в конце ОперДаты, равно как и имеющиеся на начало ОперДаты открытые позиции считаются действующими до конца ОперДаты
  • бОльшая точность до движений внутри дня по задумке автора не требуется, точность расчета доходности на основании удержания денежных средств в течение одного дня вполне удовлетворяет необходимой цели расчета - получение оценки фактической эффективности использования денежных средств с учетом времени их удержания в рынке в пересчете на процент годовых
  • инфляция денежных средств за время исторического периода не учитывается
  • расчет производится для условных единиц стоимости инструмента, выражаемых в платформе ТСЛаб в пунктах без учета фактической стоимости пункта и/или изменения курса условной единицы стоимости за время теста на историческом периоде

Расчетные величины:
  • DayBalance - сальдо ден.потоков ОперДаты. Равно разности вложенных и изъятых с рынка денежных средств в ОперДату
  • AccumDayBalance - накопительный итог на момент окончания каждой ОперДаты. Рассчитывается как накопительный итог DayBalance всех ОперДат до текущей, включая DayBalance текущей ОперДаты, то есть сальдо за несколько ОперДат с начала расчетного периода и до текущей ОперДаты включительно
  • OperBalance - сумма денежных средств в рынке на конец прошлого ОперПериода, которая используется в текущем ОперПериоде, то есть фактически это остаток в рынке после окончания прошлого ОперПериода, который сохраняется в рынке до окончания текущего операционного периода. Рассчитывается как сумма прошлого операционного дня + DayBalance текущего дня
  • Trades - количество трейдов в течение ОперДаты. Под трейдом понимается любой изменение позиции, будь то вход в позицию, выход из позиции или изменение размера позиции посредством блока "изменить по", либо через API
  • Days - продолжительность ОперПериода в днях. Продолжительность ОперПериода считается нулевой, если в этом периоде OperBalance имел нулевое значение , т.к. фактически в рынке не было никакой суммы. При этом, если в финальную дату ОперПериода было внесение денежных средств, что будет отражено в графе MoneyIn, то продолжительность данного ОперПериода будет равна одному дню, т.к. в этом случае внесенные денежные средства в начале финальной ОперДаты ОперПериода в соответствии с принятыми допущениями по расчету отработают ровно один день
  • AccumDays - накопительное кол-во дней всех ОперПериодов, величина, необходимая для расчета средней ежедневной суммы в рынке на протяжении расчетного периода, рассчитывается как сумма продолжительности всех ОперПериодов с начала расчетного периода
  • AccumOperSum - накопительная операционная сумма (далее - ОперСумма) с начала расчетного периода. Рассчитывается как сумма ОперСумм каждого ОперПериода, которые в свою очередь рассчитываются как OperBalance*Days + MoneyInFact, то есть общая сумма всех денежных средств ОперПериода за каждую ОперДату.
  • MoneyInFact - это сумма, которая дополнительно поступила в рынок на начало ОперДаты (с учетом допущения о вносе всех средств на начало ОперДаты) к сумме, имеющейся в рынке на конец предыдущего ОперПериода. Рассчитывается следующим образом:
    • если в ОперДату MoneyIn=0, то MoneyInFact=0
    • если в ОперДату имеется только одна операция и это операция внесения, то MoneyInFact=MoneyIn;
    • если в ОперДату имеется больше, чем одна операция MoneyInFact считается исходя из фактической очередности поступления/изъятия денежных средств по номерам баров внутри ОперДаты, в итоге получая фактическую сумму внесение денежных средств к сумме на конец предыдущего ОперПериода. Разницы MoneyInFact и DayBalance в том, что DayBalance фактически это сальдо дебетового и кредитового оборота ОперДаты, а для расчета эффективности с учетом принятых допущений требуется узнать именно сумму, которая была дополнительно внесена на начало ОперДаты, чтобы обеспечить нужный оборот внутри дня, то есть фактически это сальдо оборотов поступления и изъятия до бара последнего поступления, остальной оборот изъятия для данного расчета не учитывается. Если сальдо получится отрицательным, то MoneyInFact приравнивается к нулю, т.к. по сути все внесенные на ОперДату средства были предварительно взяты из рынка и дополнительный вклад не делался, но при этом если первая или первые операция (операции) были операцией внесением средств, то MoneyInFact будет равен сумме этой операции даже при отрицательном сальдо, т.к. чтобы обеспечить открытие позиций в этот день трейдер должен был добавить в рынок дополнительные средства, что учитывается данным расчетом
  • PosCost - стоимость открытых позиций на последний бар ОперДаты. Рассчитывается как произведение кол-во лотов открытых позиций, размер лота и цены закрытия последнего бара ОперДаты. В случае если на конец общей тестируемой истории имеется открытая позиции, то она будет фиктивно в расчетных целях считаться закрытой, в строке закрытия данной позиции будет указано "HystoryEnd", соответственно, стоимость такой позиции будет равна нулю
  • Profit - прибыль в пунктах на конец ОперДаты. Рассчитывается PosCost - AccumDayBalance, то есть стоимость позиций на текущую минус накопительный итог на ОперДату
  • ProfitPctAnn - доходность денежных средств в расчетном периоде в пересчете на процентов годовых исходя из фактической средневзвешенной суммы в рынке в течение расчетного периода. Показывает фактическую доходность денежных средств (с учетом допущения об инфляции ДС), использованных в стратегии.

ПРИМЕЧАНИЯ:
============
  • расчет работает только для одного инструмента, стратегии с несколькими инструментами будут показывать неверные данные. Для этих целей кубик не писался, т.к. у автора кубика отсутствуют соответствующие потребности
  • для выгрузки в эксель в папку Handlers необходимо поместить библиотеку EPPlus, сайт разработчика: epplussoftware.com или взять приложенную к настоящему посту dll
  • тестирование было произведено на нескольких скриптах, в том числе с пересчетов в Excel вручную, при наличии ошибок просьба написать в личку (координаты выше в посте)


Attachments
EPPlus.zip (77 downloads)
gaaCommon_ServiceLib.zip (56 downloads)
gaaStatData_PeriodStatistic.zip (53 downloads)
НовыеПараметры.jpg (1126 downloads)
ПанельДоходности.jpg (1130 downloads)
ПользовательскиеПараметры.jpg (1145 downloads)



Отредактировано AleksandrGanov (Tue Mar 30 2021 12:26 PM)