Коэффициент Сортино
Коэффициент Сортино показывает, как относится полученная доходность к риску. Данный показатель по многим параметрам схож с коэффициентом Шарпа. Однако основное отличие состоит в разной оценке рисков. У коэф. Шарпа риском является волатильность инвестиционного портфеля, а в коэф. Сортино риск рассматривается как нисходящая волатильность. С момента расчёта данного коэффициента была решена одна из главных проблем — это учёт положительной волатильности. Она перестала явятся риском и ее исключение предоставило возможность сделать расчёты наиболее точными и справедливыми. Значение коэф. Сортино выше 2 единиц может говорить нам о высокой результативности управления фондом управляющей компанией. Значения от 0 до 2 – показывают нам о достаточно высоких рисках при управлении фондом. Показатели меньше 0 – свидетельствуют о наличии в портфеле убыточных активов.
Термины из этой же категории
- Открытый ПИФ
- Коэффициент Шарпа
- Коэффициент Сортино
- О сайте
- Написать нам
- Правовая информация
- Получить данные / Заказать данные
- Investfunds-PRO
- FAQ
- Портфель инвестора
Copyright © 2003-2023 Investfunds
Другие проекты группы компаний Cbonds
- Cbonds
- Cbonds-Congress
- Private equity and venture capital
- Cbonds Review
Этот веб-сайт использует файлы cookie для обеспечения удобного и персонализированного просмотра. Файлы cookie хранят полезную информацию на вашем компьютере для того, чтобы мы могли улучшить оперативность и точность нашего сайта для вашей работы. В некоторых случаях файлы cookie необходимы для обеспечения корректной работы сайта. Заходя на данный сайт, вы соглашаетесь на использование файлов cookie.
Калькулятор коэффициента Сортино
Коэффициент Сортино (англ. Sortino Ratio) — это показатель, который измеряет доходность портфеля с поправкой на риск. Он схож с коэффициентом Шарпа, но в качестве меры риска использует нисходящую волатильность.
Коэффициент Сортино представляет собой отношение избыточной доходности портфеля к риску и широко используется как показатель «качества» управления инвестиционным фондом или портфелем. Данный индикатор напоминает более распространенный коэффициент Шарпа, ключевое отличие заключается в том, как оценивается риск.
В коэффициенте Шарпа в качестве меры риска используется волатильность инвестиционного портфеля (стандартное отклонение). При этом учитывается как движение цены портфеля в верх, так и вниз. Фактически, резкие скачки цены портфеля вверх способны существенно занизить коэффициент Шарпа, так как они влияют на общую волатильность. Однако это бессмысленно, так как большинство инвесторов приветствуют большие положительные доходы.
Для того, чтобы обойти данное ограничение в начале 80-х доктор Френк Сортино предложил улучшенную формулу для расчета доходности с поправкой на риск. В этой формуле мерой риска выступает нисходящая волатильность, т.е. волатильность доходности портфеля ниже заданного уровня. Все доходы, находящиеся выше этого ровня, не учитываются как риск и не занижают итоговый коэффициент Сортино.
Что означают результаты коэффициента Сортино
При сравнении инвестиционных фондов или портфелей, инвесторам стоит учитывать не только доходность, но и сопряженные с ней риски. При равной доходности, один фонд может получить ее лишь за счет принятия больших рисков, тогда как другой за счет применения более успешной стратегии. Коэффициент Сортино как раз призван помочь в этом сравнении: чем он выше, тем выше доходность инструмента с поправкой на риск. При прочих равных, фонд или портфель с более высоким коэффициентом Сортино является более предпочтительным инвестиционным вложением.
- Отрицательный коэффициент Сортино означает, что безрисковая ставка выше доходности портфеля. Значения ниже нуля не несут никакой значимой информации.
- Коэффициент Сортино от 0 до 1,0 считается недостаточным.
- Коэффициент Сортино более 1,0 считается приемлемым.
- Коэффициент Сортино выше 2,0 считается очень хорошим.
- Коэффициент Сортино 3,0 или выше считается отличным.
Математика в трейдинге: Коэффициенты Шарпа и Сортино
Доходность является самым очевидным показателем, который используют инвесторы и начинающие трейдеры для анализа эффективности торговли. Профессиональные трейдеры пользуются более надежными инструментами для анализа стратегии, среди них — коэффициенты Шарпа и Сортино. В этой статье мы расскажем на простых примерах, как они считаются. Тема оценки торговых стратегий уже рассматривалась в предыдущей статье » Математика в трейдинге. Оценка результатов торговых сделок». Рекомендуем почитать эту статью, чтобы освежить знания или узнать что-то новое для себя.
Коэффициент Шарпа
Опытные инвесторы и трейдеры знают, что для получения стабильных результатов необходимо торговать несколькими стратегиями или инвестировать в несколько разных ценных бумаг. Это одна из концепций разумного инвестирования, которая предполагает создание инвестиционного портфеля. Каждый портфель бумаг/стратегий будет иметь свои параметры риска и доходности, поэтому требуется как-то сравнивать их между собой.
Один из первых инструментов такого сравнения — коэффициент Шарпа — был разработан в 1966 году будущим нобелевским лауреатом Уильямом Шарпом. Основные показатели, используемые этим инструментом, — это средняя доходность, стандартное отклонение доходности и безрисковая доходность.
Недостаток коэффициента Шарпа в том, что исходные данные для его анализа должны быть нормально распределены. Иными словами, график распределения доходностей должен быть симметричным и не должен иметь резких пиков или падений.
Расчёт коэффициента Шарпа производится по следующей формуле:
Sharpe Ratio = (Return - RiskFree)/Std
- Return — среднее значение дохода за некий период. Например, за месяц, квартал, год и т.д.
- RiskFree — значение безрискового дохода за тот же промежуток времени. Это может быть процент на депозит в банке, облигации и другие финансовые инструменты с минимальным риском и 100-процентной надежностью.
- Std — стандартное отклонение доходностей за этот же период. Чем сильнее разброс доходностей, тем выше риск и выше волатильность испытывает счет трейдера/активы портфеля/средства под управлением фонда.
Доходность
Доходность вычисляется как изменение стоимости активов за какой-то интервал. Значения доходностей берутся за тот период времени, на который рассчитывается коэффициент Шарпа. Как правило, рассматривают значение коэффициента Шарпа за год, но можно рассчитывать квартальные, месячные и даже дневные значения. Доходности рассчитываются по формуле:
Return[i] = (Close[i]-Close[i-1])/Close[i-1]
- Return[i] — доходность за интервала с индексом i;
- Close[i] — стоимость активов на конец i-го интервала;
- Close[i-1] — стоимость активов на конец предыдущего интервала.
Другими словами, доходность можно записать как относительное изменение стоимости активов за интервал:
Return[i] = Delta[i]/Previous
- Delta[i] = (Close[i]-Close[i-1]) — абсолютное изменение стоимости активов за интервал;
- Previous = Close[i-1] — стоимость активов на конец предыдущего интервала.
Для того чтобы посчитать коэффициент Шарпа на дневных значениях за год, нам нужно взять значения доходностей за каждый день в течение этого года и вычислить среднюю дневную доходность как сумму доходностей, поделенную на количество дней, которые попали в расчет.
Return = Sum(Return[i])/N
где N — количество дней.
Безрисковый доход
Понятие безрискового дохода условно, так как риск есть всегда. Кроме того, так как коэффициент Шарпа используют для сравнения различных стратегий/портфелей на одинаковом интервале времени, то проще всего принять безрисковый доход равным нулю. То есть
RiskFree = 0
Стандартное отклонение доходностей
Стандартное отклонение показывает разброс случайной величины вокруг среднего значения. Сначала вычисляется среднее значение доходности, затем складываются квадраты отклонений доходностей от среднего значения. Полученную сумму делится на количество доходностей — это дисперсия. Квадратный корень из дисперсии — это и есть стандартное отклонение доходностей.
D = Sum((Return - Return[i])^2 )/N STD = SQRT(D)
Пример расчета стандартного отклонения дается в упомянутой ранее статье.
Расчет коэффициента Шарпа на любом таймфрейме и приведение его к годовому значению
Расчет коэффициента Шарпа не изменился с 1966 года, а современное название этот показатель получил после всемирного признания его методики. В то время оценку фондов и портфелей делали на основании доходов, полученных за несколько лет. Позже стали делать расчеты на месячных данных и переводить полученный коэффициент Шарпа в годовое значение. Таким образом можно сравнивать два фонда/портфеля/стратегии.
Коэффициент Шарпа легко масштабируется на разных интервалах и таймфреймах к годовому значению. Для этого нужно полученное значение умножить на корень квадратный из отношения годового интервала к текущему. Покажем на простом примере.
Пусть мы рассчитали коэффициент Шарпа на дневных значениях доходности — SharpeDaily. Теперь нам нужно полученный показатель привести к годовому значению SharpeAnnual. Годовой коэффициент пропорционален квадратному корню соотношения периодов — проще говоря, сколько интервалов укладывается в год. Так как в году 252 рабочих дня, то коэффициент Шарпа, полученный на дневных доходностях, нужно умножить на корень квадратный из 252. Это и будет годовое значение коэффициента Шарпа:
SharpeAnnual = SQRT(252)*SharpeDaily // в году 252 рабочих дня
Если считать на таймфрейме H1, то принцип остается тот же — сначала приводим SharpeHourly к SharpeDaily, а затем получаем годовой коэффициент Шарпа. Один бар на таймфрейме D1 содержит в себе 24 бара H1, поэтому формула будет такой:
SharpeDaily = SQRT(24)*SharpeHourly // в D1 входит 24 часа
Хотя не все финансовые инструменты торгуются 24 часа в сутки, но для целей оценки торговых стратегий в тестере на одном и том же инструменте это не имеет значения, так как сравнение стратегий происходит на одном и том же периоде тестирования и таймфрейме.
Оценка стратегий с помощью коэффициента Шарпа
В зависимости от показателей стратегии/портфеля Sharpe Ratio может принимать любые значения, в том числе и отрицательные. Приведение коэффициента Шарпа к годовому значению позволяет трактовать его классическим образом:
Значение | Оценка | Описание |
---|---|---|
Sharpe Ratio < 0 | Плохо | Стратегия убыточна, не годится |
0 < Sharpe Ratio < 1.0 | Неопределенно | Риск не окупается. Такие стратегии могут браться в работу, если нет альтернатив |
Sharpe Ratio ≥ 1.0 | Хорошо | Если коэффициент Шарпа превышает единицу, это означает, что риск окупается, портфель/стратегия работает |
Sharpe Ratio ≥ 3.0 | Очень хорошо | Высокий показатель говорит о том, что вероятность получить убыток в каждой конкретной сделке очень мала |
Нужно помнить, что коэффициент Шарпа — обычный статистический показатель. Это просто доходность отнесенная к риску. Поэтому при анализе портфелей и стратегий важно соотносить Sharpe Ratio с рекомендованными значениями и/или между собой.
Расчет коэффициента Шарпа на EURUSD за 2020 год
Коэффициент Шарпа изначально разрабатывался для оценки портфелей, которые всегда имеют в своем составе множество акций. Стоимость акций изменяется каждый день, соответственно изменяется и стоимость портфеля. Таким образом, снимать изменение стоимости и доходности можно на любом таймфрейме. Мы проведем вычисления на валютной паре EURUSD.
Расчеты сделаем на таймфреймах H1 и D1, затем приведем к годовому значению и сравним, чтобы понять — есть ли разница и почему. Вычисления будем делать по ценам закрытия баров в течение 2020 года.
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() < //--- double H1_close[],D1_close[]; double h1_returns[],d1_returns[]; datetime from = D'01.01.2020'; datetime to = D'01.01.2021'; int bars = CopyClose("EURUSD",PERIOD_H1,from,to,H1_close); if(bars == -1) Print("CopyClose(\"EURUSD\",PERIOD_H1,01.01.2020,01.01.2021 failed. Error ",GetLastError()); else < Print("\nВычислим среднее и среднеквадратичное отклонение доходностей на барах H1"); Print("H1 bars functions">ArraySize(H1_close)); GetReturns(H1_close,h1_returns); double average = ArrayMean(h1_returns); PrintFormat("H1 average=%G",average); double std = ArrayStd(h1_returns); PrintFormat("H1 std=%G",std); double sharpe_H1 = average / std; PrintFormat("H1 Sharpe=%G",sharpe_H1); double sharpe_annual_H1 = sharpe_H1 * MathSqrt(ArraySize(h1_returns)); Print("Sharpe_annual(H1) functions">CopyClose("EURUSD",PERIOD_D1,from,to,D1_close); if(bars == -1) Print("CopyClose(\"EURUSD\",PERIOD_D1,01.01.2020,01.01.2021 failed. Error ",GetLastError()); else < Print("\nВычислим среднее и среднеквадратичное отклонение доходностей на барах D1"); Print("D1 bars functions">ArraySize(D1_close)); GetReturns(D1_close,d1_returns); double average = ArrayMean(d1_returns); PrintFormat("D1 average=%G",average); double std = ArrayStd(d1_returns); PrintFormat("D1 std=%G",std); double sharpe_D1 = average / std; double sharpe_annual_D1 = sharpe_D1 * MathSqrt(ArraySize(d1_returns)); Print("Sharpe_annual(H1) comment">//+------------------------------------------------------------------+ //| Заполняет массив доходностей returns[] | //+------------------------------------------------------------------+ void GetReturns(const double & values[], double & returns[]) < int size = ArraySize(values); //--- если меньше 2-х значений, то возвращаем пустой массив доходностей if(size < 2) < ArrayResize(returns,0); PrintFormat("%s: Error. ArraySize(values)=%d",size); return; > else < //--- заполним в цикле доходности ArrayResize(returns, size - 1); double delta; for(int i = 1; i < size; i++) < returns[i - 1] = 0; if(values[i - 1] != 0) < delta = values[i] - values[i - 1]; returns[i - 1] = delta / values[i - 1]; > > > //--- > //+------------------------------------------------------------------+ //| Вычисляет среднее значение элементов массива | //+------------------------------------------------------------------+ double ArrayMean(const double & array[]) < int size = ArraySize(array); if(size < 1) < PrintFormat("%s: Error, array is empty",__FUNCTION__); return(0); > double mean = 0; for(int i = 0; i < size; i++) mean += array[i]; mean /= size; return(mean); > //+------------------------------------------------------------------+ //| Вычисляет стандартное отклонение элементов массива | //+------------------------------------------------------------------+ double ArrayStd(const double & array[]) < int size = ArraySize(array); if(size < 1) < PrintFormat("%s: Error, array is empty",__FUNCTION__); return(0); > double mean = ArrayMean(array); double std = 0; for(int i = 0; i < size; i++) std += (array[i] - mean) * (array[i] - mean); std /= size; std = MathSqrt(std); return(std); > //+------------------------------------------------------------------+ /* Результат Вычислим среднее и среднеквадратичное отклонение доходностей на барах H1 H1 bars:6226 H1 average=1.44468E-05 H1 std=0.00101979 H1 Sharpe=0.0141664 Sharpe_annual(H1)=1.117708053392263 Вычислим среднее и среднеквадратичное отклонение доходностей на барах D1 D1 bars:260 D1 average=0.000355823 D1 std=0.00470188 Sharpe_annual(H1)=1.2179005039019222 */
Код на Python для вычисления с помощью библиотеки MetaTrader 5
import math from datetime import datetime import MetaTrader5 as mt5 # выведем данные о пакете MetaTrader5 print("MetaTrader5 package author: ", mt5.__author__) print("MetaTrader5 package version: ", mt5.__version__) # импортируем модуль pandas для вывода полученных данных в табличной форме import pandas as pd pd.set_option('display.max_columns', 50) # сколько столбцов показываем pd.set_option('display.width', 1500) # макс. ширина таблицы для показа # импортируем модуль pytz для работы с таймзоной import pytz # установим подключение к терминалу MetaTrader 5 if not mt5.initialize(): print("initialize() failed") mt5.shutdown() # установим таймзону в UTC timezone = pytz.timezone("Etc/UTC") # создадим объекты datetime в таймзоне UTC, чтобы не применялось смещение локальной таймзоны utc_from = datetime(2020, 1, 1, tzinfo=timezone) utc_to = datetime(2020, 12, 31, hour=23, minute=59, second=59, tzinfo=timezone) # получим бары с EURUSD H1 в интервале 2020.01.01 00:00 - 2020.31.12 13:00 в таймзоне UTC rates_H1 = mt5.copy_rates_range("EURUSD", mt5.TIMEFRAME_H1, utc_from, utc_to) # получим также бары с D1 в интервале 2020.01.01 00:00 - 2020.31.12 13:00 в таймзоне UTC rates_D1 = mt5.copy_rates_range("EURUSD", mt5.TIMEFRAME_D1, utc_from, utc_to) # завершим подключение к терминалу MetaTrader 5 и продолжим обработку полученных баров mt5.shutdown() # создадим из полученных данных DataFrame rates_frame = pd.DataFrame(rates_H1) # добавим столбец"Доходность" rates_frame['return'] = 0.0 # теперь вычислим доходности как return[i] = (close[i] - close[i-1])/close[i-1] prev_close = 0.0 for i, row in rates_frame.iterrows(): close = row['close'] rates_frame.at[i, 'return'] = close / prev_close - 1 if prev_close != 0.0 else 0.0 prev_close = close print("\nВычислим среднее и среднеквадратичное отклонение доходностей на H1 барах") print('H1 rates:', rates_frame.shape[0]) ret_average = rates_frame[1:]['return'].mean() # не берем первую строку с нулевой доходностью print('H1 return average=', ret_average) ret_std = rates_frame[1:]['return'].std(ddof=0) # не берем первую строку с нулевой доходностью print('H1 return std =', ret_std) sharpe_H1 = ret_average / ret_std print('H1 Sharpe = Average/STD = ', sharpe_H1) sharpe_annual_H1 = sharpe_H1 * math.sqrt(rates_H1.shape[0]-1) print('Sharpe_annual(H1) =', sharpe_annual_H1) # теперь вычислим коэффициент Шарпа на таймфрейме D1 rates_daily = pd.DataFrame(rates_D1) # добавим столбец "Доходность" rates_daily['return'] = 0.0 # теперь вычислим доходности prev_return = 0.0 for i, row in rates_daily.iterrows(): close = row['close'] rates_daily.at[i, 'return'] = close / prev_return - 1 if prev_return != 0.0 else 0.0 prev_return = close print("\nВычислим среднее и среднеквадратичное отклонение доходностей на D1 барах") print('D1 rates:', rates_daily.shape[0]) daily_average = rates_daily[1:]['return'].mean() print('D1 return average=', daily_average) daily_std = rates_daily[1:]['return'].std(ddof=0) print('D1 return std =', daily_std) sharpe_daily = daily_average / daily_std print('D1 Sharpe =', sharpe_daily) sharpe_annual_D1 = sharpe_daily * math.sqrt(rates_daily.shape[0]-1) print('Sharpe_annual(D1) =', sharpe_annual_D1) Результат Вычислим среднее и среднеквадратичное отклонение доходностей на H1 барах H1 rates: 6226 H1 return average= 1.4446773215242986e-05 H1 return std = 0.0010197932969323495 H1 Sharpe = Average/STD = 0.014166373968823358 Sharpe_annual(H1) = 1.117708053392236 Вычислим среднее и среднеквадратичное отклонение доходностей на D1 барах D1 rates: 260 D1 return average= 0.0003558228355051694 D1 return std = 0.004701883757646081 D1 Sharpe = 0.07567665511222807 Sharpe_annual(D1) = 1.2179005039019217
Видно, что результаты вычислений на MQL5 и Python совпадают. Исходные коды приложены к статье (CalculateSharpe_2TF).
При этом годовое значение коэффициента Шарпа, полученного на барах H1 и D1, отличаются между собой — 1.117708 против 1.217900. Изучим этот вопрос более детально.
Вычисление годового коэффициента Шарпа на EURUSD за 2020 год на всех таймфреймах
Вычислим таким же способом годовой коэффициент Шарпа на всех таймфреймах. Для этого полученные данные соберем в таблицу:
- TF — таймфрейм
- Minutes — сколько минут в таймфрейме
- Rates — количество баров за год на данном таймфрейме
- Avg — средняя доходность на таймфрейме за бар в процентах (средний процент изменения цены за бар)
- Std — стандартное отклонение на таймфрейме за бар в процентах (волатильность цены в процентах на данном таймфрейме)
- SharpeTF — коэффициент Шарпа, рассчитанный на данном таймфрейме
- SharpeAnnual — годовой коэффициент Шарпа, который вычисляется на основании Шарпа на данном таймфрейме
Приведем блок кода для вычисления. Полный код — в приложенном файле CalculateSharpe_All_TF.mq5.
//--- структура для вывода статистики в лог struct Stats < string TF; int Minutes; int Rates; double Avg; double Std; double SharpeTF; double SharpeAnnual; >; //--- массив статистики по таймфреймам Stats stats[]; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() < //---массивы для цен закрытия double H1_close[],D1_close[]; //--- массивы доходностей double h1_returns[],d1_returns[]; //--- массив таймфреймов, на которых будем считать коэффициент Шарпа ENUM_TIMEFRAMES timeframes[] = PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5, PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20, PERIOD_M30,PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4, PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1 >; ArrayResize(stats,ArraySize(timeframes)); //--- параметры запроса таймсерии string symbol = Symbol(); datetime from = D'01.01.2020'; datetime to = D'01.01.2021'; Print(symbol); for(int i = 0; i < ArraySize(timeframes); i++) < //--- получим массив доходностей на указанном таймфрейме double returns[]; GetReturns(symbol,timeframes[i],from,to,returns); //--- вычислим статистику GetStats(returns,avr,std,sharpe); double sharpe_annual = sharpe * MathSqrt(ArraySize(returns)); PrintFormat("%s aver=%G%% std=%G%% sharpe=%G sharpe_annual=%G", EnumToString(timeframes[i]), avr * 100,std * 100,sharpe,sharpe_annual); //--- заполним структуру статистики Stats row; string tf_str = EnumToString(timeframes[i]); StringReplace(tf_str,"PERIOD_",""); row.TF = tf_str; row.Minutes = PeriodSeconds(timeframes[i]) / 60; row.Rates = ArraySize(returns); row.Avg = avr; row.Std = std; row.SharpeTF = sharpe; row.SharpeAnnual = sharpe_annual; //--- добавим строку статистики для таймфрема stats[i] = row; > //--- выведем в журнал статистику по всем таймфреймам ArrayPrint(stats,8); > /* Результат [TF] [Minutes] [Rates] [Avg] [Std] [SharpeTF] [SharpeAnnual] [ 0] "M1" 1 373023 0.00000024 0.00168942 0.00168942 1.03182116 [ 1] "M2" 2 186573 0.00000048 0.00239916 0.00239916 1.03629642 [ 2] "M3" 3 124419 0.00000072 0.00296516 0.00296516 1.04590258 [ 3] "M4" 4 93302 0.00000096 0.00341717 0.00341717 1.04378592 [ 4] "M5" 5 74637 0.00000120 0.00379747 0.00379747 1.03746116 [ 5] "M6" 6 62248 0.00000143 0.00420265 0.00420265 1.04854166 [ 6] "M10" 10 37349 0.00000239 0.00542100 0.00542100 1.04765562 [ 7] "M12" 12 31124 0.00000286 0.00601079 0.00601079 1.06042363 [ 8] "M15" 15 24900 0.00000358 0.00671964 0.00671964 1.06034161 [ 9] "M20" 20 18675 0.00000477 0.00778573 0.00778573 1.06397070 [10] "M30" 30 12450 0.00000716 0.00966963 0.00966963 1.07893298 [11] "H1" 60 6225 0.00001445 0.01416637 0.01416637 1.11770805 [12] "H2" 120 3115 0.00002880 0.01978455 0.01978455 1.10421905 [13] "H3" 180 2076 0.00004305 0.02463458 0.02463458 1.12242890 [14] "H4" 240 1558 0.00005746 0.02871564 0.02871564 1.13344977 [15] "H6" 360 1038 0.00008643 0.03496339 0.03496339 1.12645075 [16] "H8" 480 779 0.00011508 0.03992838 0.03992838 1.11442404 [17] "H12" 720 519 0.00017188 0.05364323 0.05364323 1.22207717 [18] "D1" 1440 259 0.00035582 0.07567666 0.07567666 1.21790050 [19] "W1" 10080 51 0.00193306 0.14317328 0.14317328 1.02246174 [20] "MN1" 43200 12 0.00765726 0.43113365 0.43113365 1.49349076 */
Построим гистограмму коэффициента Шарпа EURUSD за 2020 год по таймфреймам. Видно, что на минутных таймфреймах от M1 до M30 вычисления дают близкий результат от 1.03 до 1.08. Самые нестабильные результаты на таймфреймах от H12 до MN1.
Расчет коэффициента Шарпа за 2020 год на GBPUSD, USDJPY и USDCHF
Сделаем такие же расчеты еще на трех основных валютных парах.
GBPUSD, значения коэффициента Шарпа получились близкими на таймфреймах от M1 до H12.
USDJPY, значения также получились близкими на таймфреймах от M1 до H12 — от -0.56 до -0.60.
USDCHF, близкие значения на таймфреймах от M1 до M30. С ростом таймфрейма коэффициент Шарпа испытывает колебания.
Таким образом, на примере 4-х основных валютных пар можно сделать вывод, что наиболее стабильные вычисления коэффициента Шарпа получаются на таймфреймах от M1 до M30. То есть для расчетов лучше брать значения доходности именно на мелких таймфреймах, если нужно сравнивать между собой стратегии, работающие на разных символах.
Вычисление годового коэффициента Шарпа на EURUSD за 2020 год по каждому месяцу
Возьмем доходности внутри каждого месяца за 2020 год и посчитаем годовое значение Sharpe Ratio на таймфреймах от M1 до H1. Полный код скрипта CalculateSharpe_Months.mq5 приложен к статье.
//--- структура для хранения доходности struct Return < double ret; // доходность datetime time; // дата int month; // месяц >; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() < SharpeMonths sharpe_by_months[]; //--- массив таймфреймов, на которых будем считать коэффициент Шарпа ENUM_TIMEFRAMES timeframes[] = PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5, PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20, PERIOD_M30,PERIOD_H1 >; ArrayResize(sharpe_by_months,ArraySize(timeframes)); //--- параметры запроса таймсерии string symbol = Symbol(); datetime from = D'01.01.2020'; datetime to = D'01.01.2021'; Print("Calculate Sharpe Annual on ",symbol, " for 2020 year"); for(int i = 0; i < ArraySize(timeframes); i++) < //--- получим массив доходностей на указанном таймфрейме Return returns[]; GetReturns(symbol,timeframes[i],from,to,returns); double avr,std,sharpe; //--- вычислим статистику за год GetStats(returns,avr,std,sharpe); string tf_str = EnumToString(timeframes[i]); //--- посчитаем годовое значение Sharpe Ratio на каждом месяце SharpeMonths sharpe_months_on_tf; sharpe_months_on_tf.SetTimeFrame(tf_str); //--- выберем доходности за месяц i for(int m = 1; m 12; m++) < Return month_returns[]; GetReturnsByMonth(returns,m,month_returns); //--- вычислим статистику за год double sharpe_annual = CalculateSharpeAnnual(timeframes[i],month_returns); sharpe_months_on_tf.Sharpe(m,sharpe_annual); > //--- добавим значения коэффициента Шарпа для 12 месяцев на таймфрейме i sharpe_by_months[i] = sharpe_months_on_tf; > //--- выведем таблицу годовых значений Шарпа помесячно на всех таймфреймах ArrayPrint(sharpe_by_months,3); > /* Результат Calculate Sharpe Annual on EURUSD for 2020 year [TF] [Jan] [Feb] [Marc] [Apr] [May] [June] [July] [Aug] [Sept] [Oct] [Nov] [Dec] [ 0] "PERIOD_M1" -2.856 -1.340 0.120 -0.929 2.276 1.534 6.836 2.154 -2.697 -1.194 3.891 4.140 [ 1] "PERIOD_M2" -2.919 -1.348 0.119 -0.931 2.265 1.528 6.854 2.136 -2.717 -1.213 3.845 4.125 [ 2] "PERIOD_M3" -2.965 -1.340 0.118 -0.937 2.276 1.543 6.920 2.159 -2.745 -1.212 3.912 4.121 [ 3] "PERIOD_M4" -2.980 -1.341 0.119 -0.937 2.330 1.548 6.830 2.103 -2.765 -1.219 3.937 4.110 [ 4] "PERIOD_M5" -2.929 -1.312 0.120 -0.935 2.322 1.550 6.860 2.123 -2.729 -1.239 3.971 4.076 [ 5] "PERIOD_M6" -2.945 -1.364 0.119 -0.945 2.273 1.573 6.953 2.144 -2.768 -1.239 3.979 4.082 [ 6] "PERIOD_M10" -3.033 -1.364 0.119 -0.934 2.361 1.584 6.789 2.063 -2.817 -1.249 4.087 4.065 [ 7] "PERIOD_M12" -2.952 -1.358 0.118 -0.956 2.317 1.609 6.996 2.070 -2.933 -1.271 4.115 4.014 [ 8] "PERIOD_M15" -3.053 -1.367 0.118 -0.945 2.377 1.581 7.132 2.078 -2.992 -1.274 4.029 4.047 [ 9] "PERIOD_M20" -2.998 -1.394 0.117 -0.920 2.394 1.532 6.884 2.065 -3.010 -1.326 4.074 4.040 [10] "PERIOD_M30" -3.008 -1.359 0.116 -0.957 2.379 1.585 7.346 2.084 -2.934 -1.323 4.139 4.034 [11] "PERIOD_H1" -2.815 -1.373 0.116 -0.966 2.398 1.601 7.311 2.221 -3.136 -1.374 4.309 4.284 */
Видно, что значения годового коэффициента для каждого месяца очень близки на всех таймфреймах, на которых проведены вычисления. Для лучшего представления полученные результаты изобразим в виде 3D-поверхности с помощью диаграммы в Excel.
На графике хорошо видно, что значения годового коэффициента Шарпа на каждом месяце меняются. Это зависит от того, как изменялся график EURUSD в этом месяце. Но при этом значение годового коэффициента Шарпа для каждого месяца на всех таймфреймах почти не меняется.
Таким образом, годовой Sharpe Ratio мы можем вычислять на любом таймфрейме, при этом полученное значение также не зависит от количества баров, на которых были получены доходности. Это значит, что приведенный алгоритм вычисления можно использовать при тестировании, оптимизации и во время мониторинга в режиме реального времени. Главное, чтобы массив доходностей не был слишком мал по размеру.
Коэффицент Сортино
При расчете коэффициента Шарпа в качестве риска принимается полная волатильность котировок, как в сторону повышения, так и понижения активов. Но повышение стоимости портфеля является выгодным для инвестора, а убыток может причинить только их снижение. Поэтому действительный риск в коэффициенте оказывается завышенным. Коэффициент Сортино, разработанный в начале 90-х годов прошлого века Фрэнком Сортино, позволяет решить эту проблему.
Как и его предшественники, Ф. Сортино рассматривает будущую доходность в качестве случайной величины, равной ее математическому ожиданию, а риск — как дисперсию. Доходность и риск определяются на основе исторических значений котировок за определенный период. Как в расчете коэффициента Шарпа, доходность делится на риск.
Сортино обратил внимание на то, что риск, определенный как общий разброс доходностей (или, по-другому, полная волатильность) зависит как от положительных, так и от отрицательных изменений. Сортино заменил общую дисперсию полудисперсией, которая учитывает только падения активов. Полудисперсию в различных публикациях называют «волатильностью вниз», отрицательной дисперсией, нижней дисперсией или стандартным отклонением убытков.
Коэффициент Сортино считается фактически так же, как и показатель Шарпа, только из расчета волатильности исключаются положительные доходности. Это позволяет уменьшить меру риска и увеличить значение коэффициента.
Пример кода для расчета коэффициента Сортино на основе расчета коэффициента Шарпа. Для вычисления «полудисперсии» берутся только отрицательные доходности .
//+------------------------------------------------------------------+ //| Вычисляет коэффициенты Шарпа и Сортино | //+------------------------------------------------------------------+ void GetStats(ENUM_TIMEFRAMES timeframe, const double & returns[], double & avr, double & std, double & sharpe, double & sortino) < avr = ArrayMean(returns); std = ArrayStd(returns); sharpe = (std == 0) ? 0 : avr / std; //--- теперь уберем положительные доходности и посчитаем Sortino double negative_only[]; int size = ArraySize(returns); ArrayResize(negative_only,size); ZeroMemory(negative_only); //--- скопируем только отрицательные доходности for(int i = 0; i < size; i++) negative_only[i] = (returns[i] >0) ? 0 : returns[i]; double semistd = ArrayStd(negative_only); sortino = avr / semistd; return; >
Приложенный к статье скрипт CalculateSortino_All_TF.mq5 дает такие результаты на EURUSD за 2020 год:
[TF] [Minutes] [Rates] [Avg] [Std] [SharpeAnnual] [SortinoAnnual] [Ratio] [ 0] "M1" 1 373023 0.00000024 0.00014182 1.01769617 1.61605380 1.58795310 [ 1] "M2" 2 186573 0.00000048 0.00019956 1.02194170 1.62401856 1.58914991 [ 2] "M3" 3 124419 0.00000072 0.00024193 1.03126142 1.64332243 1.59350714 [ 3] "M4" 4 93302 0.00000096 0.00028000 1.02924195 1.62618200 1.57998030 [ 4] "M5" 5 74637 0.00000120 0.00031514 1.02303684 1.62286584 1.58632199 [ 5] "M6" 6 62248 0.00000143 0.00034122 1.03354379 1.63789024 1.58473231 [ 6] "M10" 10 37349 0.00000239 0.00044072 1.03266766 1.63461839 1.58290848 [ 7] "M12" 12 31124 0.00000286 0.00047632 1.04525580 1.65215986 1.58062730 [ 8] "M15" 15 24900 0.00000358 0.00053223 1.04515816 1.65256608 1.58116364 [ 9] "M20" 20 18675 0.00000477 0.00061229 1.04873529 1.66191269 1.58468272 [10] "M30" 30 12450 0.00000716 0.00074023 1.06348332 1.68543441 1.58482449 [11] "H1" 60 6225 0.00001445 0.00101979 1.10170316 1.75890688 1.59653431 [12] "H2" 120 3115 0.00002880 0.00145565 1.08797046 1.73062372 1.59068999 [13] "H3" 180 2076 0.00004305 0.00174762 1.10608991 1.77619289 1.60583048 [14] "H4" 240 1558 0.00005746 0.00200116 1.11659184 1.83085734 1.63968362 [15] "H6" 360 1038 0.00008643 0.00247188 1.11005321 1.79507001 1.61710267 [16] "H8" 480 779 0.00011508 0.00288226 1.09784908 1.74255746 1.58724682 [17] "H12" 720 519 0.00017188 0.00320405 1.20428761 2.11045830 1.75245371 [18] "D1" 1440 259 0.00035582 0.00470188 1.20132966 2.04624198 1.70331429 [19] "W1" 10080 51 0.00193306 0.01350157 1.03243721 1.80369984 1.74703102 [20] "MN1" 43200 12 0.00765726 0.01776075 1.49349076 5.00964481 3.35431926
Видно, что практические на всех таймфреймах годовое значение Сортино в 1.60 раз больше, чем коэффициент Шарпа. Но при расчетах на торговых результатах такой четкой закономерности, конечно, не будет. Поэтому имеет смысл сравнивать стратегии/портфели с помощью обоих показателей.
Разница между этими двумя показателями заключается в том, что коэффициент Шарпа показывает в первую очередь волатильность, а коэффициент Сортино действительно показывает уровень дохода на единицу риска. Но не стоит забывать и то, что все эти вычисления делаются на истории, и хорошие значения показателей не дают гарантии прибыли в будущем.
Пример вычисления коэффициента Шарпа в тестере стратегий MetaTrader 5
Коэффициент Шарпа был разработан для оценки портфелей, имеющих в своем составе акции. Цена акций меняется каждый день, следовательно, размер активов также изменяется каждый день. Торговые стратегии по умолчанию не подразумевают наличие открытых позиций, поэтому часть времени состояние торгового счета будет оставаться неизменным. Это означает, что при отсутствии открытых позиций мы будем получать нулевые значения доходности, и вычисление коэффициента Шарпа на таких данных будет недостоверным. Поэтому в расчет нужно брать только бары, на которых состояние торгового счета изменилось. Наиболее подходящим вариантом будет снимать значения эквити на каждом последнем тике бара. Это позволит вычислять коэффициент Шарпа при любом режиме генерации тиков в тестере стратегий MetaTrader 5.
Второй момент, который необходимо учесть — приращение цен в процентах, которое обычно считается как Return[i]=(CloseCurrent-ClosePrevious)/ClosePrevious, имеет определенный недостаток при расчетах. А именно: если цена уменьшилась на 5%, а затем увеличилась на 5%, то мы не получим первоначальное значение. Поэтому вместо обычного относительного приращения цен в статистических исследованиях обычно используют логарифм приращения цен. Логарифмическая доходность (или просто логдоходность) лишена этого недостатка линейной доходности. Она рассчитывается по формуле:
Log_Return =ln(Current/Previous) = ln(Current) — ln(Previous)
Логарифмические доходности удобны тем, что их можно складывать, так как сумма логарифмов эквивалентна произведению относительных доходностей.
Таким образом, алгоритм вычисления коэффициента Шарпа меняется минимально.
//--- вычислим логарифмы приращений из массива эквити for(int i = 1; i < m_bars_counter; i++) < //--- добавляем только если эквити изменилось if(m_equities[i] != prev_equity) < log_return = MathLog(m_equities[i] / prev_equity); // логарифм приращения aver += log_return; // средний логарифм приращений AddReturn(log_return); // заполняем массив логарифмов от приращений counter++; // счетчик доходностей > prev_equity = m_equities[i]; > //--- если значений не хватает для расчета коэффициента Шарпа, вернем 0 if(counter 1) return(0); //--- среднее значение логарифма приращения aver /= counter; //--- вычислим стандартное отклонение for(int i = 0; i < counter; i++) std += (m_returns[i] - aver) * (m_returns[i] - aver); std /= counter; std = MathSqrt(std); //--- коэффициент Шарпа на текущем таймфрейме double sharpe = aver / std;
Полный код вычисления реализован в виде включаемого файла Sharpe.mqh, приложенного к статье. Для вычисления коэффициента Шарпа в виде пользовательского критерия оптимизации подключите данный файл к своему советнику и добавьте несколько строк кода. Покажем, как это сделать, на примере советника «MACD Sample.mq5» из стандартной поставки MetaTrader 5.
#define MACD_MAGIC 1234502 //--- #include#include #include #include #include "Sharpe.mqh" //--- input double InpLots = 0.1;// Lots input int InpTakeProfit = 50; // Take Profit (in pips) input int InpTrailingStop = 30; // Trailing Stop Level (in pips) input int InpMACDOpenLevel = 3; // MACD open level (in pips) input int InpMACDCloseLevel = 2; // MACD close level (in pips) input int InpMATrendPeriod = 26; // MA trend period //--- int ExtTimeOut = 10; // time out in seconds between trade operations CReturns returns; . //+------------------------------------------------------------------+ //| Expert new tick handling function | //+------------------------------------------------------------------+ void OnTick(void) < static datetime limit_time = 0; // last trade processing time + timeout //--- добавляем текущее эквити в массив для вычисления коэффициента Шарпа MqlTick tick; SymbolInfoTick(_Symbol, tick); returns.OnTick(tick.time, AccountInfoDouble(ACCOUNT_EQUITY)); //--- don't process if timeout if(TimeCurrent() >= limit_time) < //--- check for data if(Bars(Symbol(), Period()) > 2 * InpMATrendPeriod) < //--- change limit time by timeout in seconds if processed if(ExtExpert.Processing()) limit_time = TimeCurrent() + ExtTimeOut; > > > //+------------------------------------------------------------------+ //| Tester function | //+------------------------------------------------------------------+ double OnTester(void) < //--- вычислим коэффициент Шарпа double sharpe = returns.OnTester(); return(sharpe); > //+------------------------------------------------------------------+
Получившийся код сохраним с новым именем «MACD Sample Sharpe.mq5», он также приложен к статье.
Запустим генетическую оптимизацию на EURUSD M10 за 2020 год, выбрав пользовательский критерий оптимизации.
Полученные значения пользовательского критерия совпадают с коэффициентом Шарпа, который посчитал тестер стратегий. Теперь вы знаете механизм расчета и как трактовать полученные значения.
Проходы с максимальным коэффициентом Шарпа не всегда показывают самую большую прибыль в тестере, но зато позволяют найти параметры с плавным графиком эквити. На таких графиках, как правило, нет резкого роста, но нет и больших провалов и просадок по эквити.
Таким образом, оптимизация по коэффициенту Шарпа действительно позволяет искать более стабильные параметры по сравнению с другими критериями оптимизации.
>
Достоинства и недостатки
Коэффициенты Шарпа и Сортино позволяют определить, компенсирует ли полученная прибыль риск, связанный с его получением или нет. Другим преимуществом по сравнению с альтернативными измерителями риска является то, что их можно применять к активам всех типов. Например, можно сравнить золото с серебром, используя коэффициент Шарпа, потому что он не требует конкретный внешний ориентир для оценки. Таким образом, их можно применять как к отдельным стратегиям или ценным бумагам, так и к портфелям на объединенных фондах.
Недостатком этих инструментов является то, что расчет подразумевает нормальное распределение доходностей. В реальности это требование, как правило, не выполняется, но тем не менее, коэффициенты Шарпа и Сортино являются наиболее простыми и понятными для сравнения разных стратегий и портфелей.
Шарп и Сортино. Всё, что надо знать о этих коэффициентах.
Шарп и Сортино. Всё, что надо знать о этих коэффициентах.
- Коэффициент Шарпа и коэффициент Сортино служат для оценки эффективности и уровня риска торговых систем (а также, портфелей и ETF-ов).
- Если две торговые системы (два портфеля, два ETF-а) имеют одинаковые доходности, то предпочтительнее будет та, у которой эти коэффициенты выше.
- Коэффициент Шарпа даёт некорректное представление о системе (о портфеле, о ETF-е). Коэффициент Шарпа следует избегать, и, по возможности, надо пользоваться коэффициентом Сортино, в формуле которого устранены недостатки коэффициента Шарпа.
Пояснение. В формуле рассчёта коэффициента Шарпа положительная доходность за период (например, за месяц) будет учитываться, как увеличение риска, что абсолютно нелогично.
В формуле рассчёта коэффициента Сортино увеличением риска считается падение доходности ниже установленного порога, т.е. все положительные и отрицательные значения доходностей за каждый период, которые ниже значения безрисковой ставки доходности.
Применение. Коэффициент Сортино удобно использовать для выбора ETF-ов в портфель.
Сберегатель (Сэр Лонг)
Московская обл.
с 9 декабря 2016
+ Подписаться
103 Комментария
- Сначала новые
- Сначала старые
- Сначала популярные
30 июня 2021, 07:55
В формуле рассчёта коэффициента Шарпа положительная доходность за период (например, за месяц) будет учитываться, как увеличение риска, что абсолютно нелогично.
Чисто философский вопрос 🙂 Я, к примеру, тоже считаю, что рост доходности — это рост волатильности = рост риска 🙂
30 июня 2021, 09:06
Денис Г., риска чего?
30 июня 2021, 10:04
Сберегатель (Сэр Лонг), а где же сами знания?
30 июня 2021, 12:56
Paranoid Android, самое главное знание — это то, что Шарп мне не нужен)))
А Сортино нужен.
30 июня 2021, 13:13
Сберегатель (Сэр Лонг), от оно значит как… Михалыч
Значит и Кальмара не будет больше в этой знатной компании?
30 июня 2021, 15:37
Paranoid Android, у Кальмара низкая информативность.
Невозможно отличить высокодоходную систему с большой просадкой от низкодоходной с небольшой просадкой.
30 июня 2021, 15:58
Сберегатель (Сэр Лонг), значит тоже в топку
30 июня 2021, 16:13
Невозможно отличить высокодоходную систему с большой просадкой от низкодоходной с небольшой просадкой.
А разве они сильно отличаются? Если изменить размер плеча, они перетекут из одной в другую
30 июня 2021, 16:38
КриптоУлитка, я не использую плечи, и поэтому смотрю на ситуацию со своей колокольни.
30 июня 2021, 18:36
Сберегатель (Сэр Лонг), можно тогда увеличить размер сделки, используемой в низкорисковой стратегии. Стратегия по проценту прироста капитала (и по просадке) станет близка к высокорисковой.
И, наоборот, уменьшить размер сделки в высокорисковой стратегии, значит снизить ее риски.
В общем, мне кажется, что необходимость видеть и различать высокорисковую стратегию с большой просадкой и низкорисковую стратегию с маленькой просадкой важна только, если у меня нет возможности никак изменить размер сделки, например я всегда захожу на 100% от депозита и не беру плечи. Конечно же, имхо.
30 июня 2021, 19:16
КриптоУлитка,
можно тогда увеличить размер сделки, используемой в низкорисковой стратегии. Стратегия по проценту прироста капитала (и по просадке) станет близка к высокорисковой.
Нет, относительные значения не изменятся.
Увеличатся только абсолютные значения.
01 июля 2021, 10:56
Сберегатель (Сэр Лонг),
Нет, относительные значения не изменятся. Увеличатся только абсолютные значения.
С этим все же не соглашусь.
Пусть у нас будет стратегия А, где доходность составляет 40%, а просадка 20%. И стратегия Б, где доходность будет 20%, а просадка 10%.
Значит, используя в первом случае 50% от депозита, а во втором — 100%, я так и так получу 20% прибыли, имея при этом просадку в 10%.
Поэтому, с моей точки зрения, эти стратегии одинаковы, причем, что по относительным, что по абсолютным значениям.
Если изменить условия и в стратегии Б сделать просадку 5%, то стратегия Б станет приоритетной. Но, не забываем, что доходности и просадка прошлого не гарантируют, что в будущем будет также и вообще, это сферический пример в вакууме )
01 июля 2021, 14:14
КриптоУлитка, хитрО придумано)))
30 июня 2021, 13:45
Сберегатель (Сэр Лонг), У меня к Вам практический вопрос.
Имею следующий портфель:
50% нефтянка (XLE) в шорт
50% технологии (XLK) в лонг
Как будете Сортино считать?… риск с какой стороны будет у Вас?
Заранее благодарен
30 июня 2021, 15:44
Paranoid Android, Сортино считается по историческим данным.
Чем длиннее таймфрейм, тем точнее результат.
Но поможет ли нам эта точность?
А риск, как обычно, мы будем рассчитывать по убыточным периодам портфеля.
Не вижу тут подвоха.
30 июня 2021, 15:56
Сберегатель (Сэр Лонг), подвоха тут нет
30 июня 2021, 13:11
Paranoid Android, знания -продукт умозаключений. Для меня как радио инженера было полезным соотносить законы радио и звуко волн с волнами цено графика. В результате оказалось что график состоит из гармоник одной частоты связанных коэффициентом 4.Это 1-4-16-64 и тд.Эти гармоники удваваются по амплитуде с каждым шагом частоты.
30 июня 2021, 13:39
ezomm, умозаключения — хорошо, но иногда могут завести далеко от реальности. Знания хотелось бы иметь подтверждённые ну хотя бы статистикой какой-то на крайняк… Вот какие у Вас подтверждения Ваших умозаключений о гармониках на графике? Можно даже с простого начать, от какой базовой частоты (гармоники они же про частоты) Вы гармоники считаете? И где там синус на графике, подтверждённый хотя бы статистикой?
30 июня 2021, 13:44
Paranoid Android, тренируйте глаз и увидите синусоиду на графике. Частоту задает 1я и2я волны. В разные годы частоты разные. Статистика -удел каждого трейдера. Иногда годы уходят на поиск закономерностей. Я потратил 7 лет до 2007г.на Метасток 7.2.Это прога для тестов своих стратегий.
30 июня 2021, 13:52
ezomm, давайте научными (инженерными) методами обсуждать… вот у меня частотометр есть и осцилограф для измерения частоты
А как в 1В и 2В синус можно увидеть… там даже половины периода нет
спасибо
30 июня 2021, 13:54
ezomm, Вы частоту метастоком меряете что ли?
30 июня 2021, 18:24
Paranoid Android, я же написал — не увидишь без тренировки. А с прогами я тогда же и расстался в 2008г тк понял свечной анализ. Свечной открывается только после волнового тк свеча это часть волны Эла. Но свечной является фильтром для волн Эла и этим он того превосходит. В волновом нет циклов времени, а в свечном есть. Каждая свеча это фрактал имеющий размер во времени. Из 4х фракталов рождается новый фрактал и тд. Ты книжки читай и тебе откроется.Почитай Глена Нили- Мастерство анализа волн Эллиота.
30 июня 2021, 20:25
ezomm, хорошо, почитаю… а про тестирование моделей там есть?
01 июля 2021, 10:48
Paranoid Android, тестирование стратегий в таких прогах как Метасток 10, Амиброкер 4.3, Омега 2000, Нирвана и тд.
30 июня 2021, 10:12
Сберегатель (Сэр Лонг), отклонение от среднего — это мера риска, неважно в какую сторону.
Опять же повторюсь — это зависит от того, что вкладывать в понятие риска. У классиков риск — это волатильность/СКО сами по себе. У Сортино — только просадка.
30 июня 2021, 12:59
Денис Г., надо бы уточнить подход. Отклонение в прибыльную (выбранную, в сторону тренда) сторону должно иметь меньший вес, чем в противоположную. 40/60 какие-нибудь.
30 июня 2021, 13:08
Денис Г., я предполагаю, что термин «риск» не может использоваться как одиночное слово.
К этому слову обязательно должно быть присоединено ещё одно слово или группа слов, описывающее то явление, которого мы опасаемся.
Например «риск сказочно разбогатеть».
Но, поскольку все мы ввязались в эту биржевую возню с целью разбогатеть, нас этот риск не должен волновать.
Гораздо более логично будет опасаться явления под названием «потеря денег».
Коэффициент Сортино отлично продемонстрирует нам уровень риска потери денег, по сравнению с коэффициентом Шарпа.
30 июня 2021, 13:45
Сберегатель (Сэр Лонг), вы просто смотрите на термин как человек, а учёные… как учёные 🙂
30 июня 2021, 15:52
Денис Г., я стремлюсь не только к простоте и удобству, но и к максимальной достоверности результата.
Шарп в этом смысле выдаёт мусорный результат.
30 июня 2021, 17:15
Сберегатель (Сэр Лонг), он не мусорный, он «другой» 🙂 Постараюсь пояснить.
Шарп в знаменателе имеет СКО всей выборки. Мы берём все результаты за некоторый период, находим среднюю и её колебания вверх-вниз, как бы коридор. Если поделить очищенную от безриска доходность на этот коридор, то мы как бы получаем нашу долю в этом коридоре, чем больше, тем лучше. Допущение: колебания цены вряд ли имеют нормальное распределение, но как бы все привыкли к такой трактовке, потому что другой нет.
Сортино делает в принципе то же самое, но берёт не всю выборку, а только значения ниже безриска, т.е. как бы делит взятое нами на фактически реализованный риск, а не весь потенциальный. Это точно так же далеко от идеала, как и Шарп 🙂 В инвестиционной теории любая доходность выше безриска имеет… риск, это её цена. Даже если риск (волатильность вниз в вашем контексте) не реализовался, он всё равно есть, и Сортино его упускает по сути. В принципе, он может никогда и не реализоваться, учитывая его случайный характер и ограниченность жизни фонда/трейдера.
Т.е. у нас либо допущение, что риск вверх = риск вниз, либо допущение, что если риск вниз не реализовался, то его можно не учитывать. В принципе, это шило на мыло, поэтому оба коэффициента живы до сих пор, ибо чистая вкусовщина 🙂
30 июня 2021, 18:00
Даже если риск (волатильность вниз в вашем контексте) не реализовался, он всё равно есть, и Сортино его упускает по сути. В принципе, он может никогда и не реализоваться, учитывая его случайный характер и ограниченность жизни фонда/трейдера.
Реальность такова, что плохие варианты реализуются намного чаще, чем хорошие.
Поэтому дождаться волатильности вниз гораздо проще, чем волатильности вверх.
Я имею ввиду доходность системы, естественно.
Т.е. у Сортино есть огромная вероятность не упустить риск.
30 июня 2021, 22:01
Денис Г., коэффициент Шарпа плохой, если распределение несимметрично относительно моды и имеет «тяжелый» правый хвост. А это типично для торговли по тренду: «дай прибыли течь, быстро фиксируй убытки».
30 июня 2021, 15:36
Сберегатель (Сэр Лонг), не отлично, а крайность. Если Шарпу всё равно куда тренд, то в Сортине контртренд — всё, тренд — ничего. Выше я предложил как взять промежуточный осмысленный вариант.
Это если Вы собираетесь эти числа как-то использовать в ТС, а не просто есть/нет.
30 июня 2021, 15:54
то в Сортине контртренд — всё, тренд — ничего.
И это правильно, ибо нас изначально волнует риск потерь.
30 июня 2021, 15:59
Сберегатель (Сэр Лонг), это верно.
Но невозможно отделить северный полюс магнита от южного.
Потерь без прибытков не бывает. Как и наоборот.
Прибыли уменьшают величину потерь, и просто отбрасывать их не стоит.
30 июня 2021, 16:26
svgr, разве нам не хватит того, что в результат (коэффициент) уже вшиты величина выигрыша, величина потерь и безрисковая ставка?
30 июня 2021, 16:33
Сберегатель (Сэр Лонг), а откуда взялась величина выигрыша? От игры. Разве может быть неважным как этот выигрыш образовался? Равномерно или одномоментно. А Вы предлагаете эти случаи приравнять.
И случай Сортино = бесконечность какие практические выводы может дать? Бесполезен.
Не должно быть бесконечности.
А у Шарпа в этом случае волатильность есть, Вы рисковали, больше или меньше, и выиграли в результате. По Сортино в этом случае Вы не узнаете как Вы рисковали в процессе.
30 июня 2021, 16:43
а откуда взялась величина выигрыша? От игры. Разве может быть неважным как этот выигрыш образовался? Равномерно или одномоментно. А Вы предлагаете эти случаи приравнять.
Вот именно, если у нас есть система, которая 3 месяца в году будет давать хороший выигрыш, а остальное время будет болтаться около нуля, то Шарп отправит такую систему в мусор, коэффициент будет очень низким.
А Сортино будет высоким, что есть справедливо.
30 июня 2021, 16:47
Сберегатель (Сэр Лонг), вопрос того, что Вы мерите, какие критерии хорошести лично для Вас.
30 июня 2021, 17:01
svgr, создание торговой системы или набора фильтров для портфеля — это творческий процесс.
И каждый реализует этот процесс в соответствии со своими индивидуальными потребностями.
Лично мне нравится Сортино и не нравится Шарп по указанным выше причинам.
Кроме того, эти коэффициенты дают фиксированный результат, который не нуждается в настройке.
И этот результат общедоступен, без дополнительных вычислений.
А кто может точно сказать, какие нужны веса для модифицированного коэффициента?
40/60 или 20/80?
Неизвестно.
30 июня 2021, 16:48
Равномерно или одномоментно.
Нам нужны шашечки или ехать?)))
Шучу.
30 июня 2021, 16:59
Сберегатель (Сэр Лонг), если Вы за полгода без прибыли не дрогнете и не сделаете глупость, то — однозначно ехать. И сниму перед Вами шляпу.
Во всех остальных случаях шашечки важнее.
30 июня 2021, 17:09
svgr, если честно, я уже сделал немало глупостей, которые поздно заметил и которые невозможно быстро исправить.
И я уже года 4 еду вместе с этими глупостями.
Обидно, да.
Но я постепенно исправляю то, что успел натворить.
Т.е. 4 года назад у меня были одни принципы формирования портфеля, а теперь они совершенно другие.
Вот я и до необходимости применения Сортино дорос, и дальше собираюсь расти.
Главное — не совершать фатальных ошибок, после которых невозможно восстановить счёт.
А если счёт 4 года стагнирует — то это не страшно.
30 июня 2021, 16:51
А Вы предлагаете эти случаи приравнять.
С одной стороны, я только ЗА, если модификация коэффициента поможет нам более точно выбрать систему или портфель.
Но с другой, я предпочитаю пользоваться готовым результатом и не делать свои вычисления, поэтому я вставил в топик ссылку на ресурс, где всё уже посчитано.
30 июня 2021, 13:30
Денис Г., волны цены связаны психологией людей… типа их страхом или уверенностью.Поэтому типично какой бы волатильностью не была 1я волна ..2я волна откатит на 62% от 1й… тк велик страх потери… В 4й волне наоборот страх меньше и 4я типично 38% от 3й… Далее 3й шаг цены те 5я волна(последняя вперед) типично равна 1й по амплитуде. После 3х шагов вперед опять страх возвращается и мы имеем 2ю волну большего порядка и откат на 62% .
30 июня 2021, 10:13
Сберегатель (Сэр Лонг), а формулки хде??
30 июня 2021, 13:12
asfa, формулки не нужны (для моего круга задач).
В той ссылке, которая в топике, коэффициенты уже посчитаны.
Надо только верить в то, что они посчитаны правильно.
30 июня 2021, 11:14
Сберегатель (Сэр Лонг), эмпирика говорит что в определенных ситуациях вола эквивалентна рискам.
Вот мы держим позу овернайт — риск этой позы пропорционален воле рынка (долгосрочной и оцениваемой сейчас). Это точка зрения биржи при расчете ГО. А не оценка например рисков лонгов на аптренде отлично от оценки рисков шортов. Таки дела.
30 июня 2021, 13:24
quant_trader,
Это точка зрения биржи при расчете ГО.
В этом случае — да, Шарп уместен.
Ибо биржу в первую очередь заботят собственные риски.
А не риск того, что какая-то часть игроков внезапно разбогатеет.
Но в случае с трговыми системами и портфелями, будет абсурдным классифицировать позитивное явление (увеличение размера счёта) как событие, которое привносит риск.
30 июня 2021, 13:45
Сберегатель (Сэр Лонг), биржу волнует платежеспособность игроков. Биржа считает что игрок который стоит в лонг овернайт несет плюс минус тот же риск что и игрок который стоит в шорт. Сортино отдает предпочтение тем кто угадал гэп. Типа нет убытка нет и риска. В 2008 году осенью словил гэп против тренда в ришке. Рынок внезапно закрылся (сообщение в квик пришло после того как) и открылся в другую сторону от того движения через несколько дней. Пока Сортино такое не словит он будет считать что все норм.
Не привносит а говорит о принимаемом риске. Если при росте индекса на 5% портфель дал +10% то это значит что в портфеле зашит риск относительно индекса. Если на движении рынка +50% кто то нажыл трехзнак то там левередж. А если там левередж то при гэпе против тренда мы получим гэп*левередж. Таки дела.
30 июня 2021, 16:19
quant_trader,
Сортино отдает предпочтение тем кто угадал гэп
Я бы сказал иначе.
Сортино показывает, что торговля по заранее заданным и неукоснительно исполняемым правилам дала такую-то доходность при таких-то потерях.
30 июня 2021, 18:41
Сберегатель (Сэр Лонг), это было про частный случай, а так то согласен с Вашим определением. Вообще я ввязался только напомнить про ограничения методов а не сказать что они не работают.
30 июня 2021, 19:17
quant_trader,
30 июня 2021, 11:38
Сберегатель (Сэр Лонг), риска стать богаче.
тойесть риск изменить свое состояние.
30 июня 2021, 13:26
Антон Б, риска стать богаче и не справиться с нахлынувшими искушениями)))
30 июня 2021, 11:05
Есть еще пара копеек которые следует добавить.
Шарп был разработан под лонговый портфель из акций без плеча (ну ладно, еще госбондов) и лажает уже даже с корп облигациями (волатильность ценового ряд отражает вероятность дефолта лучше чем доха что ле?), не говоря про деривативы и торговые стратегии. Как верно написано в статье Сортино предпочтительнее — какой нам толк от маловолатильно снижающейся еквити?
Сортино чуть получше но как и Шарп отображает только риски реализованные на участке бектеста.
Скажем etf на продажу краев/сеточное усреднение на аптренде фондового рынка может генерировать очень гладкую маловолатильную еквити годами и обосраться как слон за три сигмы. Трендовая может пройти по краю с зашкаливающим риском на трейд в каком нибудь декабре 2014 и не отразить его в еквити — привет тем кто считает необязательным управление размером позиций в зависимости от волы.
Да, можно сравнить две разных трендовых (контртрендовых, лонговых etf итд) между собой по Шарпу и Сортино. Но уже нельзя сравнить трендовую с контртрендовой, с лонгом сбера/микса на аптренде или там лонгом бакса. Сложно сравнить пиф на мусорные облиги с пифом госбондов — пока спокойно первый лучше, но риски то разные.
Вывод какой — считать надо, но надо понимать ограничения. Таки дела.
30 июня 2021, 11:40
quant_trader, «Скажем etf на продажу краев/сеточное усреднение на аптренде фондового рынка может генерировать очень гладкую маловолатильную еквити годами и обосраться как слон за три сигмы» Нужно считать не завершеннонные сделки.
а эквити как закрытие всех сделок прямо сейчас.
тогда все эти незакрытые убыточные сделки будут видны для коэффициента.
а так-же изменения цены опционов.
30 июня 2021, 13:09
Антон Б, имел в виду нормальную переоценку открытых позиций а не форексные штучки. Покупка риска действительно может давать при нормальной переоценке маловолатильную (относительно доходности) эквити достаточно долго.
Торговля с плечом даже по тренду может иметь риски выше чем видны в еквити. Таки дела.
30 июня 2021, 13:38
а эквити как закрытие всех сделок прямо сейчас.
Считать надо ежедневную эквити. Ну или ежечасную, если позволяют ресурсы. Тогда заблуждений будет меньше, а возможностей больше 🙂
Правда в таком случае могут быть неточности по неликвидным инструментам, но это уже нюансы.
30 июня 2021, 13:54
Дмитрий Овчинников, краевые опционы по теор цене биржи. Мусорные облиги по цене маркетмейкера аффилянта. Всякие etf плечевые, брр. Ипотечные которые кино биг шорт.
Баффет правильно сказал — деривативы это оружие массового поражения. Их оценивать через еквити как с шашкой на танки.
30 июня 2021, 14:58
Дмитрий Овчинников, с неликвидными именно по цене ликвидации.
тойесть по цене которую можно получить в течении часа продав все.
(фактически плохой край стакана)
30 июня 2021, 13:40
quant_trader,
Сортино чуть получше но как и Шарп отображает только риски реализованные на участке бектеста.
Ну, а куда нам деваться от этого бэктеста?
Условно говоря, с тех пор, как был изобретен свечной анализ — все новые методики анализа служат для того, чтобы по левой части графика прогнозировать развитие его правой части, улавливая какие-то закономерности.
30 июня 2021, 13:50
Сберегатель (Сэр Лонг), «Ну, а куда нам деваться от этого бэктеста?»
Включать здравый смысл, if then и прочее. Если мы без левереджа то где то можно обойтись бектестом, Шарпом и Сортино. Но мало ли etf с зашитым левереджем типа викса.
Мне давно давно писали что у гуру ДУ опционов (да не назову его имя чтобы не призвать его фанатов) загрузка по счету под завязку. Пофиг какая там эквити, при этом нормальный рисковик должен напрячься.
30 июня 2021, 16:11
quant_trader,
Если мы без левереджа то где то можно обойтись бектестом, Шарпом и Сортино. Но мало ли etf с зашитым левереджем типа викса.
Я спекулирую только ценностью (акции) и не спекулирую фантиками (предметами коллекционирования).
И поэтому я смотрю на биржевые инструменты со своей колокольни.
Т.е. я никогда не возьмусь за викс по причине отсутствия у него внутренней ценности.
30 июня 2021, 17:18
Сберегатель (Сэр Лонг), внутренняя ценность — что это для Вас? Интересно
30 июня 2021, 17:41
Paranoid Android, самое главное, что если эта внутренняя ценность есть, то ее можно как-то описать словами и хотя бы приблизительно посчитать.
Например — акции.
Это доли какого-то бизнеса.
Этот бизнес имеет финансовые результаты, т.е. мы видим в отчётах объём продаж, прибыль, долги и тд.
Видим выплачиваемые по акциям дивиденды.
Имея эти данные, мы можем посчитать т.н. «справедливую цену» акции и соотнести ее с биржевой ценой.
Справедливая цена акции — это наше субъективное представление о ценности этой акции.
У каждого игрока своё представление о ценности конкретной акции и свои критерии оценки.
Но самое главное, что такие критерии есть.
А если их нет, и ценность определяется интуитивно, то мы имеем дело с фантиками.
30 июня 2021, 18:07
Сберегатель (Сэр Лонг), это как-то общё и обтекаемо… критериев что-то не видно. Описать словами и т.д. — это не критерии. Многие акции не платят дивидендов, убыточные, много долгов, но… растут. Как Вы рассчитываете их «справедливую цену», которую Вы согласны за них заплатить? Цена справедливая или нет — это ведь уже про сделку, ибо цена это по определению параметр купли-продажи. Кстати vix нельзя торговать, как и любой индекс. Но в индексе ничего плохого нет, у него просто предназначение другое. А если б от викса пользы не было, его бы и не существовало вообще.
30 июня 2021, 19:09
Paranoid Android,
Кстати vix нельзя торговать, как и любой индекс. Но в индексе ничего плохого нет, у него просто предназначение другое. А если б от викса пользы не было, его бы и не существовало вообще.
«Купить» VIX можно несколькими способами.
Лидером по оборотам является iPath® S&P 500 VIX Short-Term Futures ETN (VXX). Базируется на индексе, состоящем их краткосрочных фьючерсов на VIX. Для игре на росте волатильности бумаги необходимо купить.
Риски, связанные с этим продуктом таковы. Во-первых, волатильность базового актива, готовый способен двигаться по 10% в день и более, но в этом и заключается основная возможность сверхзаработка, связанная с подобный трейдом.
Во-вторых, динамика VXX может серьезно не совпадать с поведением VIX. Возможно запаздывание. Помимо этого, VXX не подходит для долгосрочной позиции, потому что фьючерсы на VIX обычно уменьшаются со временем. Это медленное снижение, вызванное потерями на перенос позиции перед экспирацией, происходит, когда фьючерс находится в контанго (дальние контракты выше ближних). Это обычно снижает цену на VXX на 5-10% за месяц.
Позитивный момент — несмотря на возможные расхождения с VIX, бумаги VXX отрицательно коррелируют с индексом S&P 500. Так что, при обвале широкого рынка вы сможете неплохо заработать на взлете подразумеваемой волатильности.
Данные за год, таймфрейм дневной
Ну и последнее, в теории ETN несут в себе риски контрагента. Для их создания сами фьючерсы на VIX управляющая компания не покупает, заключаются соответствующие свопы с банками. Для любителей бумаг ETF, лишенных риска контрагента, существует аналог — ProShares VIX Short-Term Futures ETF (VIXY). Тут торговые обороты и размер активов фонда в разы меньше.
Речь идет о продуктах c зашитым плечом. Они явно не для слабонервных, зато подходят для агрессивных интраждейщиков. Речь идет о маржинальных Exchange Traded Products. В настоящее время лучшим из них с точки зрения краткосрочного отслеживания динамики базового актива и ликвидности является ProShares Ultra VIX Short-Term Futures ETF (UVXY).
Продукт этот отслеживает колебания индекса S&P 500 VIX Short-Term Futures с двойным плечом. То есть при росте базового индекса на 1% UVXY прибавляет 2%, и наоборот. Как и в случае более консервативных вариантов, риски работы с UVXY связаны с неточным отражением бумагами динамики самого VIX. Ну, а возможность резких колебаний тут еще выше из-за левериджированности продукта.
Данные за год, таймфрейм дневной
Как вариант, возможна покупка самих фьючерсов на VIX. Это не самый удобный вариант, ибо фьючерсы необходимо заменять активными контрактами в преддверии экспирации. При этом, как показывает практика последних лет, долгожданного «золотого ключика» в виде взлета волатильности можно ждать месяцами.
Еще один способ — операции с опционами. Тут можно реализовывать более продвинутые, менее рисковые стратегии. Однако работа с опционами требуют неплохой предварительной подготовки, работа с ними сложнее, чем просто «покупка волатильности», которую предполагают ETF и т.п. Помимо этого, опционы на VIX частенько дороги из-за высокой волатильности базового актива.
30 июня 2021, 19:42
Сберегатель (Сэр Лонг), всё правильно, есть ETF и ETN на индексы, широкие, как например SPY (etf на SandP500) и более узкие (например отраслевые). Называются биржевые индексные фонды. Их можно торговать на бирже. Людям нравится тот или иной индекс и они покупают фонд на этот индекс… да. Но это не одно и то же. Посмотрите, например, в сравнении график VIX (индекс) и VXX (ETN), упомянутые выше… это интересно (есть на инвестинге)
30 июня 2021, 21:38
Paranoid Android,
есть ETF и ETN на индексы, широкие, как например SPY (etf на SandP500) и более узкие (например отраслевые). Называются биржевые индексные фонды. Их можно торговать на бирже. Людям нравится тот или иной индекс и они покупают фонд на этот индекс…