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

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

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

相关推荐
笨鸟先飞,勤能补拙9 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能10 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂11 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study11 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境12 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境12 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd12312 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy123931021613 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb0013 小时前
一个项目带你入门AI应用开发01
python
05664613 小时前
Python康复训练——常用标准库
开发语言·python·学习