第 七 篇 目录

  • 一、回 测 是 什 么 ?
  • 二、回 测 与 实 盘 交 易
  • 三、开源双均线策略回测框架搭建(pyalgotrade)
    • (一)、模块安装
    • (二)、双 均 线 回 测 框 架 搭 建
    • (三)、分 析 结 果

一、回 测 是 什 么 ?

回测是一种反向测试,从各种评价指标和统计学层面上,以大数据的方式评估策略,验证设定的交易规则是否有效。测试里是数据的预测模型,用于估计策略或模型在过去一段时间的表现,需要提供足够的细节模拟过去的条件,条件可以是收盘价为基准。

二、回 测 与 实 盘 交 易

⚠️ 回测数据与实盘交易数据存在差异性
⚠️ 回测结果不能代表策略百分百能赚钱:注意收益盈亏几点位(是否都是按策略交易)

影响的原因:
1)未来函数的差异
2)滑点

三、开源双均线策略回测框架搭建(pyalgotrade)

(一)、模块安装

pip install pyalgotrade

(二)、双 均 线 回 测 框 架 搭 建

# # 调用pyalgotrade回测框架模块
# 调用pyalgotrade回测模块:计算指标、回测数据
from pyalgotrade import strategy
# 调用pyalgotrade数据整理模块:提供数据
from pyalgotrade.barfeed import quandlfeed
# 调用pyalgotrade_tushare模块的导出股票行情函数
from pyalgotrade_tushare import tools, barfeed
# 调用pyalgotrade_tushare模块的  移动平均线函数
from pyalgotrade.technical import ma
# 调用pyalgotrade_tushare模块的  相对强弱指标函数
from pyalgotrade.technical import rsi
# 调用pyalgotrade的画图模块
from pyalgotrade import plotterfrom pyalgotrade.stratanalyzer import returnsdef safe_round(value, digits):if value is not None:value = round(value, digits)return value
# 设置回测类
class MyStrategy(strategy.BacktestingStrategy):# feed:数据集,instrument:股票代码 ,smaPeriod:设定N天的均价def __init__(self, feed, instrument, smaPeriod1,smaPeriod2):# super调用副类回测函数strategy.BacktestingStrategy(数据,投资金额)super(MyStrategy, self).__init__(feed,1e5)# 设置持有股数为空self.__position = None# 传递股票代码self.__instrument = instrument# 调整后的输盘价(复权后的收盘价)# self.setUseAdjustedValues(True)  # # 传递计算移动平均线"""feed[instrument].getCloseDataSeries():调取股票数据的收盘价数据ma.SMA():计算移动平均线的函数smaPeriod:代表N天 """# 计算均线1self.__sma1 = ma.SMA(feed[instrument].getCloseDataSeries(),smaPeriod1)# 计算均线2self.__sma2 = ma.SMA(feed[instrument].getCloseDataSeries(),smaPeriod2)# # 传递计算相对强弱指标# self.__rsi = rsi.RSI(feed[instrument].getCloseDataSeries(), 14)# 定义移动平均线1模块def getSMA1(self):# 返回移动平均线数据return self.__sma1# 定义移动平均线2模块def getSMA2(self):# 返回移动平均线数据return self.__sma2# 买入成交模块def onEnterOk(self, position):# 设置买入订单信息的执行信息:持有股数 按照 获取入口订单 获取执行信息 实施execInfo = position.getEntryOrder().getExecutionInfo()# # 打印买入执行价格# self.info("BUY at $%.2f" % (execInfo.getPrice()))# 买入取消模块def onEnterCanceled(self, position):# 持有股数为空self.__position = None# 卖出成交模块def onExitOk(self, position):# 设置卖出订单信息的执行信息:持有股数 按照 获取入口订单 获取执行信息 实施execInfo = position.getExitOrder().getExecutionInfo()# # 打印卖出执行价格# self.info("SELL at $%.2f" % (execInfo.getPrice()))# 持有股数为空self.__position = None# 卖出取消模块def onExitCanceled(self, position):# 如果是卖出取消,则持有股数再次执行卖出执行的逻辑self.__position.exitMarket()# 行情数据模块def onBars(self, bars):# 如果足够的行情数据可用于计算移动平均线1则输出。# if self.__sma1[-1] is None:#     # 则输出。#     return# 如果足够的行情数据可用于计算移动平均线2则输出。if self.__sma2[-1] is None:# 则输出。return# 设置股票行情数据bar = bars[self.__instrument]# # 打印股票对象收盘价的信息# # bar.getClose():获取收盘价、self.__rsi:相对强弱指标、self.__sma:移动平均线[15天]# self.info("%s %s %s" % (bar.getClose(), safe_round(self.__rsi[-1], 2), safe_round(self.__sma[-1], 2)))# # 定义策略# 如果当前没有买入股票if self.__position is None:# 如果当前行情大于当前移动平均线值# if bar.getPrice() > self.__sma[-1]:# 如果当前短期均价大于当前长期期均价if self.__sma1[-1] > self.__sma2[-1]:"""  self.enterLong():执行买入操作"""# 输入购买100股股票的市场指令,订单取消前一直有效。(持有股数按照每手100股买入)self.__position = self.enterLong(self.__instrument, 100, True)# 否则检查是否必须退出该位置。(如果卖出:如果当前行情小于当前移动平均线值 且 持有股数不是撤单的情况)# elif bar.getPrice() < self.__sma[-1] and not self.__position.exitActive():# 否则检查是否必须退出该位置。(如果卖出:如果当前短期均价小于当前长期均价 且 持有股数不是撤单的情况)elif self.__sma1[-1] < self.__sma2[-1] and not self.__position.exitActive():# 持有股票数执行卖出逻辑self.__position.exitMarket()print(']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]')
# 策略运行模块
def run_strategy(smaPeriod1,smaPeriod2):""" smaPeriod:移动平均周期 """# 设置股票代码codes = ["000001"]# 调取股票行情数据data = tools.build_feed(codes, 2018,2022, "histdata")# 实化策略模块myStrategy = MyStrategy(data, codes[0], smaPeriod1 = smaPeriod1, smaPeriod2 = smaPeriod2)# # 运行策略回测# myStrategy.run()# # 打印策略投资结果# print(smaPeriod1,smaPeriod2,"Final portfolio value: $%.2f" % myStrategy.getResult())# # 可视化# 实化returns模块(分析器)returnsAnalyzer = returns.Returns()# 将分析器附加到策略当中myStrategy.attachAnalyzer(returnsAnalyzer)# 将绘图模块连接到策略当中。plt = plotter.StrategyPlotter(myStrategy)# 将SMA包含在分析图的子图中,将策略与收盘价一起显示。plt.getInstrumentSubplot(codes[0]).addDataSeries("SMA1", myStrategy.getSMA1())plt.getInstrumentSubplot(codes[0]).addDataSeries("SMA2", myStrategy.getSMA2())# 绘制每次收益率曲线。plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", returnsAnalyzer.getReturns())# 运行策略回测myStrategy.run()# 打印策略投资结果myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult())# 制定策略。plt.plot()# # 设置不同的周期进行回测
# for i in range(5,30):
#     # 回测运行
run_strategy(15,30)
# ma1 = [5,10,15]
# ma2 = [10,20,30]
# for i in ma1:
#     for j in ma2:
#         if i < j:
#             run_strategy(i,j)

