Може ли корелацията да бъде предсказваща? Проучване на Python.

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

  • Корелацията на Spearman измерва връзката между две непрекъснати или редни променливи. Променливите може да са склонни да се променят заедно, но не непременно с постоянна скорост. Базира се на ранговете на стойностите, а не на необработените данни.
  • Корелацията на Pearson измерва линейната зависимост между две непрекъснати променливи. Една връзка може да се счита за линейна, когато промяната в едната е придружена от пропорционална промяна в другата.

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

Току-що публикувах нова книга след успеха на Нови технически индикатори в Python. Той включва по-пълно описание и добавяне на сложни стратегии за търговия със страница в Github, посветена на непрекъснато актуализирания код. Ако смятате, че това ви интересува, не се колебайте да посетите връзката по-долу или ако предпочитате да закупите PDF версията, можете да се свържете с мен в Linkedin.



Създаване на индикатора за автокорелация — ACI

Ще приложим формулата във функция на Python, за да изчислим подвижна корелационна мярка, използвайки ретроспекция (или прозорец) по наш избор. Но първо, нека видим как да създадем проста подвижна корелационна функция между два различни набора от данни. Примерът точно по-долу показва двойките GBPUSD и USDCAD с тяхната подвижна корелационна мярка.

from scipy.stats import pearsonr
def rolling_correlation(Data, first_data, second_data, lookback, where):
    
    for i in range(len(Data)):
        
        try:
            Data[i, where] = pearsonr(Data[i - lookback + 1:i + 1, first_data], Data[i - lookback + 1:i + 1, second_data])[0]
            
            
        except ValueError:
            pass
    
    return Data

Мярката за подвижна корелация по-горе може да ни помогне, когато искаме да инициираме сделки. Например, представете си, че намирате достатъчно елементи, за да оправдаете меча позиция за GBPUSD и бичи елементи за USDCAD. Наличието на силна отрицателна корелация може да помогне за увеличаване на убеждението на търговията.

Автокорелацията е корелацията на времевия ред с неговите собствени лагирани стойности. Ние ще създадем AutoCorrelation Indicator — ACIв python и след това ще продължим с търговията.

from scipy.ndimage.interpolation import shift
def adder(Data, times):
    
    for i in range(1, times + 1):
    
        z = np.zeros((len(Data), 1), dtype = float)
        Data = np.append(Data, z, axis = 1)
return Data
def auto_correlation(Data, first_data, second_data, shift_degree, lookback, where):
    
    new_array = shift(Data[:, first_data], shift_degree, cval = 0)
    new_array = np.reshape(new_array, (-1, 1))
    
    Data = np.concatenate((Data, new_array), axis = 1)
    Data = adder(Data, 20)
    
    for i in range(len(Data)):
        
        try:
            Data[i, where] = pearsonr(Data[i - lookback + 1:i + 1, first_data], Data[i - lookback + 1:i + 1, second_data])[0]
            
            
        except ValueError:
            pass
    
    return Data

За да разберем повече какво представляват тези две променливи, можем да дадем по-формална дефиниция:

  • Ретроспективен преглед: Това е прозорецът на подвижната корелация. Например, изчисляваме корелацията между два набора от данни за последните 20 наблюдения, след което всеки път, когато имаме ново наблюдение, го включваме в ретроспективния преглед, като същевременно изпускаме първото наблюдение, така че прозорецът да остане 20.
  • Shift (shift_degree): В автокорелацията това е вторият набор от данни. Например, да предположим, че имаме времева серия и вземем изместване от 1. Това означава, че ще създадем нова подобна времева серия със закъснение от 1 (вчерашните стойности се поставят успоредно на днешните) и след това ще изчислим подвижната корелация . С други думи, това е броят на забавянията, които трябва да бъдат отчетени.

Графиката по-долу показва стойностите на EURNZD с ACI(5, 3). Това означава, че изчисляваме ACI с период на преглед от 5 и използваме автокорелационно забавяне от 3.

Създаване на правила за търговия

Трябва да разберем, че това не е толкова просто, колкото да кажем, че трябва да купуваме, когато корелацията е равна на -1,00, и да продаваме, когато достигне 1,00. Причината е, че корелацията не е индикатор за посоката, тя просто ни казва дали цените обикновено продължават в същата посока или се обръщат. Следователно ще създадем четири набора правила за търговия, два за покупка и два за продажба. Те, разбира се, не са перфектни и ACI всъщност не е предназначен за търговия, вместо това е предназначен да потвърждава сигнали, но е интересно да го тестваме като търговска стратегия.

  • Отидете дълго (Купете), ако ACI е по-нисък от -0,95 с текущата цена на затваряне, по-висока от цената на затваряне преди 3 периода. Друг начин да се каже, че корелацията е изключително ниска и се очаква цените да продължат в същата посока.
  • Отидете дълго (Купете), ако ACI е по-голям от 0,95 с текущата цена на затваряне, по-ниска от цената на затваряне преди 3 периода. Друг начин да се каже, че корелацията е изключително висока и се очаква цените да обърнат курса.
  • Продавайте на къса позиция, ако ACI е по-голям от 0,95 с текущата цена на затваряне, по-висока от цената на затваряне преди 3 периода. Друг начин да се каже, че корелацията е изключително висока и се очаква цените да обърнат курса.
  • Отидете на къса позиция (продавате), ако ACI е по-нисък от -0,95 с текущата цена на затваряне, по-ниска от цената на затваряне преди 3 периода. Друг начин да се каже, че корелацията е изключително ниска и се очаква цените да продължат в същата посока.
