в Волатильность

Склеиваем фьючерс на VIX и получаем шортовый грааль

Автор: Александр Кургузкин (mehanizator).

Понадобилось мне получить непрерывный поток данных по фьючерсу на VIX, так чтобы склейка была без разрывов на экспирациях. Дневки по контрактам лежат на сайте биржи. Качаем все, складываем все в одну папку. В контракте K08 есть ошибка в данных, удаляем там предпоследнюю строку.

Открываем свой любимый Java IDE, подключаем библиотеку Guava, пишем код:

public class FutureGlue {

final static String[] letters = {“F”, “G”, “H”, “J”, “K”, “M”, “N”, “Q”, “U”, “V”, “X”, “Z”};

final static SimpleDateFormat dateFormatIn = new SimpleDateFormat(“MM/dd/yyyy”);

final static SimpleDateFormat dateFormatOut = new SimpleDateFormat(“yyyyMMdd”);

final static Date switchDate = new Date(107, 2, 24);

final static String sourceDir = “c:/test/bars/vix/”;

public static void main(String[] args)

throws IOException, ParseException {

final Map<Date, Map<String, Double>> resultMap = Maps.newTreeMap();

for (int year = 4; year <= 13; ++year) {

for (String letter : letters) {

String contract = String.format(“CFE_%s%02d_VX”, letter, year);

File file = new File(sourceDir + contract + “.csv”);

if (file.exists()) {

System.out.println(“parsing ” + contract);

double k = 1;

for (String s : Files.readLines(file, Charset.defaultCharset())) {

try {

String[] ss = s.split(“,”);

Date date = dateFormatIn.parse(ss[0]);

int switchRatio = date.before(switchDate) ? 10 : 1;

double open = Double.valueOf(ss[2]) / switchRatio;

double high = Double.valueOf(ss[3]) / switchRatio;

double low = Double.valueOf(ss[4]) / switchRatio;

double close = Double.valueOf(ss[5]) / switchRatio;

if (open > 0) {

if (resultMap.containsKey(date)) {

Map<String, Double> m0 = resultMap.get(date);

k = (open / m0.get(“open”) +

close / m0.get(“close”)) / 2;

} else {

resultMap.put(date, ImmutableMap.of(

“open”, open / k,

“high”, high / k,

“low”, low / k,

“close”, close / k

));

}

}

} catch (Exception e) {

System.out.println(“cannot parse: ” + e.getMessage());

}

}

}

}

}

// Сохраняем результат в файл

StringBuilder sb = new StringBuilder();

for (Date d : resultMap.keySet()) {

Map<String, Double> m = resultMap.get(d);

sb.append(String.format(Locale.US, “%s,%.6f,%.6f,%.6f,%.6fn”,

dateFormatOut.format(d), m.get(“open”), m.get(“high”), m.get(“low”), m.get(“close”)));

}

Files.write(sb, new File(“results.txt”), Charset.defaultCharset());

}

}

Результат склейки, шкала логарифмическая:

С 2004 года по 2013 фьюч упал примерно в 2000 раз. Чем не грааль? Шорти и богатей!

Комментарии:

MrJOKER: привет.
всё сделал как ты написал, внёс код в эклипс, импортировал все библиотеки, ошибок практически нет, но в строчке
final static Date switchDate = new Date(107, 2, 24);
пишет
The constructor Date(int, int, int) is deprecated
и при запуске выходные данные искажаются, т.к. почти на каждом csv-файле вылазит сообщение в консоли
“cannot parse: Unparseable date: “Trade Date””.
может посоветуешь что-то?((( или просто выложишь где-то корректный result.txt

mehanizator: все нормально, так и должно быть.

mehanizator: выходные данные искажатюся – это как?

mehanizator: вот мой results.txt: http://www.wave-trading.ru/files/results.txt

MrJOKER: пардон, в results.txt результаты по строкам не разбиты, проглядел даты, показалось, что часть дней пропущены. results.txt идентичны.
спасибо за статью!

заодно хотел спросить, где-то можно глянуть как менялся маржинальный залог на фьючи по VIX или может как посчитать?

mehanizator: в данных проблема с low значением обнаружилась еще в двух местах, поправил код так чтобы он считал коэффициент только по open и close.