Търговски различия въз основа на филтри за подобряване на сигналите.

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

Току-що пуснах нова книга след успеха на предишната ми „Книгата за търговските стратегии“. Той включва усъвършенствани индикатори и стратегии за проследяване на тенденциите със страница GitHub, посветена на непрекъснато актуализирания код. Освен това тази книга включва оригиналните цветове след оптимизиране за разходите за печат. Ако смятате, че това ви интересува, не се колебайте да посетите връзката към Amazon по-долу или ако предпочитате да закупите PDF версията, можете да се свържете с мен в LinkedIn.



Пълзящи средни

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

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

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

# The function to add a number of columns inside an array
def adder(Data, times):
    
    for i in range(1, times + 1):
    
        new_col = np.zeros((len(Data), 1), dtype = float)
        Data = np.append(Data, new_col, axis = 1)
        
    return Data
# The function to delete a number of columns starting from an index
def deleter(Data, index, times):
    
    for i in range(1, times + 1):
    
        Data = np.delete(Data, index, axis = 1)
        
    return Data
    
# The function to delete a number of rows from the beginning
def jump(Data, jump):
    
    Data = Data[jump:, ]
    
    return Data
# Example of adding 3 empty columns to an array
my_ohlc_array = adder(my_ohlc_array, 3)
# Example of deleting the 2 columns after the column indexed at 3
my_ohlc_array = deleter(my_ohlc_array, 3, 2)
# Example of deleting the first 20 rows
my_ohlc_array = jump(my_ohlc_array, 20)
# Remember, OHLC is an abbreviation of Open, High, Low, and Close and it refers to the standard historical data file
def ma(Data, lookback, close, where): 
    
    Data = adder(Data, 1)
    
    for i in range(len(Data)):
           
            try:
                Data[i, where] = (Data[i - lookback + 1:i + 1, close].mean())
            
            except IndexError:
                pass
            
    # Cleaning
    Data = jump(Data, lookback)
    
    return Data

Ако искате да видите повече статии, помислете дали да не се абонирате за моя ЕЖЕДНЕВЕН бюлетин (наличен е безплатенплан) чрез връзката по-долу. Той включва моите статии за Medium, повече стратегии за търговия, уроци по кодиране, свързани с изследвания и анализи, също така, абонатите получават безплатно PDF копие на първата ми книга. Можете да очаквате 5–7 статии на седмица с вашия платен абонамент и 1–2статии на седмица с безплатния план. Това ще ми помогне да продължа да споделям изследванията си. Благодаря ти!



Индекс на относителна сила

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

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

RSI се изчислява по доста прост начин. Първо започваме, като вземем ценовите разлики за един период. Това означава, че трябва да извадим всяка цена на затваряне от тази преди нея. След това ще изчислим изгладената средна стойност на положителните разлики и ще я разделим на изгладената средна стойност на отрицателните разлики. Последното изчисление ни дава относителната сила, която след това се използва във формулата на RSI, за да бъде трансформирана в мярка между 0 и 100.

За да изчислим индекса на относителната сила, се нуждаем от OHLC масив (а не рамка от данни). Това означава, че ще разглеждаме масив от 4 колони. Следователно функцията за индекса на относителна сила е:

def ema(Data, alpha, lookback, what, where):
    
    alpha = alpha / (lookback + 1.0)
    beta  = 1 - alpha
    
    # First value is a simple SMA
    Data = ma(Data, lookback, what, where)
    
    # Calculating first EMA
    Data[lookback + 1, where] = (Data[lookback + 1, what] * alpha) + (Data[lookback, where] * beta)    
 
    # Calculating the rest of EMA
    for i in range(lookback + 2, len(Data)):
            try:
                Data[i, where] = (Data[i, what] * alpha) + (Data[i - 1, where] * beta)
        
            except IndexError:
                pass
            
    return Data