(三)、分 析 结 果



金 融 量 化 分 析 • JoinQuant • 第 七 篇相关推荐

  1. 金 融 量 化 分 析 • JoinQuant • 第 一 篇

    第 一 篇 一.聚宽模块安装.更新方法 二.聚宽模块登录 三.获取股票行情数据方法 (一).获取单个股票多天每分钟行情数据的获取函数:get_price(参数) (二).获取单个股票基本信息 ( 1 ...

  2. 金 融 量 化 分 析 • JoinQuant • 第 六 篇

    文章目录 一. 动 量 策 略 (一).动 量 正 向 策 略 (二).动 量 反 向 策 略 (三). 实 现 步 骤 (1)确定交易对象:股票池.考虑流动性(沪深300/创业板) (2)选定业绩评 ...

  3. 金 融 量 化 分 析 • JoinQuant • 第 四 篇

    第 四 篇 一.股 票 评 估 实 践 (一)风险指标 (1)最大回测 (2)夏普比率 (3)波动比率 二.使用步骤 一.股 票 评 估 实 践 根据过往数据评估平安银行.比亚迪.宁德时代.隆基股份 ...

  4. 金 融 量 化 分 析 • JoinQuant • 第 二 篇

    第 二 篇 一.自定义数据处理模块 (一).自定义获取所有A股列表模块 (二).自定义获取单个股票行情行情数据模块 (三).自定义导出股票相关数据模块 (四).自定义初始化股票行情数据库 (五).自定 ...

  5. 金 融 量 化 分 析 • JoinQuant • 第 五 篇

    文章目录 前言 一.策 略 可 靠 性 检 测 方 法 (一).评 估 指 标 1)胜 率 2)年 化 收 益 率 3)最 大 回 测 4)夏 普 比 率 (二).假 设 验 证 二.周 期 策 略 ...

  6. 金 融 量 化 分 析 • 外 篇 • 绘 制 行 情 数 据 数 据 图

    文章目录 前言 一.k 线 图 是 什 么 ? 二.K 线 图 结 构 (1) 影 线 和 实 体 (2) 十 字 线 四. 双 均 线 策 略 (一).金叉 (二).死叉 (三).均 线 策 略 的 ...

  7. 基 于 主 成 分分 析 和 灰 色 聚 类 对 我 国 居 民 收 入 差 距 分 析(陈 宝 平)

    作者:陈 宝 平 笔记:30各地区 行 业 的 平 均 工 资: 采 用 主 成 分 分析 对 每 个 地区1 0 年 的 泰 尔 指 数 降 维, 转 化 成 三 个 主 成 分 因 子: 通 过 ...

  8. 自 下 而 上 分 析 法 的 一 般 原 理

    自 下 而 上 分 析 法 的 一 般 原 理 编译中存在着多种自下而上的分析法,但不管哪种自下而上的分析法都是按照"移进 - 归约"法的原理建立起来的一种语法分析方法.这种分析法 ...

  9. 柴俊理金:量产高位施压原油,黄金颓势静待非农

    柴俊理金:量产高位施压原油,黄金颓势静待非农 美国WTI原油7月期货周二(5月31日)收跌0.23美元,跌幅0.47%,报49.10美元/桶,本月上涨6.34%.布伦特原油7月期货周二收跌0.07美元 ...

  10. 从大数据量分库分表 MySQL 合并迁移数据到 TiDB

    如果分表数据总规模特别大(例如大于 1 TiB),并且允许 TiDB 集群在迁移期间无其他业务写入,那么你可以使用 TiDB Lightning 对分表数据进行快速合并导入,然后根据业务需要选择是否使 ...

