Gap Plays

Джон Ф. Картър, в Mastering The Trade, описва най-простата от своите настройки като „gap play“, където той търгува с празнините, които се създават в откритата печалби от акции и книги при затварянето им. Ще се опитам да пресъздам тази игра на пропуски, като използвам прости техники за класификация и регресия. Ще има широко използване на търговски жаргон, но с малко късмет това няма да отклони вниманието от същността на тази публикация. Въпреки това, ако искате да бъдете на крак по всяко време, това е добро начало на заешката дупка, която обяснява всички елементарни понятия тук.

Конфигурацията

Настройката на Картър включва „избледняване“ на разликата в цената на акцията. Той прави това на дневна времева рамка и използва общия обем на предпазния пазар на конкретен набор от акции, които той нарича „големите имена на деня“, които предоставят преглед на състоянието на пазара в този ден. Неговата настройка се състои от прагове, базирани на евристика, която той дефинира, от опит, на предпазарните обеми на тези представителни акции. Той базира стойностите на праговите обеми на стойността на индикатора $VIX.

Настройката (без жаргон)

Настройката на Картър включва правене на пари от разликата в цените на акциите, която се появява в рамките на един ден. Ако например при отварянето на пазара днес дадена акция се търгува на цена, по-ниска от тази, на която се търгуваше при затварянето на пазара вчера, тогава въз основа на определени индикатори Картър купува акции от акциите и ги продава, когато “ gap” в цените при днешното отваряне и вчерашното затваряне е затворено. Какви са тези показатели? Картър използва данни за обема на търговия точно преди отварянето на пазара на определен набор от акции, които е избрал, и определя прагове за тези обеми, въз основа на които взема решение за покупка/продажба. Тези прагове се определят на базата на друг индикатор, наречен $VIX, чиято стойност решава какви да бъдат тези прагове. Това не е (или поне не ми изглежда така) ракетна наука, това е настройка, създадена от опит.

Моята цел е да пресъздам тази настройка, използвайки основни техники за машинно обучение. Ще обуча два вида предиктори: регресор, за да предвиди колко процента от празнината ще бъде запълнена и класификатор, за да предвиди дали празнината ще се затвори или не. В тази публикация обаче ще опиша резултатите само за класификатора.

Данни

За моите данни съм осигурил 15-минутни данни в рамките на деня за всички акции на NIFTY от 01.01.2019 г. до 17.07.2020 г. Данните са налични като CSV файлове и аз филтрирам данните за предпускане на пазара от по-големия набор от данни. Това се прави чрез търсене на подходящия времеви печат от 09:00–09:15 (времена на сесията преди пускане на пазара за NSE) в данните за всички акции и събирането им в матрица с данни.

Моделът ще предостави прогнози за пропуски в NIFTY (Картър използва S&P, DOW) и така за етикетите на истината (независимо дали празнината е затворена или не), използвам ежедневни данни за NIFTY (а също и $INDIAVIX) в същия диапазон като преди. След това преминавам през данните и оформям необходимите етикети за това дали празнините в NIFTY са затворени или не, използвайки OHLC от предишния ден и днес.

# NIFTY OHLC data is in nifty_data
# truth labels
binary_labels = []
for i in range(nifty_data.shape[0]-1):
    yday_close = nifty_data[i, CLOSE]
    today_open = nifty_data[i+1, OPEN]
    today_low = nifty_data[i+1, LOW]
    today_high = nifty_data[i+1, HIGH]
# gap at open, and gap at its smallest
if today_open > yday_close:
    gap = today_open - yday_close
    gap_close = today_low - yday_close
elif today_open < yday_close:
    gap = yday_close - today_open
    gap_close = yday_close - today_high
# did the gap close?
if gap_close <= 0:
    binary_labels.append([i,1])
else:
    binary_labels.append([i,0])

Наивна базова линия

Веднага се изправяме пред затруднение: няма достатъчно данни. Източникът, от който получих историческите си данни, предоставя данни само от 01/01/2019 и това води до 350 точки за данни. Тъй като сме лишени от данни, нека използваме прост модел на логистична регресия като първоначална наивна базова линия.

clf = LogisticRegression()

Използването на метод за кръстосано валидиране на K-кратно с 4 разделяния дава ужасни резултати:

Class   Metric     Score
0       Recall     0.064
1       Precision  0.67
--------------------------
Accuracy = 0.66

Забележка: Ние се интересуваме от резултата за припомняне за оставащ отворен пропаст (клас 0), тъй като последствията от заемането на позиция с неправилна прогноза, че пропастта ще се затвори (фалшиво отрицателно), са сериозни. По същия начин прецизността за затваряне на празнина (Клас 1) е от по-голямо значение, тъй като бихме искали възможно най-много правилни прогнози за затваряне на празнина (Истински положителен) и просто няма да влезем в позицията, ако прогнозата е отворена празнина (Грешно положителна ).

Ако направим малка промяна в модела:

clf = LogisticRegression(class_weight='balanced')

Тогава резултатите са по-обещаващи:

Class   Metric     Score
0       Recall     0.45
1       Precision  0.70
--------------------------
Accuracy = 0.59

Привидно сме постигнали много по-добър резултат за припомняне от 45% с незначително подобрена прецизност от 70% за сметка на общата точност, която е намалена от 66% на 59%. Въпреки това,цялостната точност тук е от малко значение. За да разберете защо, ето диаграмата на целия набор от данни:

Има значително по-голям брой точки за „затваряне на празнина“отколкото има „отворена празнина“,само 1/3 от данните съответстват на „отворена празнина ”точки. Това означава, че можете да получите точност от 66%, като винаги предвиждате, че празнината ще се затвори, което е точността, която дава първият базов модел. Параметърът class_weight=‘balanced’ни позволява да компенсираме този дисбаланс в данните и резултатите са ясни.

Заключение

Напълно ненужен еквивалент на науката за данни на gap play на Джон Ф. Картър е възможен чрез използване на класификатор за логистична регресия, обучен върху данни за година и половина. Освен това е интересно да се отбележи, че човек би могъл да спечели пари (също да загуби много, но в крайна сметка да реализира печалба), като просто винаги влиза в позиция, предполагайки, че празнината ще се затвори.