风险回撤和资金回撤是衡量投资组合或交易策略风险的重要指标。风险回撤衡量的是投资组合从峰值到谷底的最大损失, 而资金回撤则衡量的是投资组合的初始资金与最低资金之间的差值。
风险回撤是指投资组合或交易策略在某个时间段内从最高点到最低点的下跌幅度。它衡量了投资组合在不利市场条件下可能遭受的最大损失。风险回撤通常以百分比表示。
资金回撤是指投资组合或交易策略在某个时间段内从初始资金到最低点的下跌幅度。它衡量了投资者在该时间段内实际遭受的资金损失。资金回撤通常以百分比或金额表示。
def simulate_trading(stock_data, strategy, initial_balance=100000, commission_rate=0.0005, slippage_rate=0.01, tax_rate=0.001):
balance = initial_balance
position = 0
trade_history = []
portfolio_value_history = []
peak_value = initial_balance
max_risk_drawdown = 0
max_capital_drawdown = 0
stock_data['trade_date'] = pd.to_datetime(stock_data['trade_date'], format='%Y%m%d')
signal = strategy(stock_data)
for index, row in stock_data.iterrows():
if signal[index] == 'buy' and position == 0:
position = int(balance / (row['close'] + slippage_rate))
position = int(position / 100) * 100
buy_cash = (row['close'] + slippage_rate) * position
commission = round(max(buy_cash * commission_rate, 5), 2)
balance = balance - buy_cash - commission
trade_history.append(('buy', stock_data['trade_date'][index], row['close']))
elif signal[index] == 'sell' and position > 0:
sell_cash = (row['close'] - slippage_rate) * position
commission = round(max(sell_cash * commission_rate, 5), 2)
tax = round(sell_cash * tax_rate, 2)
balance = balance + sell_cash - commission - tax
trade_history.append(('sell', stock_data['trade_date'][index], row['close']))
position = 0
portfolio_value = balance + position * row['close']
portfolio_value_history.append(portfolio_value)
if portfolio_value > peak_value:
peak_value = portfolio_value
risk_drawdown = (peak_value - portfolio_value) / peak_value
if risk_drawdown > max_risk_drawdown:
max_risk_drawdown = risk_drawdown
trade_history.append(('max_risk_drawdown', stock_data['trade_date'][index], max_risk_drawdown))
capital_drawdown = (initial_balance - portfolio_value) / initial_balance
if capital_drawdown > max_capital_drawdown:
max_capital_drawdown = capital_drawdown
trade_history.append(('max_capital_drawdown', stock_data['trade_date'][index], max_capital_drawdown))
if position > 0:
balance = position * stock_data.iloc[-1]['close']
trade_history.append(('sell', stock_data.iloc[-1]['trade_date'], stock_data.iloc[-1]['close']))
return balance, trade_history, max_risk_drawdown, max_capital_drawdown
Max Risk Drawdown: 60.54%
Max Capital Drawdown: 43.33%