Buy and sell signals with the Directional Change Algorithm in Python
Step 1
import pandas as pd
import matplotlib.pyplot as plt
# Load historical price data into a DataFrame
data = pd.read_csv('historical_price_data.csv')
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)
# Calculate high and low prices for each period (e.g., daily, hourly)
data['High_Pivot'] = data['High'] > data['High'].shift(1)
data['Low_Pivot'] = data['Low'] < data['Low'].shift(1)
# Trend Assessment
data['Trend'] = 'Sideways'
data.loc[data['High_Pivot'], 'Trend'] = 'Bullish'
data.loc[data['Low_Pivot'], 'Trend'] = 'Bearish'
# Generate Buy and Sell Signals
data['Signal'] = ''
data.loc[data['Trend'] == 'Bullish', 'Signal'] = 'Buy'
data.loc[data['Trend'] == 'Bearish', 'Signal'] = 'Sell'
# Plotting the price data with buy and sell signals
plt.figure(figsize=(12, 6))
plt.plot(data.index, data['Close'], label='Price', color='black')
plt.scatter(data[data['Signal'] == 'Buy'].index, data[data['Signal'] == 'Buy']['Close'], marker='^', color='g', label='Buy Signal', alpha=1)
plt.scatter(data[data['Signal'] == 'Sell'].index, data[data['Signal'] == 'Sell']['Close'], marker='v', color='r', label='Sell Signal', alpha=1)
plt.title('Price Chart with Buy/Sell Signals')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
Step 2
# Calculate daily returns
data['Returns'] = data['Close'].pct_change()
# Filter buy and sell signals
buy_signals = data[data['Signal'] == 'Buy']
sell_signals = data[data['Signal'] == 'Sell']
# Calculate performance metrics
total_profit = (buy_signals['Returns'] - sell_signals['Returns']).sum()
sharpe_ratio = (buy_signals['Returns'] - sell_signals['Returns']).mean() / (buy_signals['Returns'] - sell_signals['Returns']).std()
maximum_drawdown = (buy_signals['Returns'] - sell_signals['Returns']).cumsum().min()
print(f"Total Profit: {total_profit}")
print(f"Sharpe Ratio: {sharpe_ratio}")
print(f"Maximum Drawdown: {maximum_drawdown}")