Искусство тестирования на истории

Тестирование на истории является неотъемлемой частью разработки и оценки торговых стратегий, особенно в мире алгоритмической торговли. Вот реализация Python того, как протестировать торговый алгоритм, используемый в хедж-фондах:

def backtest(data, algorithm, start_date, end_date):
  """
  Backtest a trading algorithm on a given dataset over a specified time period.
  
  Parameters:
  - data (DataFrame): Dataset containing market data.
  - algorithm (function): Trading algorithm to be backtested.
  - start_date (str): Start date for backtesting period in 'YYYY-MM-DD' format.
  - end_date (str): End date for backtesting period in 'YYYY-MM-DD' format.
  
  Returns:
  - results (dict): Dictionary containing backtesting results, including profit/loss,
                   number of trades, and winning percentage.
  """
  # Filter data to desired time period
  data = data[(data['date'] >= start_date) & (data['date'] <= end_date)]
  
  # Initialize variables for tracking results
  total_profit = 0
  num_trades = 0
  num_wins = 0
  
  # Iterate through data and execute trades based on algorithm
  for i, row in data.iterrows():
    prediction = algorithm(row)
    if prediction > 0:
      total_profit += (row['close'] - row['open'])
      num_trades += 1
      if (row['close'] - row['open']) > 0:
        num_wins += 1
  
  # Calculate winning percentage
  win_percent = (num_wins / num_trades) * 100
  
  # Return results in dictionary
  results = {
    'profit': total_profit,
    'num_trades': num_trades,
    'win_percent': win_percent
  }
  return results

Чтобы использовать эту функцию, просто передайте свои рыночные данные в виде Pandas DataFrame, свой торговый алгоритм в виде функции, а также даты начала и окончания периода тестирования на исторических данных. Затем функция вернет словарь, содержащий прибыль/убыток, количество сделок и процент выигрышей за проверенный период.

Например, если у нас есть торговый алгоритм под названием my_algorithm, который принимает ряд рыночных данных и возвращает прогноз (1 для длинной сделки и -1 для короткой сделки), мы можем протестировать его за последний год следующим образом:

results = backtest(data, my_algorithm, '2020-01-01', '2020-12-31')
print(results)  # Output: {'profit': 1000, 'num_trades': 50, 'win_percent': 60}