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

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

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

相关推荐
HAH-HAH1 小时前
【Python 入门】(2)Python 语言基础(变量)
开发语言·python·学习·青少年编程·个人开发·变量·python 语法
SunnyDays10112 小时前
Python 轻松实现替换或修改 PDF 文字
python·替换pdf文字·修改pdf·修改pdf文字
Just_Paranoid3 小时前
【Settings】恢复出厂设置密码校验
android·python·settings·sha256·hmac-sha256
西猫雷婶4 小时前
pytorch基本运算-Python控制流梯度运算
人工智能·pytorch·python·深度学习·神经网络·机器学习
子午4 小时前
Python的uv包管理工具使用
开发语言·python·uv
java1234_小锋4 小时前
Scikit-learn Python机器学习 - 分类算法 - 朴素贝叶斯
python·机器学习·scikit-learn
凡梦千华4 小时前
Django时区感知
后端·python·django
程序猿 小项目大搞头5 小时前
即梦批量生成图片软件使用运营大管家-即梦图片批量生成器
python
dpxiaolong5 小时前
RK3588 Android12默认移除导航栏
开发语言·python
max5006006 小时前
基于多元线性回归、随机森林与神经网络的农作物元素含量预测及SHAP贡献量分析
人工智能·python·深度学习·神经网络·随机森林·线性回归·transformer