def signal(Data, what, buy, sell):
    
    for i in range(len(Data)):
            
        if Data[i, what] < lower_barrier and Data[i - 1, what] > lower_barrier and Data[i, 3] < Data[i - 3, 3]:
            Data[i, sell] = -1
            
        if Data[i, what] < lower_barrier and Data[i - 1, what] > lower_barrier and Data[i, 3] > Data[i - 3, 3]:
            Data[i, buy] = 1
            
        if Data[i, what] > upper_barrier and Data[i - 1, what] < upper_barrier and Data[i, 3] < Data[i - 3, 3]:
            Data[i, buy] = 1
if Data[i, what] > upper_barrier and Data[i - 1, what] < upper_barrier and Data[i, 3] > Data[i - 3, 3]:
            Data[i, sell] = -1

Отново ще използваме система за управление на риска, базирана на ATR, с цена от 0,2 пипса на кръгла сделка. Тестваните назад данни са ленти M5 от ноември 2019 г., което е около 65 000 анализирани ленти.

Ако също се интересувате от повече технически индикатори и използването на Python за създаване на стратегии, тогава моята най-продавана книга за техническите индикатори може да ви заинтересува:



Трябва да направим повече бек-тестове от това, за да можем да включим стратегията в нашата търговска рамка. Тъй като статията не е за бек-тестване, не почувствах необходимост да предоставя повече от един пример. Имайте предвид, че като цяло финансовите времеви редове не са автокорелирани възвръщаемост, което прави горните резултати интересни. Обичам да използвам корелация, за да потвърдя вече установените си идеи, вместо да създавам нови.

Можете да прочетете повече за подвижните корелации в тази статия, която публикувах наскоро:



Нов подход към нелинейната корелация: MIC

Максималният информационен коефициент — MICе мярка с произход от теорията на информацията и се опитва да улови силата на линейните и нелинейните корелации. Не ви казва дали се движат в противоположни посоки или в една и съща, но ви казва колко силна е текущата връзка и това е изключително ценно при анализирането на различни двойки променливи.

Нека опитаме експеримент, за да докажем, че MIC може да улови и нелинейни връзки. Ще симулираме синус и косинус времеви редове и след това ще изчислим корелацията между двете. Ето кода за начертаване на диаграмата по-долу:

import numpy as np
import matplotlib.pyplot as plt
data_range = np.arange(0, 30, 0.1)
sine = np.sin(data_range)
cosine = np.cos(data_range)
plt.plot(sine, color = 'black', label = 'Sine Function')
plt.plot(cosine, color = 'red', label = 'Cosine Function')
plt.grid()
plt.legend()

Ясно е, че някой, който гледа графиката, без да познава функциите, ще заключи, че те по някакъв начин са свързани, независимо дали черната линия води червената линия или че и двете са ограничени от две нива. Това, което искаме да направим, е да изчислим MIC за тези две и да сравним изчислението с другите две корелационни мерки, Spearman и Pearson. Можем да използваме функцията по-долу, за да го направим.

from scipy.stats import pearsonr
from scipy.stats import spearmanr
from minepy import MINE
# Pearson Correlation
print('Correlation | Pearson: ', round(pearsonr(sine, cosine)[0], 3))
# Spearman Correlation
print('Correlation | Spearman: ', round(spearmanr(sine, cosine)[0], 3))
# MIC
mine = MINE(alpha = 0.6, c = 15)
mine.compute_score(sine,cosine)
mine.mic()
print('Correlation | MIC: ', round(MIC, 3))
# Output: Correlation | Pearson:  0.035
# Output: Correlation | Spearman:  0.027
# Output: Correlation | MIC: 0.602

Резултатите показват следното:

  • Pearson: Обърнете внимание на липсата на какъвто и да е тип корелация тук поради липсата на нелинейна връзка.
  • Spearman: Същата ситуация се прилага тук с изключително слаба корелация, тъй като не улавя нелинейни връзки, както беше посочено по-горе.
  • MIC: Мярката показа силна връзка от 0,60 между двете, което е по-близо до реалността и това, което виждаме.

Предимствата на максималния информационен коефициент са, че той е устойчив на отклонения и не прави никакви предположения относно разпределението на използваните променливи.

Може ли MIC да се използва при търговия? Бих искал да вярвам, че може да бъде. Подвижната мярка MIC може също да бъде полезна като индикатор за автокорелация.

Обърнете внимание, че за да използваме библиотеката на максималния информационен коефициент, трябва да напишем следното в подканата на Python:

pip install minepy

Заключение

Корелацията е изключително важна в търговията и ние разполагаме с много инструменти за измерването й. Индикаторът за автокорелация може да ни помогне, когато използваме инерция или стратегии за следване на тенденция. Например, когато разработим противоположна стратегия, използвайки RSI и имаме екстремни автокорелирани стойности, можем да кажем, че това ни дава по-добро убеждение за сигнала на RSI.

Винаги ви съветвам да правите правилните бек-тестове и да разбирате всички рискове, свързани с търговията. Например горните резултати не са много показателни, тъй като спредът, който използвахме, е много конкурентен и може да се счита за труден за постоянно получаване в света на търговията на дребно. Въпреки това, с институционалните спредове купува/продава, може да е възможно да се намалят разходите, като например систематичната средночестотна стратегия да започне да бъде печеливша.