不借助三方平台自主搭建量化回测系统 ——以海龟交易策略为例

news2024/11/25 13:50:46

 

数量技术宅团队在CSDN学院推出了量化投资系列课程

欢迎有兴趣系统学习量化投资的同学,点击下方链接报名:

量化投资速成营(入门课程)

Python股票量化投资

Python期货量化投资

Python数字货币量化投资

C++语言CTP期货交易系统开发

数字货币JavaScript语言量化交易系统开发


三方平台与自主系统的优劣势对比

在编写量化策略回测时,可以选择使用三方平台(第三方量化平台)或自主平台(自己编写代码)两种方式。它们各自有一些优劣势,下面是它们的对比:

三方平台:

优势:

  1. 简单易用: 大多数三方平台都提供了用户友好的界面和可视化工具,使得策略的构建和回测过程相对容易上手,即使对编程不熟悉的人也可以使用。

  2. 快速回测: 三方平台通常会优化回测引擎,使回测的速度更快,尤其是针对大规模数据进行回测时,可以节省大量时间。

  3. 数据和资料库: 大多数三方平台会提供包括历史市场数据、财务数据和交易数据等在内的资料库,无需自行采集数据,极大地简化了数据处理流程。

  4. 社区和支持: 常用的三方平台拥有活跃的用户社区和技术支持团队,您可以在这里交流经验、寻求帮助,解决问题更加方便。

劣势:

  1. 有限的灵活性: 三方平台的功能和策略构建方法通常受到平台本身的限制,可能无法实现某些较为复杂的量化策略。

  2. 数据安全性: 使用三方平台需要将您的交易数据和策略上传到平台服务器,涉及到数据安全和隐私问题,可能会让一些用户感到担忧。

  3. 成本: 尽管一些三方平台提供免费版,但更强大的功能和服务可能需要付费订阅,长期来看可能会增加成本。

自主平台:

优势:

  1. 灵活性: 使用自主平台编写代码,您可以完全控制策略的逻辑和实现方式,没有受到第三方平台功能的限制,能够实现更加复杂和个性化的策略。

  2. 数据控制: 在自主平台上,您可以控制自己的数据,不需要将数据上传到第三方服务器,有更好的数据隐私和安全控制。

  3. 学习机会: 自主编写代码让您更深入了解量化交易的原理和编程技能,有助于提高技术水平和理解市场。

劣势:

  1. 技术要求: 对编程和量化金融知识要求较高,需要具备相应的技术能力和知识储备,可能不太适合初学者。

  2. 复杂性: 自主编写代码意味着需要从头开始搭建回测框架、处理数据、设计策略等,工作量相对较大,可能耗费更多的时间。

  3. 回测速度: 自主编写的代码在效率上可能不如经过优化的三方平台,尤其在处理大规模数据时。

总的来说,如果对编程不熟悉或者只是想尝试简单的策略朋友,使用三方平台可能更为方便快捷。但是,如果有一定的编程技能,并且希望实现更复杂的量化策略,或者更关注数据隐私和自由度,则自主平台更适合。本期文章,我们就将以海龟交易策略为例,手把手教大家不借助三方平台(除数据源)完全自主搭建一个简单的Python回测系统,堪称量化小白用户的“保姆级教程”。

自主回测系统数据源

在国内市场,有几个常用的量化策略回测数据源,这些数据源提供了历史市场数据和财务数据,供量化投资者用于回测和研究策略。以下是一些常见的中国市场量化策略回测数据源:

  1. Wind(万得): Wind是中国知名的金融数据服务提供商,它提供广泛的金融市场数据,包括股票、债券、期货、指数等数据,同时还提供财务数据、宏观经济数据和新闻等信息。Wind的数据覆盖范围广泛,是中国量化投资者的重要数据来源之一。

  2. 通达信: 通达信是中国股票市场上广泛使用的一种股票交易软件,它也提供历史市场数据供回测使用。通达信的数据通常包含股票的价格、交易量、财务指标等信息。

  3. 聚宽(JoinQuant): 聚宽是一家为量化投资者提供数据服务的公司,它提供了丰富的股票、基金、期货等市场的历史数据和实时数据。聚宽还提供Python编程接口,方便投资者使用Python进行量化策略回测和交易。

  4. 掘金量化(JQData): 掘金量化是另一家专注于量化投资数据服务的公司,提供了股票、期货、指数等市场的历史数据,同时也提供了Python编程接口,方便用户进行自主量化研究和回测。

