前面我们学习了kdj的概念和原理,接下来我们通过代码进行回测,验证一下KDJ指标靠不靠谱,能不能根据这个指标来买卖股票获取收益。
以下是使用Backtrader框架,基于KDJ指标对苹果股票进行回测的示例代码:
import backtrader as bt
import yfinance as yf
# 定义KDJ策略
class KDJStrategy(bt.Strategy):
params = (
('period', 9),
('period_dfast', 3),
('period_dslow', 3),
)
def __init__(self):
self.dataclose = self.datas[0].close
self.kd = bt.indicators.StochasticFull(self.data, period=self.params.period, period_dfast=self.params.period_dfast, period_dslow=self.params.period_dslow)
self.crossover = bt.indicators.CrossOver(self.kd.percK, self.kd.percD)
def next(self):
if not self.position:
if self.crossover > 0:
self.buy()
elif self.crossover < 0:
self.close()
# 创建Cerebro引擎
cerebro = bt.Cerebro()
# 从Yahoo Finance获取苹果股票数据
data = bt.feeds.PandasData(dataname=yf.download('AAPL', '2010-01-01', '2023-03-26'))
# 将数据添加到Cerebro引擎中
cerebro.adddata(data)
# 将KDJ策略添加到Cerebro引擎中
cerebro.addstrategy(KDJStrategy)
# 设置初始资金为10000美元
cerebro.broker.setcash(10000.0)
# 设置佣金为0.001
cerebro.broker.setcommission(commission=0.001)
# 添加分析指标
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
# 运行回测
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
results = cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
# 获取回测结果
strat = results[0]
returns = strat.analyzers.returns.get_analysis()
sharpe = strat.analyzers.sharpe.get_analysis()
drawdown = strat.analyzers.drawdown.get_analysis()
# 打印回测指标
print('Annualized Return: %.2f%%' % (returns['rnorm100']))
print('Sharpe Ratio: %.2f' % (sharpe['sharperatio']))
print('Max Drawdown: %.2f%%' % (drawdown['max']['drawdown']))
print('Max Drawdown Period: %s' % (drawdown['max']['len']))
# 绘制回测结果
cerebro.plot()
这个示例代码中:
-
我们首先定义了一个基于KDJ指标的交易策略KDJStrategy,其中包含了KDJ指标的计算以及交易信号的生成。
-
然后,我们创建了一个Cerebro引擎,并通过yfinance库获取了苹果股票从2010年到2023年的历史数据,将其添加到了Cerebro引擎中。
-
接着,我们将KDJStrategy策略添加到了Cerebro引擎中,并设置了初始资金为10000美元,佣金为0.001。
-
最后,我们运行了回测,并输出了回测前后的资金情况,同时绘制了回测结果图表。
执行的结果:
Starting Portfolio Value: 10000.00
Final Portfolio Value: 9915.61
Annualized Return: -0.06%
Sharpe Ratio: -5.64
Max Drawdown: 1.24%
Max Drawdown Period: 2036
让我们来分析一下这个回测结果:
- 初始资金和最终资金:
初始资金为10000美元。
回测结束时,资金为9915.61美元。
这意味着在回测期间,策略产生了负收益,损失了84.39美元。
- 年化收益率(Annualized Return):
年化收益率为-0.06%,表示策略在回测期间的平均年化收益率为-0.06%。
负的年化收益率说明策略在这个时期内每年平均是亏损的。
- 夏普比率(Sharpe Ratio):
夏普比率为-5.64,这是一个非常低的值。
夏普比率衡量了策略的风险调整后收益,即每承受一单位风险,策略能够获得的超额收益。
负的夏普比率表明策略的风险调整后收益为负,即承担了更多的风险,但获得了更少的收益。
- 最大回撤(Max Drawdown):
最大回撤为1.24%,表示从策略的最高点到最低点,资金下降了1.24%。
这个最大回撤值相对较小,说明策略在回测期间的资金曲线比较平稳,没有出现大的下跌。
- 最大回撤期(Max Drawdown Period):
最大回撤期为2036,表示策略从最高点到最低点的这段时间持续了2036个交易日。
这是一个非常长的回撤期,说明策略在这个时期内一直处于亏损状态,难以实现资金的恢复。
总的来说,这个回测结果并不理想。策略在回测期间产生了负收益,年化收益率和夏普比率都很低,虽然最大回撤较小,但回撤期非常长。这表明该策略在这个时期的表现很差,需要进一步优化或调整。