Спросили меня тут как правильно тестить NYSE… всех деталей не скажу, но могу дать пару советов, которые сэкономят вам время и деньги.
1. Не доверяйте High и Low свечей. На америке есть ADF и некоторые трейды могут влиять на High и Low дня (и любой свечи соотвественно). Чем ниже цена бумаги и чем ниже ликвидность — тем меньше у вас должно быть доверия к свечкам. Чаще всего это выглядит как большая тень — да, по этой цене были сделки и кто-то там поторговал, но с большой вероятностью это order internalization внутри какого-нибудь брокера. Особенно часто они в первые минуты торгов High и Low не дают никакой гарантии исполнения. На жирных бумагах такого в разы меньше, но иногда встречается. Отдельным пунктом идут внебиржевые сделки, которые всегда рисуют большие тени. Поставщики данных страются их фильтровать, но не всегда выходит. В идеале нужно собирать все свечи самому с отфильтрованных тиков, но очень трудозатратно для америки. Второй вариант — не учитывать H/L для свечей с очень большими теням + смотреть на рейндж соседних свечей. Подготовка данных для тестов целое искусство, серьезно.
По просьбам трудящихся упаковал минутки компонентов sp500. Файл будет доступен несколько дней, потом я его удалю. Размер архива около 5Гб
Несколько моментов:
1) Нет истории за несколько последних месяцев. Увы, нет времени дампить с сервака постоянно.
3) Квоты от ActiveTick, качество средненькое. Так что перед бектестом данные надо причесать.
4) Список акций брал из википедии на текущий момент. В истории вы не найдете тикеров, которые были исключены из индекса в последние несколько лет.
Тык
Телега, куда выкладываю полезные (и не только) штуки по алго, когда не лень:)
Пару дней назад SPX и VIX закрылись на 40 дневных максимумах, что явно говорит о временной раскорреляции.
Вот график
Наблюдение украдено в блоге
Автор протестировал такое поведение и нашел всего 4 похожих случая с 1990г. (примерная дата). Во всех четырех случая было снижение рынка. Конечно, говорить о какой-то зависимости нельзя, но все равно это довольно любопытно.
Лениво бродив по западному интернету, нашел интересную стратегию, которая своими корнями уходит к некоему Larry Connors. Стратегия построена на простом RSI с периодом 2.
Суть ее в следующем:
покупаем индексный ETF, когда значение меньше 15 на закрытии дня (да, это можно сделать без проблем и проскальзываний на всех ликвидных ETF) и продаем, когда клоуз текущего дня выше хая предыдущего (можете придумать свои выходы, стратегия не очень-то чувствительна к выходам).
В общем MR в чистом виде. И в принципе это должно работать на большинстве ETF развитых рынков.
Тестил на Multicharts.Net, код ниже.
using System; using System.Drawing; using System.Linq; using PowerLanguage.Function; using ATCenterProxy.interop; namespace PowerLanguage.Strategy { public class rsi_2_spy : SignalObject { public rsi_2_spy(object _ctx):base(_ctx){} private IOrderMarket buy_order; private IOrderMarket sell_order; private RSI m_RSI; private VariableSeries<Double> m_myrsi; private ISeries<double> Price { get; set; } protected override void Create() { // create variable objects, function objects, order objects etc. buy_order = OrderCreator.MarketThisBar(new SOrderParameters(Contracts.Default, EOrderAction.Buy)); sell_order = OrderCreator.MarketThisBar(new SOrderParameters(Contracts.Default, EOrderAction.Sell)); m_RSI = new RSI(this); m_myrsi = new VariableSeries<Double>(this); } protected override void StartCalc() { // assign inputs Price = Bars.Close; m_RSI.price = Price; m_RSI.length = 2; } protected override void CalcBar(){ // strategy logic m_myrsi.Value = m_RSI[0]; if (Bars.Close[0]>Bars.High[1]){ sell_order.Send(); return; } if (m_RSI[0]<15){ buy_order.Send(); } } } }
Тест стратегии из поста http://smart-lab.ru/blog/343965.php
Формализовал стратегию так, как я ее понял.
1. Входа на следующий день, после обновления исторического хая. Тут есть неточности — историю брал с 2005 года. Не факт, что all time high был на этом промежутке.
2. Предыдущее обновление хая было больше 90 дней назад и менее чем 200 дней назад.
3. Примерно 500 ликвидных бумаг с NYSE/NASDAQ/AMEX. Без учета делистинга, без учета комиссий, без учета платы за плечо. Вроде бы без дивидендов (не уверен), дейли дата взята с Google Finance.
4. Стоп в примере — 3%. Тейк — 90%. Можно взять больше стоп, результаты не критично меняются.
5. Вход фиксированным BP на позицию. (взял 1000 на позу)
Код Multicharts.Net
using System; using System.Drawing; using System.Linq; using PowerLanguage.Function; using ATCenterProxy.interop; namespace PowerLanguage.Strategy { public class _INTEST_by_high_daily : SignalObject { public _INTEST_by_high_daily(object _ctx):base(_ctx){} private IOrderMarket buy_order; private IOrderMarket sell_order; double previous_high; double previous_high_low_range; double all_time_high; protected override void Create() { // create variable objects, function objects, order objects etc. buy_order = OrderCreator.MarketNextBar(new SOrderParameters(Contracts.Default, EOrderAction.Buy)); sell_order = OrderCreator.MarketNextBar(new SOrderParameters(Contracts.Default, EOrderAction.Sell)); } protected override void StartCalc() { all_time_high =0; } protected override void CalcBar() { // strategy logic if (Bars.High[0]>previous_high && previous_high_low_range<previous_high && previous_high == all_time_high) { buy_order.Send(); } if (StrategyInfo.MarketPosition>0 && Bars.Close[0]>StrategyInfo.AvgEntryPrice*1.9) sell_order.Send(); previous_high = Bars.High.Highest(200); previous_high_low_range = Bars.High.Highest(90); if (Bars.High[0]> all_time_high) all_time_high = Bars.High[0]; } } }