为降低关注文章朋友的学习成本,本文就将选择免费版Tushare数据源,获取沪深300指数的历史数据。安装免费版Tushare库,以及历史K线数据获取详细介绍,可以参考我们的历史文章:。具体获取数据的代码只需要两行完成:

import tushare as ts
# 获取hs300指数从2015年初到最新的历史数据
df = ts.get_k_data('hs300', start='2015-01-01')

交易策略回测主函数

接下来我们需要构建交易策略回测主函数:这是一个简单的海龟交易策略函数,该函数接受一个包含股票数据的DataFrame作为输入,并返回增加了海龟交易策略信号以及相关计算结果的DataFrame。

# 定义海龟交易策略函数
def turtle_trading(stock_data):
    # 计算20日突破价格
    stock_data['20d_high'] = pd.Series.rolling(stock_data['high'], window=20, center=False).max()
    stock_data['20d_low'] = pd.Series.rolling(stock_data['low'], window=20, center=False).min()
    stock_data['20d_close'] = pd.Series.rolling(stock_data['close'], window=20, center=False).mean()
    stock_data['prev_20d_high'] = stock_data['20d_high'].shift(1)
    stock_data['prev_20d_low'] = stock_data['20d_low'].shift(1)
    stock_data['prev_20d_close'] = stock_data['20d_close'].shift(1)
    stock_data['buy_signal'] = (stock_data['close'] > stock_data['prev_20d_high']) & (stock_data['prev_20d_close'] <= stock_data['prev_20d_high'])
    stock_data['sell_signal'] = (stock_data['close'] < stock_data['prev_20d_low']) & (stock_data['prev_20d_close'] >= stock_data['prev_20d_low'])
    # 计算持仓状态
    stock_data['position'] = None
    stock_data.loc[stock_data['buy_signal'], 'position'] = 1
    stock_data.loc[stock_data['sell_signal'], 'position'] = 0
    stock_data['position'].fillna(method='ffill', inplace=True)
    # 计算每日收益率
    stock_data['daily_return'] = stock_data['close'].pct_change() * stock_data['position'].shift(1)
    # 计算累计收益率
    stock_data['cum_return'] = (1 + stock_data['daily_return']).cumprod()
    return stock_data

海龟交易策略是一种趋势跟随策略,其主要思想是利用历史股价的突破来产生买入和卖出信号。代码对应解锁如下:

  1. 计算20日突破价格:分别计算最近20个交易日的最高价、最低价和收盘价的滚动平均,并记录为20d_high20d_low20d_close

  2. 记录前一个交易日的20日突破价格:通过将20d_high20d_low20d_close的值向后平移一天,记录为prev_20d_highprev_20d_lowprev_20d_close

  3. 产生买入和卖出信号:买入信号为当日收盘价大于前一个交易日的prev_20d_high且前一个交易日的收盘价小于等于prev_20d_high;卖出信号为当日收盘价小于前一个交易日的prev_20d_low且前一个交易日的收盘价大于等于prev_20d_low

  4. 计算持仓状态:根据买入和卖出信号,确定每日的持仓状态,用1表示买入,0表示卖出。

  5. 计算每日收益率:根据持仓状态和当日收盘价计算每日的收益率。

  6. 计算累计收益率:将每日收益率累乘,得到累计收益率。

此外,该函数中使用了pandas的滚动计算和位运算,涉及了数据的平移、填充等操作,所以输入的stock_data DataFrame数据需要包含至少以下列:'high'(最高价)、'low'(最低价)、'close'(收盘价)。当然,这只是一个简单的海龟交易策略示例,实际应用中可能需要更多的调整和改进,例如加入风险控制、手续费和滑点等因素。

接下来是函数调用模块,通过读取数据、调用函数,进行回测:

# 读取数据
df.set_index('date', inplace=True)
df.index = pd.to_datetime(df.index)
# 回测海龟交易策略
df = turtle_trading(df)

首先将DataFrame的索引设置为日期,并将日期列转换为Datetime类型。接下来,调用了之前定义的turtle_trading函数,对DataFrame执行了海龟交易策略的回测操作。