def rsi(Data, lookback, close, where):
    
    # Adding a few columns
    Data = adder(Data, 5)
    
    # Calculating Differences
    for i in range(len(Data)):
        
        Data[i, where] = Data[i, close] - Data[i - 1, close]
     
    # Calculating the Up and Down absolute values
    for i in range(len(Data)):
        
        if Data[i, where] > 0:
            
            Data[i, where + 1] = Data[i, where]
            
        elif Data[i, where] < 0:
            
            Data[i, where + 2] = abs(Data[i, where])
            
    # Calculating the Smoothed Moving Average on Up and Down absolute values    
    lookback = (lookback * 2) - 1 # From exponential to smoothed
    Data = ema(Data, 2, lookback, where + 1, where + 3)
    Data = ema(Data, 2, lookback, where + 2, where + 4)          
    # Calculating the Relative Strength
    Data[:, where + 5] = Data[:, where + 3] / Data[:, where + 4]
    
    # Calculate the Relative Strength Index
    Data[:, where + 6] = (100 - (100 / (1 + Data[:, where + 5])))                        
    # Cleaning
    Data = deleter(Data, where, 6)
    Data = jump(Data, lookback)                        
    return Data

Ако се интересувате и от повече технически индикатори и стратегии, тогава моята книга може да ви заинтересува:



Концепцията за различията

Естествено, когато цените се покачват и правят нови върхове, докато индикатор, базиран на цените, прави по-ниски върхове, настъпва отслабване и може да се появи възможност за промяна на отклонението от дълги към къси. Това е, което наричаме нормална дивергенция. Ние знаем, че:

  • Когато цените достигнат по-високи върхове, докато индикаторът достигнепо-ниски върхове, това се нарича меча дивергенция и пазарът може да спре.
  • Когато цените достигат по-ниски дъна, докато индикаторът достига по-високи дъна, това се нарича възходяща дивергенция и пазарът може да покаже известен възходящ потенциал .

Горният график показва EURUSD в първия панел с 21-периодния RSI във втория панел. Мечите дивергенции са оцветени в червено, където трябва да очакваме някаква форма на консолидация, а бичите дивергенции са оцветени в синьо, където трябва да очакваме някаква форма на възходяща реакция.

За предпочитане е да се има предвид отклонение, когато индикаторът е около крайности. Забележете как в горния пример показанията на RSI са по-близо до 70 или 30, когато откриваме различията. Въпреки това, можем също да считаме 60 или 40 за крайности. Сега ще се опитаме да кодираме това в Python.

Основната идея е да се намерят отклонения, които потвърждават тенденцията и начинът да направите това е чрез дългосрочни пълзящи средни, защото те ще бъдат имунизирани срещу много краткосрочни движения. Ето как:

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

Естествено, можем да използваме 800-периодна подвижна средна и да приложим горните условия.

Напомняне: Искаме да приложим условието за пълзяща средна, за да спазваме поговорката: „Тенденцията е твой приятел.“

Следователно трябва да изчислим RSI и две пълзящи средни за 800 периода, приложени към върховете и спадовете.

# Calculating a 21-period RSI
my_data = ma(my_data, 800, 3, 4)
# Calculating a long-term moving average
my_data = rsi(my_data, 21, 3, 5)

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

