Прозрения от теорията на хаоса, приложена към търговията. Проучване на Python.

Хипотезата за ефективния пазар не успява да отчете многото аномалии и повтарящи се модели във финансовите активи. Ето защо активното управление на портфейла все още е доминиращата страна в сравнение с пасивното инвестиране.

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

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



Въведение в теорията на хаоса

Теорията на хаоса е много сложна математическа област, чиято задача е да обясни ефектите на много малки фактори. Ефектът на пеперудата идва на ум, когато мислим за теорията на хаоса. Споменатият ефект е явлението, при което незначителни фактори могат да доведат до екстремни промени. Хаотичната система е среда, която редува предсказуемост и случайност и това е най-близкото обяснение, което имаме досега за финансовите пазари. Хипотезата за ефективния пазар не успява да обясни напълно динамиката на пазара и засега е по-добре да се придържаме към реални търговски резултати и исторически резултати като съдия за това дали пазарите са предвидими или не.

Ранните експерименти с теорията на хаоса се случиха с Едуард Лоренц, метеоролог, който искаше да симулира метеорологични последователности чрез включване на различни променливи като температура и скорост на вятъра. Лоренц забеляза, че винаги, когато правеше малки корекции в променливите, крайните резултати бяха изключително различни. Това беше първото доказателство за ефекта на пеперудата, който е един от стълбовете на теорията на хаоса.

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

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

Емоциите и независимите ситуации също допринасят за определяне на пазарната цена. Представете си, ако гигантски хедж фонд промени решението си да не купува еврото срещу щатския долар в последния момент и че тази информация е станала обществено достояние. Много търговци, които биха искали да яхнат гигантската възходяща тенденция по линия на хедж фонда, в крайна сметка биха променили мнението си и това всъщност би могло да доведе до спад на цената на EURUSD. Ето защо давам голяма тежест на анализа на пазарните настроения чрез някои инструменти като доклада COT.

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

Фрактален индикатор

Британският хидролог Харолд Едуин Хърст въведе мярка за променливостта на времевите редове през анализирания период от време. Тази мярка се нарича анализ на премащабирания диапазон, който е в основата на нашия фрактален индикатор. Ето как да изчислите премащабирания диапазон:

Формулата за премащабиран обхват е много интересна, тъй като взема предвид променливостта (S), средната стойност (X-bar) и обхвата на данните, за да анализира своите свойства . Горната формула казва, че трябва да изчислим диапазона между мини диапазоните на максималните и минималните стойности и след това да ги разделим на стандартното отклонение, което в този случай е заместител на променливостта.

Тъй като съм вечен почитател на „направи си сам“ и „ощипай сам“, модифицирах формулата, за да има следния смисъл, който по-късно ще видим заедно в метод стъпка по стъпка:

Включването на върховете и спадовете може да ни даде по-ясна картина за променливостта, поради което първо ще изчислим експоненциална плъзгаща се средна както за най-ниските, така и за върховете за предходния период X и след това ще изчислим съответното им стандартно отклонение, т.е. волатилността. След това ще изчислим първия диапазон, където ще извадим текущия връх от средния връх, измерен чрез експоненциалната пълзяща средна в първата стъпка, и след това ще направим същото с най-ниската. След това ще изчислим подвижния максимум за първия диапазон (високата минус средната стойност) и подвижния минимум за втория диапазон (ниската минус средната). След това изваждаме високия въртящ се максимум от ниския въртящ се минимум преди повторно мащабиране, като разделяме резултата на средната стойност между двете стандартни отклонения, изчислени по-горе за върховете и ниските стойности.

Всичко това се прави с помощта на следната функция, която изисква OHLC масив с няколко резервни колони:

def fractal_indicator(Data, high, low, ema_lookback, min_max_lookback, where):
    
    Data = ema(Data, 2, ema_lookback, high, where)
    Data = ema(Data, 2, ema_lookback, low, where + 1)
    
    Data = volatility(Data, ema_lookback, high, where + 2)
    Data = volatility(Data, ema_lookback, low, where + 3)
    
    Data[:, where + 4] = Data[:, high] - Data[:, where]
    Data[:, where + 5] = Data[:, low]  - Data[:, where + 1]
