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

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

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

相关推荐
Candice_jy16 分钟前
vscode运行ipynb文件:使用docker中的虚拟环境
服务器·ide·vscode·python·docker·容器·编辑器
流烟默40 分钟前
基于Optuna 贝叶斯优化的自动化XGBoost 超参数调优器
人工智能·python·机器学习·超参数优化
海琴烟Sunshine42 分钟前
leetcode 263. 丑数 python
python·算法·leetcode
AI视觉网奇1 小时前
yolo 获取异常样本 yolo 异常
开发语言·python·yolo
程序员爱钓鱼1 小时前
Python编程实战 面向对象与进阶语法 迭代器与生成器
后端·python·ipython
程序员爱钓鱼1 小时前
Python编程实战 面向对象与进阶语法 JSON数据读写
后端·python·ipython
TH88862 小时前
一体化负氧离子监测站:实时、精准监测空气中负氧离子浓度及其他环境参数
python
苏打水com2 小时前
0基础学前端:100天拿offer实战课(第3天)—— CSS基础美化:给网页“精装修”的5大核心技巧
人工智能·python·tensorflow
顾安r2 小时前
11.5 脚本 本地网站收藏(解封归来)
linux·服务器·c语言·python·bash
Blossom.1183 小时前
把AI“贴”进路灯柱:1KB决策树让老旧路灯自己报「灯头松动」
java·人工智能·python·深度学习·算法·决策树·机器学习