В предыдущей статье мы рассмотрели подготовку данных, предварительную обработку данных и прогнозирование. Мы также предсказали высокие и низкие значения. В этой статье мы создадим сигналы и сравним доходность стратегии с BTC.
В предыдущей статье будет объяснена торговая стратегия с использованием высоких и низких цен, предсказанных с помощью модели линейной регрессии.
- Соберите исторические данные по ценным бумагам, которыми вы хотите торговать, включая максимальную и минимальную цены.
- Используйте линейную регрессию, чтобы смоделировать взаимосвязь между максимальной и минимальной ценой и любыми соответствующими независимыми переменными.
- Используйте модель, чтобы предсказать максимальную и минимальную цены для будущих периодов.
- Используйте эти предсказанные максимумы и минимумы цен для обоснования своих торговых решений. Например, вы можете купить ценную бумагу, когда прогнозируемая минимальная цена ниже текущей рыночной цены, и продать ценную бумагу, когда прогнозируемая максимальная цена окажется выше текущей рыночной цены.
- Постоянно контролируйте производительность модели и корректируйте ее по мере необходимости.
После этого мы показываем эффективность стратегии.
Торговая стратегия с использованием высоких и низких цен, предсказанных с помощью модели линейной регрессии, будет включать анализ исторических данных торгуемого актива и использование модели линейной регрессии для прогнозирования будущих высоких и низких цен актива. После того, как прогнозы сделаны, трейдер может использовать следующую стратегию:
Генерация сигналов
Мы будем использовать предсказанные значения максимума и минимума, чтобы определить, покупать или продавать BTCUSD на следующий день.
Мы будем продавать BTCUSD, когда
1. Фактическое высокое значение больше прогнозируемого высокого значения.
2. Фактическое нижнее значение больше прогнозируемого нижнего значения.
Мы будем покупать BTCUSD, когда
1. Фактическое высокое значение меньше прогнозируемого высокого значения.
2. Фактическое нижнее значение меньше прогнозируемого нижнего значения.
# Initialising signal column to be zero test_dataset['Signal'] = 0 # When selling, assigning signal value as -1 test_dataset.loc[(test_dataset['High'] > test_dataset['P_H']) & ( test_dataset['Low'] > test_dataset['P_L']), 'Signal'] = -1 # When buying, assigning signal value as +1 test_dataset.loc[(test_dataset['High'] < test_dataset['P_H']) & ( test_dataset['Low'] < test_dataset['P_L']), 'Signal'] = 1
Чтобы рассчитать доходность этой стратегии, нам сначала нужно получить прогнозируемые высокие и низкие цены за определенный период, в этом случае мы используем ежедневно. Затем мы сравним фактические высокие и низкие цены за этот период с прогнозируемыми ценами.
Если фактическая максимальная цена выше прогнозируемой максимальной цены, а фактическая минимальная цена ниже прогнозируемой минимальной цены, мы открываем длинную позицию по прогнозируемой минимальной цене и выходим по фактической максимальной цене. Доходность этой стратегии будет равна разнице между фактической высокой ценой и прогнозируемой низкой ценой за вычетом любых торговых издержек.
Анализ производительности
Во-первых, мы будем использовать коэффициент Шарпа для анализа производительности. Далее в этой статье мы подробно рассмотрим нашу стратегию.
Коэффициент Шарпа
Коэффициент Шарпа — это показатель для расчета доходности с поправкой на риск. Это отношение избыточной ожидаемой доходности инвестиций (по сравнению с безрисковой ставкой) на единицу волатильности или стандартного отклонения.
Формула для коэффициента Шарпа дается,
Коэффициент Шарпа рассчитывается следующим образом:
Где
- N - количество торговых дней в году
- Rf – безрисковая ставка
- Стандартное отклонение - стандартное отклонение.
# The below function returns the Sharpe ratio for the excess returns def annualized_sharpe_ratio(returns, N=252): return np.sqrt(N) * returns.mean() / returns.std() # Calculate the excess daily return by assuming an annual risk free rate of return of 5% excess_daily_strategy_return = strategy_data['strategy_returns'] - 0.05/252 # Calculate the annualized Sharpe ratio sharpe = annualized_sharpe_ratio(excess_daily_strategy_return) print('Sharpe', sharpe)
Шарп -0,5200250376931332
Отрицательный коэффициент Шарпа означает, что безрисковая или эталонная ставка выше, чем стратегия или прогнозируемая доходность, или же ожидаемая доходность стратегии будет отрицательной.
Мы можем проверить эту информацию с более подробной информацией после того, как создадим функцию для генерации сведений о сделке.
def get_trades(data, close_column, signal_column): # Intializing trades dataframe trades = pd.DataFrame() # There are no current positions open at the beginning current_position = 0 # Creating an empty string for entry_date entry_date = '' for i in data.index: # Save the signal generated on date i in 'new_position' new_position = data.loc[i, signal_column] # We don't take any action if the current_position is equal to the signal generated at date i. # The below code will run if the signal generated is not equal to current_position. if new_position != current_position: # The below code will run if the entry_date is not empty if entry_date != '': # save entry price in entry_price entry_price = data.loc[entry_date, close_column] # Since the signal and current_position are not equal, we exit the position at date i exit_date = i # Save exit price in exit_price exit_price = data.loc[exit_date, close_column] # Create a dataframe trade_details with trade details trade_details = pd.DataFrame( [(current_position, entry_date, entry_price, exit_date, exit_price)]) # Update the trades dataframe in every loop trades = trades.append(trade_details, ignore_index=True) # Reset the entry_date entry_date = '' # If the new_position i.e. signal generated at i is not '0' and also not equal to current_position, we will enter either short or long trade if new_position != 0: # Save entry date of trade in entry_date entry_date = i # Update the current_position with signal generated on date i current_position = new_position # Creating below five columns in trades dataframe. trades.columns = ['Position', 'Entry Date', 'Entry Price', 'Exit Date', 'Exit Price'] # Create a column in trades dataframe to store the profit and loss from each trade trades['PnL'] = (trades['Exit Price'] - trades['Entry Price']) * trades['Position'] # Returns 'trades' dataframe return trades
Использование функции get_trades для оценки деталей сделок
trades = get_trades(strategy_data, 'Close', 'Signal') print('Trade Details') # Calling get_analytics to analyse trades analytics = get_analytics(trades) print('Trade Analytics') # Rounding off to two decimal places round(analytics, 2)
Обратите внимание, что линейная регрессия — это простая модель, и есть много других факторов, которые могут повлиять на цену, поскольку для этого результат стратегии не подходит для крипторынка.
# Calculating close price change percentage strategy_data['returns'] = strategy_data.Close.pct_change() # Strategy return depends on the last day signal strategy_data['strategy_returns'] = strategy_data['returns'] * \ strategy_data['Signal'].shift(1) strategy_data.head() #Checking for NaN values strategy_data.isna().sum() # Dropping the NaN values strategy_data.dropna(inplace = True) strategy_data.head() #Creating pyfolio tear sheet pf.create_simple_tear_sheet(strategy_data['strategy_returns'], benchmark_rets = strategy_data['returns'])
Для краткости мы не будем показывать все эти шаги (например, загрузку DataFrame производительности или получение сводки производительности) для каждой стратегии, поскольку каждый раз они выполняются одинаково.
Кроме того, мы можем использовать библиотеку под названием pyfolio
для быстрого расчета наиболее важных показателей производительности серии возвратов. Pyfolio — это библиотека Python для анализа производительности и рисков финансовых портфелей, разработанная Quantopian Inc. Она хорошо работает с библиотекой тестирования Ziplene с открытым исходным кодом.
После того, как я воспользовался библиотекой, мы получаем результаты нашей стратегии в BTC:
Затем мы можем увидеть совокупную доходность:
Заключение
В этом блоге мы представляем подробности о нашей стратегии и генерации сигналов, а также сравниваем доходность стратегии с доходностью BTC.
Эффективность линейной регрессии в анализе фондового рынка может варьироваться в зависимости от конкретных рыночных условий и используемых данных.
Обратите внимание, что линейная регрессия — это простая модель, однако BTC — актив с высокой волатильностью, и есть много других факторов, которые могут повлиять на цену акции. Также важно учитывать профиль риска и доходности акции и стратегии.
Линейная регрессия может быть полезна для выявления тенденций и прогнозирования будущих цен на акции, но важно отметить, что это упрощенная модель, которая может не охватывать всю сложность фондового рынка, такого как BTC.
Линейная регрессия может иметь лучшую производительность на стабильном рынке, но может не учитывать волатильность и неопределенность высокодинамического рынка криптовалют.
Всегда рекомендуется протестировать любую стратегию на истории и оптимизировать ее, прежде чем применять ее к реальным сценариям.
Удачной торговли
Если вам понравилась эта статья, не забудьте проверить наш Twitter и Linkedin.
Все материалы носят образовательный характер. Это не инвестиционный консультант, проведите собственное исследование, большое спасибо за внимание.