for i in range(len(Data)):
        try:
            Data[i, where + 6] = max(Data[i - min_max_lookback + 1:i + 1, where + 4])
        
        except ValueError:
            pass              
        
    for i in range(len(Data)):
        try:
            Data[i, where + 7] = min(Data[i - min_max_lookback + 1:i + 1, where + 5])
        
        except ValueError:
            pass  
         
    Data[:, where + 8] =  (Data[:, where +  2] + Data[:, where +  3]) / 2
    Data[:, where + 9] = (Data[:, where + 6] - Data[:, where + 7]) / Data[:, where + 8]
    
    return Data

И така, става ясно, фракталният индикатор е просто реформирана версия на формулата за премащабиран диапазон, създадена от Харолд Хърст.

Ако искате да добавите колони към вашия масив, можете да използвате функцията по-долу:

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

Трябва да разберем как да използваме фракталния индикатор. От диаграмата става ясно, че можем да намерим екстремни стойности около долния край, който е 1,00 (или малко по-нисък в зависимост от параметрите, използвани по-долу). Можем да наречем това Фрактален праг.

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



Следователно една разумна стратегия за търговия може да има следните условия:

  • Всеки път, когато фракталният индикатор достигне прага от 1,00, докато пазарната цена се движи надолу, можем да очакваме, че ще има структурен пробив в пазарната цена, т.е. краткосрочно обръщане към посоката нагоре. Трябва да започнем дълга позиция.
  • Всеки път, когато индикаторът Fractal достигне прага от 1,00, докато пазарната цена се движи нагоре, можем да очакваме, че ще има структурен пробив в пазарната цена, т.е. краткосрочно обръщане надолу. Трябва да започнем къса позиция.
trend = 10
def signal(Data, what, closing, buy, sell):
    
    for i in range(len(Data)):
            
     if Data[i, what] < barrier and Data[i, closing] < Data[i - trend, closing]:
        Data[i, buy] = 1
            
     if Data[i, what] < barrier and Data[i, closing] > Data[i - trend, closing]:  
        Data[i, sell] = -1
# The trend variable is the algorithm's way to see whether the market price has been trending down or up. This is to known what position to initiate (long/short) as the Fractal Indicator only shows a uniform signal which is the event of reaching 1.00
# The Data variable refers to the OHLC array
# The what variable refers to the Fractal Indicator
# The closing variable refers to the closing price
# The buy variable refers to where we should place long orders
# The sell variable refers to where we should place short orders

Струва си да се отбележи, че можем да разработим миниатюрна номенклатура, за да опишем фракталния индикатор. Забележете как имаме две променливи, периодът за ретроспективен преглед върху експоненциалната пълзяща средна и периодът за ретроспективен преглед върху периода на обхвата на нормализиране:

  • Първата променлива е просто периодът на изчисление на подвижната средна.
  • Втората променлива е просто периодът на наблюдение на диапазона.

Следователно, фрактален индикатор с период на експоненциална пълзяща средна стойност от 20 и период на ретроспективен преглед на нормализиране от 14 може да се запише като FI(20, 14).

Обратно тестване на стратегия

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

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

Видимо не е лошо и дори може да се оптимизира по много начини. Систематично показва потенциал.

Можем също така да изберем по-дълъг период за преглед, така че да изгладим индикатора, в случай че искаме да го използваме по свое усмотрение.

Което ни дава следните сигнали:

Заключение

Защо е написана тази статия? Това със сигурност не е метод на хранене с лъжица или път към печеливша стратегия. Ако следвате моите статии, ще забележите, че наблягам повече на как да го направя вместо на ето гои че също така предоставям функции, а не пълен възпроизвеждаем код. Във финансовата индустрия трябва сами да комбинирате частите от друга екзогенна информация и данни, само тогава ще овладеете изкуството на проучване и търговия.

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