量化交易入门(二十)KDJ指标实现和回测

前面我们学习了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()

这个示例代码中:

  1. 我们首先定义了一个基于KDJ指标的交易策略KDJStrategy,其中包含了KDJ指标的计算以及交易信号的生成。

  2. 然后,我们创建了一个Cerebro引擎,并通过yfinance库获取了苹果股票从2010年到2023年的历史数据,将其添加到了Cerebro引擎中。

  3. 接着,我们将KDJStrategy策略添加到了Cerebro引擎中,并设置了初始资金为10000美元,佣金为0.001。

  4. 最后,我们运行了回测,并输出了回测前后的资金情况,同时绘制了回测结果图表。

    执行的结果:
    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

让我们来分析一下这个回测结果:

  1. 初始资金和最终资金:

初始资金为10000美元。

回测结束时,资金为9915.61美元。

这意味着在回测期间,策略产生了负收益,损失了84.39美元。

  1. 年化收益率(Annualized Return):

年化收益率为-0.06%,表示策略在回测期间的平均年化收益率为-0.06%。

负的年化收益率说明策略在这个时期内每年平均是亏损的。

  1. 夏普比率(Sharpe Ratio):

夏普比率为-5.64,这是一个非常低的值。

夏普比率衡量了策略的风险调整后收益,即每承受一单位风险,策略能够获得的超额收益。

负的夏普比率表明策略的风险调整后收益为负,即承担了更多的风险,但获得了更少的收益。

  1. 最大回撤(Max Drawdown):

最大回撤为1.24%,表示从策略的最高点到最低点,资金下降了1.24%。

这个最大回撤值相对较小,说明策略在回测期间的资金曲线比较平稳,没有出现大的下跌。

  1. 最大回撤期(Max Drawdown Period):

最大回撤期为2036,表示策略从最高点到最低点的这段时间持续了2036个交易日。

这是一个非常长的回撤期,说明策略在这个时期内一直处于亏损状态,难以实现资金的恢复。

总的来说,这个回测结果并不理想。策略在回测期间产生了负收益,年化收益率和夏普比率都很低,虽然最大回撤较小,但回撤期非常长。这表明该策略在这个时期的表现很差,需要进一步优化或调整。

相关推荐
卷无止境3 分钟前
Python的魔术方法:那些藏在双下划线背后的魔法
后端·python
米码收割机3 分钟前
【Python】Django恒达科技门户网站(源码+文档)【独一无二】
数据库·python·科技
卷无止境16 分钟前
别再被"乱码"吓到了:Python文件操作的门道
后端·python
STLearner1 小时前
ICML 2026 | LLM×Graph论文总结[2]【Graph4LLM,Graph4Agent,智能体记忆(Memory)
大数据·人工智能·python·深度学习·学习·机器学习·数据挖掘
郭老二10 小时前
【Python】基本语法:装饰器语法糖@
python
_Jimmy_12 小时前
Agent常用检索器的详细介绍
python·langchain
小柯南敲键盘12 小时前
图片翻译API接入与自动化实现指南
运维·python·自动化
旅僧12 小时前
Q-learning(自用)
python·机器学习
Python大数据分析@13 小时前
曝梁文锋称「一度不想维护C端用户,奈何赶不走」,DeepSeek真不需要C端用户吗?可能会有啥影响吗?
python
艾斯特_14 小时前
工作流与多Agent协作:LangGraph、MCP和A2A的应用分层
人工智能·python·ai