最新文章

  1. Ubuntu安装QT后无法输入中文怎么办?
  2. 来看看如何在 C# 中使用反射
  3. 理解和解决Java并发修改异常ConcurrentModificationException(转载)
  4. java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码
  5. SSM项目的数据库密码加密方案
  6. python rpc 性能比较_Python与RPC -- (转)
  7. linux 释放进程res_linux内存查看及释放
  8. 回调函数 线程_从0实现基于Linux socket聊天室-多线程服务器一个很隐晦的错误-2...
  9. 结构体内嵌比较函数bool operator (const node x) const {}
  10. 华为开发者大会2020(Together)精彩集锦
  11. github使用指南_GitHub 上的 12 个骚操作
  12. php 编码 url,php escape URL编码
  13. niceTitle插件
  14. Must specify unique android:id, android:tag, or have a parent with an id for 异常
  15. 新建Flutter项目无法导入FlutterActivity
  16. Windows 10 安装使用TensorFlow-GPU
  17. 酷睿i7 1165g7相当于什么水平 i71165g7属于哪个档次
  18. CUDA C 编程指导(二):CUDA编程模型详解
  19. 隐含马尔可夫模型——Hidden Markov models (HMM)
  20. 认知智能介绍发展道翰天琼

热门文章

  1. dubbo的工作原理
  2. Never give up!!
  3. 虚拟机连接摄像头程序报错
  4. ConTeXt TeXmacs
  5. VMware Ubuntu安装详细过程(非常靠谱)
  6. LoadBalancer负载均衡
  7. linux 实现离线迅雷,Linux下使用wget/aria2进行离线迅雷批量下载
  8. YY 数据库平台化建设实践
  9. 用NI的数据采集卡实现简单电子测试之2——绘制三极管输出特性曲线(面)图...
  10. 99乘法表儿歌_乘法口诀表儿歌