其中,df是包含股票数据的DataFrame,按照之前提供的海龟交易策略函数turtle_trading的定义,函数会在df中增加一些列来表示策略信号和回测结果,包括买入信号(buy_signal)、卖出信号(sell_signal)、持仓状态(position)、每日收益率(daily_return)和累计收益率(cum_return)。

回测过程是基于历史数据执行的,因此需要确保df中包含足够的历史股票数据来进行回测。回测的结果将会存储在df中,可以通过查看增加的列来了解策略在历史数据上的表现。

计算回测指标

执行完回测,下一步我们需要做的是分析这个策略的表现,这个分析过程主要是通过计算回测指标进行评价:

# 计算回测指标
annual_return = (df['cum_return'][-1]) ** (252/len(df.index)) - 1
daily_return = df['daily_return'].mean()
daily_volatility = df['daily_return'].std()
sharpe_ratio = (annual_return - 0.03) / daily_volatility
max_drawdown = (df['cum_return'].max() - df['cum_return'].min()) / df['cum_return'].max()
print('年化收益率:{:.2%}'.format(annual_return))
print('日均收益率:{:.2%}'.format(daily_return))
print('日收益率波动率:{:.2%}'.format(daily_volatility))
print('夏普比率:{:.2f}'.format(sharpe_ratio))
print('最大回撤:{:.2%}'.format(max_drawdown))

以上段落代码计算了回测指标,用于衡量海龟交易策略的表现。下面解释一下每个指标的含义:

年化收益率(Annual Return): 表示策略在一年内实现的平均每日收益率。根据回测结果的累计收益率,将其指数化到一年的时间跨度内,通过以下公式计算:

annual_return = (cum_return[-1]) ** (252 / len(df.index)) - 1

其中,252是一年中交易日的数量,len(df.index)表示回测数据的总交易日数。

日均收益率(Daily Return): 表示策略在回测期间的平均每日收益率。计算方式为每日收益率的简单平均。

daily_return = df['daily_return'].mean()

日收益率波动率(Daily Volatility): 衡量策略每日收益率的波动程度。通常用标准差来度量,标准差越大,波动性越高。

daily_volatility = df['daily_return'].std()

夏普比率(Sharpe Ratio): 是一种风险调整后的回报率指标,用于衡量每承担一单位风险,能够获得多少超额回报。夏普比率越高,说明单位风险下的回报越高。

sharpe_ratio = (annual_return - 0.03) / daily_volatility

假设无风险利率为3%,这里将其减去后再除以波动率。

最大回撤(Max Drawdown): 表示策略在历史回测过程中,任意时刻从最高点到最低点的最大损失。计算方式为最大回撤幅度除以最高点的累计收益率。

max_drawdown = (cum_return.max() - cum_return.min()) / cum_return.max()

回测指标的计算能够帮助您对所开发策略的表现进行评估和比较。然而,仅仅依赖回测指标并不能完全代表策略的优劣,实际应用中还需要考虑其他因素,如交易成本、滑点、风险管理等,以及对不同市场环境的适应性。因此,在使用回测指标时,需要综合考虑策略的整体表现和风险情况。

输出回测图

最后一步,我们将此前回测得到的结果,采用可视化的方式展现处理,即输出回测图模块:

# 输出回测图
import matplotlib.pyplot as plt
plt.plot(df['cum_return'])
plt.title('Turtle Trading Strategy Backtest')
plt.xlabel('Date')
plt.ylabel('Cumulative Return')
plt.show()

这段代码使用matplotlib库输出了回测图,展示了海龟交易策略的累计收益曲线。我们来解释一下代码的功能:

  1. plt.plot(df['cum_return']):通过plt.plot()函数绘制累计收益曲线,df['cum_return']是策略回测中计算的累计收益率的数据列。

  2. plt.title('Turtle Trading Strategy Backtest'):设置图表的标题为"Turtle Trading Strategy Backtest"。

  3. plt.xlabel('Date'):设置X轴的标签为"Date",即日期。

  4. plt.ylabel('Cumulative Return'):设置Y轴的标签为"Cumulative Return",即累计收益率。

  5. plt.show():显示绘制的回测图。

运行此段代码将在图形窗口中显示海龟交易策略的累计收益曲线。通过该曲线(下图),您可以直观地看到策略的收益变化情况,以及可能的峰值和谷底。请注意,该图表只是回测结果的可视化展示,不能代替对策略的全面分析和评估。

