mehanizator Знания | Статьи | Системы / Стратегии

Приведенная к риску парная стратегия как индикатор

22 августа 2013  Источник /
Код на Java, используются библиотеки Guava и Apache Common Math. Коэффициент ratio для маркет нейтральной пары должен быть 1.0, но иногда бывают случаи когда не нужен полный хедж, тогда ratio < 1.0.

public static Map<Date, Double> pairTrade(
      Map<Date, Double> closes1, 
      Map<Date, Double> closes2, 
      int window, 
      double ratio) {

        Preconditions.checkArgument(!closes1.isEmpty(), "closes1 is empty");
        Preconditions.checkArgument(!closes2.isEmpty(), "closes2 is empty");
        Preconditions.checkArgument(window > 3, "window is too small, should be > 3");

        final Set<Date> dates = Sets.intersection(closes1.keySet(), closes2.keySet());
        final List<Double> changes1 = Lists.newArrayList(), changes2 = Lists.newArrayList();
        final List<Date> ds = Lists.newArrayList();
        double last1 = 0, last2 = 0;
        for (Date d : dates) {
            double c1 = closes1.get(d);
            double c2 = closes2.get(d);
            if (last1 > 0 && last2 > 0) {
                changes1.add(c1 / last1);
                changes2.add(c2 / last2);
                ds.add(d);
            }
            last1 = c1;
            last2 = c2;
        }

        int sz = ds.size();

        final Map<Date, Double> results = Maps.newTreeMap();
        double result = 0;
        double yearly = Math.sqrt(252);
        for (int i = window; i < sz; ++i) {

            final SummaryStatistics stat1 = new SummaryStatistics(), stat2 = new SummaryStatistics();
            for (int j = i - window; j < i; ++j) {
                stat1.addValue(Math.log(changes1.get(j)));
                stat2.addValue(Math.log(changes2.get(j)));
            }
            double sd1 = yearly * stat1.getStandardDeviation();
            double sd2 = yearly * stat2.getStandardDeviation();

            double k1 = 1.0 / sd1;
            double k2 = -ratio / sd2;
            result += k1 * changes1.get(i) + k2 * changes2.get(i) - (k1 + k2);
            results.put(ds.get(i), result);
        }

        return results;
    }
Поскольку далее я периодически буду приводить графики результатов парной стратегии, нелишне будет привести метод, с помощью которого они получаются. Итак, на входе имеем два массива цен (закрытия дней, например). Для каждого дня сначала считаем волатильности каждой из ног пары скользящим окном в N дней, берем стандартное отклонение помноженное на sqrt(252) для приведения к годовой волатильности. Имея волатильность, считаем нормировочные коэффициенты, приводящие позиции каждой из ног к одной волатильности. Затем уже получаем результат составленной таким образом пары за день. Складывая последовательно результаты дней в итоге получаем конечную эквити стратегии.

Таким образом позиция получается не только маркет-нейтральной, но и приведенной к одному риску по всему периоду времени. По оси значений - единицы среднегодовой волатильности. Полученный таким образом график результатов стратегии может служить индикатором относительных приведенных к риску результатов для разных, например, рынков или секторов. Грубо говоря - можно отследить переток доходности с рынка на рынок.

Примеры

Россия против Америки, RTSI vs. SPX

Приведенная к риску парная стратегия как индикатор


Америка против развивающихся рынков, SPY vs. EEM

Приведенная к риску парная стратегия как индикатор


Германия против Италии, EWG vs. EWI

Приведенная к риску парная стратегия как индикатор


Оригинал статьи на long-short.ru
При полном или частичном использовании материалов - ссылка обязательна http://elitetrader.ru/index.php?newsid=186790. Присылайте свои материалы для публикации на сайте. Об использовании информации.