Код на 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) для приведения к годовой волатильности. Имея волатильность, считаем нормировочные коэффициенты, приводящие позиции каждой из ног к одной волатильности. Затем уже получаем результат составленной таким образом пары за день. Складывая последовательно результаты дней в итоге получаем конечную эквити стратегии.
Таким образом позиция получается не только маркет-нейтральной, но и приведенной к одному риску по всему периоду времени. По оси значений - единицы среднегодовой волатильности. Полученный таким образом график результатов стратегии может служить индикатором относительных приведенных к риску результатов для разных, например, рынков или секторов. Грубо говоря - можно отследить переток доходности с рынка на рынок.