以及在回测指标计算模块计算得到的回测指标数值,同样在运行过程中将其打印出来:

到这里,我们就完成了一个简单自主搭建的海龟交易策略回测系统,它包括回测数据获取、回测函数构建与调用、回测指标计算,以及输出回测图,四个主要步骤。电脑前的你,Get到回测系统的设计小技能了吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1717925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编译安装PHP服务(LAMP3)

目录 1.初始化设置&#xff0c;将安装PHP所需软件包传到/opt目录下 &#xff08;1&#xff09;关闭防火墙 &#xff08;2&#xff09;上传软件包到/opt目录 2.安装GD库和GD库关联程序&#xff0c;用来处理和生成图片 3.配置软件模块 4.编译及安装 5.优化把PHP 的可执行程…

Spring boot 随笔 1 DatasourceInitializer

0. 为啥感觉升级了 win11 之后&#xff0c;电脑像是刚买回来的&#xff0c;很快 这篇加餐完全是一个意外&#xff1a;时隔两年半&#xff0c;再看 Springboot-quartz-starter 集成实现的时候&#xff0c;不知道为啥我的h2 在应用启动的时候&#xff0c;不能自动创建quartz相关…

剖析【C++】——类和对象(下篇)——超详解——小白篇

目录 1.再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit 关键字 2. Static成员 2.1 概念 2.2 特性 3. 友元 3.1 友元函数 3.2 友元类 3.3总结&#xff1a; 4. 内部类 1.概念 2.特性 示例代码&#xff1a; 代码分析 3.总结 5.再次理解类和对象 …

vue2转vue3初步下载pnpm遇到的问题 pnpm : 无法加载文件 D:\nodejs\pnpm.ps1

安装pnpm npm install -g pnpm pnpm -v 提示&#xff1a; 解决&#xff1a;nvm install 18.18.0 下载最稳定版本的nodejs nvm use 18.18.0 然后注意重新下载删除pnpm npm uninsta17 -g pnpm npm install -g pnpmlatest 在vscode使用pnpm报错 解决&#xff1a;管理员运行Windo…

C语言.数据结构.单链表

数据结构.单链表 1.链表的概念及结构2.单链表的实现2.1链表的打印2.2节点的申请2.3单链表的尾插2.4单链表的头插2.5单链表的尾删2.6单链表的头删2.7单链表节点的查找2.8在指定位置之前插入数据2.9在指定位置之后插入数据2.10删除pos节点2.11删除pos之后的节点2.12单链表的销毁2…

新一代最强开源UI自动化测试神器Playwright(Java版)六(断言)

Playwright是一个流行的UI自动化测试框架&#xff0c;用于编写UI自动化测试。在测试中&#xff0c;断言是一个非常重要的概念&#xff0c;用于验证测试的结果是否符合预期。Playwright提供了一些内置的断言函数&#xff0c;可以帮助测试人员编写更加简洁和可读的测试代码。本文…

为啥装了erlang,还报错erl: command not found?

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题背景&#xff1a; 在一台不通外网的服务器上装rabbitmq&#xff0c;然后在启动的时候&#xff0c;遇到了报错 “/usr/lib/…

走进中国照明百强西顿照明,解码数字化战略与经营增长

5月24日&#xff0c;纷享销客携领20多位企业高管走进纷享销客【数字化标杆】游学示范基地——西顿照明&#xff0c;并参访其位于惠州总部的光之家及灯巢&#xff0c;特邀广东端到端管理咨询兼纷享管理服务专家陈立云、西顿照明CIO唐勇作主题分享&#xff0c;为嘉宾带来一场解码…

【成品设计】基于STM32单片机的饮水售卖机

基于STM32单片机的饮水售卖机 所需器件&#xff1a; STM32最小系统板。RFID&#xff1a;MFRC-522用于IC卡检测。OLED屏幕&#xff1a;用于显示当前水容量、系统状态等。水泵软管&#xff1a;用于抽水。水位传感器&#xff08;3个&#xff09;&#xff1a;用于分别标定&#x…

Qt-qrencode生成二维码

