Създаване на стратегия на базата на индикатора RSI².

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

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



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

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

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

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

def adder(Data, times):
    
    for i in range(1, times + 1):
    
        new = np.zeros((len(Data), 1), dtype = float)
        Data = np.append(Data, new, axis = 1)
return Data
def deleter(Data, index, times):
    
    for i in range(1, times + 1):
    
        Data = np.delete(Data, index, axis = 1)
return Data
   
def jump(Data, jump):
    
    Data = Data[jump:, ]
    
    return Data
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 Datadef 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, width = 1, genre = 'Smoothed'):
    
    # Adding a few columns
    Data = adder(Data, 7)
    
    # Calculating Differences
    for i in range(len(Data)):
        
        Data[i, where] = Data[i, close] - Data[i - width, 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    
    if genre == 'Smoothed':                                
      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)
    
    if genre == 'Simple':                                      
      Data = ma(Data, lookback, where + 1, where + 3)
      Data = ma(Data, 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

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

Ако искате да подкрепите мен и статиите, които публикувам редовно, моля, помислете дали да не се абонирате за моя бюлетин (наличен е безплатен план) чрез връзката по-долу. Това ще ми помогне да продължа да споделям изследванията си. Благодаря ти!



RSI²

RSI² е много проста идея. Хипотезата е, че RSI е стационарен индикатор и се прогнозира по-лесно от действителната ценова графика. Следователно прилагаме RSI към RSI, така че да използваме втория RSI (който наричаме RSI²), за да прогнозираме посоката на оригиналния RSI. Защо правим това? Тъй като исторически корелацията между възвръщаемостта на пазара и собствения RSI (Промяна в стойността) е много висока.

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

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

  • Когато RSI за 3 периода е над 10, докато предишният RSI за 3 периода е под 10 и в същото време когато RSI² за 3 периода е над 20, докато предишният RSI² е под 20, можем да очакваме възходяща реакция .
  • Когато RSI за 3 периода е под 90, докато предишният RSI за 3 периода е над 90 и в същото време когато RSI² за 3 периода е под 80, докато предишният RSI² е над 80, можем да очакваме меча реакция .

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



Създаване на стратегията

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

# Indicator Parameters
lookback = 3
lower_barrier = 10 
upper_barrier = 90 
lower_barrier_square = 30 
upper_barrier_square = 70 
my_data = adder(my_data, 10)
my_data = rsi(my_data, lookback, 3, 4)
my_data = rsi(my_data, lookback, 4, 5)

Сигналната функция, от която се нуждаем, може да бъде следната.

def signal(Data, indicator_column_one, indicator_column_two, buy, sell):
    
    Data = adder(Data, 10)
        
    for i in range(len(Data)):
            
        if Data[i,indicator_column_two] > lower_barrier_square and
           Data[i - 1, indicator_column_two] < lower_barrier_square  and Data[i,indicator_column_one] > lower_barrier and Data[i - 1, indicator_column_one] < lower_barrier:
               
           Data[i, buy] = 1
            
        if Data[i,indicator_column_two] < upper_barrier_square and \
           Data[i - 1, indicator_column_two] > upper_barrier_square and Data[i,indicator_column_one] < upper_barrier and Data[i - 1, indicator_column_one] > upper_barrier:
               
           Data[i, sell] = -1
            
    return Data

Оценка на стратегията

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

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

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

# Choosing a Holding Period for a trend-following strategy
period = 4
def signal_quality(Data, closing, buy, sell, period, where):
    
    Data = adder(Data, 1)
    
    for i in range(len(Data)):
        
        try:   
            
            if Data[i, buy] == 1:
                
                Data[i + period, where] = Data[i + period, closing] - Data[i, closing]
            
            if Data[i, sell] == -1:
                
                Data[i + period, where] = Data[i, closing] - Data[i + period, closing]
                
        except IndexError:
            
             pass
         
    return Data
# Applying the Signal Quality Function
my_data = signal_quality(my_data, 3, 6, 7, period, 8)
positives = my_data[my_data[:, 8] > 0]
negatives = my_data[my_data[:, 8] < 0]
# Calculating Signal Quality
signal_quality = len(positives) / (len(negatives) + len(positives))
print('Signal Quality = ', round(signal_quality * 100, 2), '%')
# Output Signal Quality EURUSD = 51.49%
# Output Signal Quality USFCHF = 50.72%
# Output Signal Quality GBPUSD = 49.57%
# Output Signal Quality AUDUSD = 51.57%
# Output Signal Quality NZDUSD = 50.19%
# Output Signal Quality USDCAD = 48.16%

Качество на сигнала от 50,72% означава, че при 100 сделки сме склонни да видим печеливш резултат в 50 от случаите, без да вземаме предвид транзакционните разходи.

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

Заключение

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

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

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