量化交易入门(二十)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个交易日。

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

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

相关推荐
zh路西法18 分钟前
【PACE】面向永磁同步电机PMSM 执行器的参数辨识与能耗感知强化学习 Sim-to-Real
python·cma-es·pmsm·sim-to-real·issac·pace
后台模板学习1 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
2601_967987371 小时前
如何运行 Python 代码
python·最佳实践·脚本文件·代码运行·交互式环境
WiKiLeaks_successor1 小时前
重构Time库的抽象设计
python·重构
AI源码1 小时前
基于 Python 的短视频用户行为分析系统
开发语言·python
第九序言T1 小时前
数据分析岗 Pandas 面试题 20 道(上):概念与读代码
python·数据分析·pandas·数据处理
Dmz丶1 小时前
前端转 AI 100 天 Day 37:Few-shot 与 CoT——让模型学会“推理”
python
孟健2 小时前
我用Grok Bot本地剪口播视频,3段提示词搞定气口切除、字幕与封面
人工智能·python·aigc
2601_966949652 小时前
如何封装 qd.klines.batch(),让批量 K 线查询函数在多个策略中复用?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
神仙别闹4 小时前
基于Python实现英词语自动对齐系统
开发语言·python