Qt-qrencode开发-生成二维码&#x1f4c0; 文章目录 Qt-qrencode开发-生成二维码&#x1f4c0;[toc]1、概述&#x1f4f8;2、实现效果&#x1f4bd;3、编译qrencode&#x1f50d;4、在QT中引入编译为静态库的QRencode5、在Qt中直接使用QRencode源码6、在Qt中使用QRencode生成二…

数据可视化:解析其在现代生活中的日益重要地位

数据可视化为什么对我们的生活影响越来越大&#xff1f;这是一个值得探讨的话题。在信息化时代&#xff0c;数据无处不在&#xff0c;海量的数据不仅改变了商业模式&#xff0c;也深刻影响了我们的日常生活。数据可视化作为一种将复杂数据转化为直观图表、图形的技术&#xff0…

ubuntu22.04.3 vmware虚拟机配置共享文件夹 解决无法挂载/mnt/hgfs,血泪教训

一、背景介绍 在VMware Workstation 17 Pro上创建ubuntu22.04.3虚拟机&#xff0c;实现在ubuntu系统中共享windows的文件夹。按照网上方法试了大半&#xff0c;都没法解决&#xff0c;最终发现是vmware tools安装出现了问题&#xff0c;成功安装后&#xff0c;解决。 二、配置…

【软件测试】软件测试概念 | 测试用例 | BUG | 开发模型 | 测试模型 | 生命周期

文章目录 一、什么是软件测试1.什么是软件测试2.软件测试和调试的区别测试人员需要的素养 二、软件测试概念1.需求1.需求的定义2.测试人员眼中的需求 2.测试用例1.测试用例概念 3.BUG 软件错误4、开发模型和测试模型1.软件的生命周期2.开发模型1.瀑布模型2.螺旋模型3.增量、迭代…

端午档新片已预热,强业绩修复的影视股为何仍在徘徊?

随着端午临近&#xff0c;假期13部新片开始定档。据猫眼专业版显示&#xff0c;截至5月29日11时&#xff0c;即将上映的这13部新片&#xff0c;预售总票房已达到2155万。 受此消息影响&#xff0c;近日影视股出现了小幅的触底震荡反弹迹象&#xff0c;其中IMAX中国(01970)反弹…

记录Win11安装打印机驱动过程

1. 首先下载打印机对应型号的驱动 可以从这里下载&#xff1a;打印机驱动,打印机驱动下载 - 打印机驱动网 2. 下载 3. 打开控制面板-->设备和打印机 找到目标打印机添加设备即可 新增打印纸张尺寸

上传图片并显示#Vue3#后端接口数据

上传图片并显示#Vue3#后端接口数据 效果&#xff1a; 代码&#xff1a; <!-- 上传图片并显示 --> <template><!-- 上传图片start --><div><el-form><el-form-item><el-uploadmultipleclass"avatar-uploader"action"…

借助AI大模型,三分钟原创一部儿童故事短视频(附完整操作步骤)

前面文章的介绍&#xff0c;我们可以通过在自己笔记本电脑上部署的Llama 3大模型生成文章、文本润色、生成摘要等。今天我们更进一步&#xff0c;在文本的基础上&#xff0c;快速制作一部儿童故事短视频&#xff0c;且可根据自己需要完全原创…… 前提&#xff1a;有AI大模型对…

禅道迁移,linux一键安装版

问题描述&#xff1a;公司需要迁移禅道到另外一台服务器&#xff0c;没迁移过&#xff0c;去官网看了之后成功迁移&#xff0c;其中遇到了很多坑,希望对你们有所帮助。 禅道版本 迁移的版本一致&#xff0c;我的版本是18.3&#xff0c;18.3下载页面 其他版本下载 先进入检…

【SAP HANA 33】前端参数多选情况下HANA如何使用IN来匹配?

场面描述: 在操作界面经常会出现某个文本框需要多选的情况,然后后台需要根据多选的值进行匹配搜索。 一般处理的情况是: 1、在Java后端动态生成SQL 2、不改变动态SQL的情况,直接当做一个正常的参数进行传递 本次方案是第二个,直接当做一个正常的字符串参数进行传递即…

USB主机模式——Android

理论 摘自&#xff1a;USB 主机和配件概览 | Connectivity | Android Developers (google.cn) Android 通过 USB 配件和 USB 主机两种模式支持各种 USB 外围设备和 Android USB 配件&#xff08;实现 Android 配件协议的硬件&#xff09;。 在 USB 主机模式下&#xff0…