def divergence(Data, indicator, lower_barrier, upper_barrier, width, buy, sell):
    for i in range(len(Data)):
        try:
            if Data[i, indicator] < lower_barrier:
                for a in range(i + 1, i + width):
                    # First trough
                    if Data[a, indicator] > lower_barrier:
                        for r in range(a + 1, a + width):
                            if Data[r, indicator] < lower_barrier and \
                            Data[r, indicator] > Data[i, indicator] and Data[r, 3] < Data[i, 3]:
                                for s in range(r + 1, r + width):
                                    # Second trough
                                    if Data[s, indicator] > lower_barrier:
                                        Data[s, buy] = 1
                                        break
                                    else:
                                        break
                            else:
                                break
                        else:
                            break
                    else:
                        break
        except IndexError:
            pass
    for i in range(len(Data)):
        try:
            if Data[i, indicator] > upper_barrier:
                for a in range(i + 1, i + width):
                    # First trough
                    if Data[a, indicator] < upper_barrier:
                        for r in range(a + 1, a + width):
                            if Data[r, indicator] > upper_barrier and \
                            Data[r, indicator] < Data[i, indicator] and Data[r, 3] > Data[i, 3]:
                                for s in range(r + 1, r + width):
                                    # Second trough
                                    if Data[s, indicator] < upper_barrier:
                                        Data[s, sell] = -1
                                        break
                                    else:
                                        break
                            else:
                                break
                        else:
                            break
                    else:
                        break
        except IndexError:
            pass 
    return Data

Сега можем да приложим функцията, както следва:

lower_barrier = 40
upper_barrier = 60
width         = 60
# Detecting divergences
my_data = divergence(my_data, 4, lower_barrier, upper_barrier, width, 6, 7)

За да създадем условието за пълзяща средна, можем да използваме следния фрагмент:

for i in range(len(my_data)):
    if my_data[i, 6] == 1 and my_data[i, 3] > my_data[i, 4]:
        my_data[i, 6] = 1
    else:
        my_data[i, 6] = 0
    if my_data[i, 7] == -1 and my_data[i, 3] < my_data[i, 4]:
        my_data[i, 7] = -1
    else:
        my_data[i, 7] = 0

Забележете как в горния сюжет филтърът за пълзяща средна ни спаси от губещи сделки и запази само добрите.

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

Заключение

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

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

Medium е център за много интересни четива. Прочетох много статии, преди да реша да започна да пиша. Помислете за присъединяване към Medium, като използвате моята препоръчана връзка!



За да обобщим, реалистични ли са стратегиите, които предоставям? Да, но само чрез оптимизиране на средата (стабилен алгоритъм, ниски разходи, честен брокер, правилно управление на риска и управление на поръчките). Стратегиите предоставени ли са единствено за търгуване? Не, това е за стимулиране на мозъчна атака и получаване на повече идеи за търговия, тъй като на всички ни е писнало да слушаме за свръхпродаден RSI като причина за късо или надминаване на съпротива като причина да отида дълго. Опитвам се да въведа нова област, наречена Обективен технически анализ, където използваме твърди данни, за да преценим нашите техники, вместо да разчитаме на остарели класически методи.

Една последна дума

Наскоро започнах NFT колекция, която има за цел да подкрепя различни хуманитарни и медицински каузи. The Society of Light е набор от ограничени колекционерски предмети, които ще помогнат да направим света малко по-добър, тъй като при всяка продажба процент от него ще бъде изпратен директно на благотворителната организация, приписана на аватара. Както винаги казвам, нищо по-добро от списък с куршуми, който да очертае ползите от закупуването на тези NFT:

  • Печалба с голям потенциал: Като концентрирам останалите продажби върху маркетинга и популяризирането на Обществото на светлината, се стремя да увелича максимално стойността им във вторичния план пазар. Не забравяйте, че търговията на вторичния пазар също означава, че част от възнагражденията ще бъдат дарени на същата благотворителна организация.
  • Колекция от произведения на изкуството и диверсификация на портфолиото: Наличието на колекция от аватари, които символизират добри дела, е наистина удовлетворяващо. Инвестирането не трябва да има само егоистични нужди, въпреки че няма нищо лошо в инвестирането, за да печелите пари. Но какво да кажем за инвестиране, за да правите пари, да помагате на другите и да събирате изкуство?
  • Даряване за предпочитаната от вас кауза(и): Това е гъвкав начин за разпределяне на различни средства към вашите благотворителни организации.
  • Безплатно копие на книгата ми в PDF: Всеки купувач на който и да е NFT ще получи безплатно копие на последната ми книга, показана във връзката на статията.