Автор: Александр Кургузкин (mehanizator).
Берем исторические данные по VIX, например, отсюда, кладем в файл. Пишем в Java код (используется Guava):
public static String fmt(double v) {
return String.format(Locale.US, «%+.6f», v);
}
public static void main(String[] args) throws IOException {
String fileName = «c:/test/bars/vix.csv»;
// собираем в лист клозы из файла
List<Double> data = Lists.newArrayList();
for (String line : Files.readLines(new File(fileName), Charset.defaultCharset())) {
String[] ss = line.trim().split(«,»);
data.add(Double.valueOf(ss[4]));
}
int days = 15; // дней до экспирации
double price = 13.74; // текущая цена базового актива
double maxDiff = 0.07; // величина допустимого отклонения по цене — берем только случаи с ценой близкой текущей
for (double strike = 12; strike <= 15; strike += 1) {
double money = price — strike;
double strikeDiff = (strike / price — 1);
int n = 0;
double calls = 0, puts = 0;
for (int i = 0; i < data.size() — days; ++i) {
double vix = data.get(i);
// отклонение vix от текущей цены
double diff = Math.abs(Math.log(vix / price));
if (diff < maxDiff) {
double v = data.get(i + days) / vix — 1;
calls += v > strikeDiff ? v : 0;
puts += v < strikeDiff ? -v : 0;
++n;
}
}
calls = calls * price / n + (money > 0 ? money : 0);
puts = puts * price / n + (money < 0 ? -money : 0);
System.out.println(n + » случая из » + (data.size() — days) + «, цена(» + price + «) страйк(» + strike + «): колл(» + fmt(calls) + «, пут(» + fmt(puts) + «)»);
}
}
}
Результат:
657 случая из 5838, цена(13.74) страйк(12.0): колл(+2.366494, пут(+0.347060)
657 случая из 5838, цена(13.74) страйк(13.0): колл(+1.634629, пут(+0.615195)
657 случая из 5838, цена(13.74) страйк(14.0): колл(+0.944900, пут(+0.925466)
657 случая из 5838, цена(13.74) страйк(15.0): колл(+0.833420, пут(+1.813987)
Сравниваем с текущей бордой опционов:
VIX1317D12-E (2.65) — VIX1317P12-E (0.10)
VIX1317D13-E (1.95) — VIX1317P13-E (0.35)
VIX1317D14-E (1.45) — VIX1317P14-E (0.90)
VIX1317D15-E (1.15) — VIX1317P15-E (1.55)
Много думаем.