我们一般使用AKShare这个库来获取股票数据或策略中用得到的数据:
AKShare github主页:https://github.com/akfamily/akshare

使用Backtrader框架作为回测的框架:
Backtrader github主页:https://github.com/mementum/backtrader

使用quantstats库作为回测结果评价的库:
quantstats github主页:https://github.com/ranaroussi/quantstats

这一部分准备好之后,后续我们将关注点主要放在【策略】上,对于数据、评价指标这些如无特殊处理,将不再赘述。整个量化的框架构造起来不太容易,如果以前有所了解,可以用自己习惯的方式;如果觉得困难较大,也可以先跳过,等后面能力够了之后,再上手构建。

ps:大家要慎重的使用网上的量化平台,因为偷策略这种事太正常了,大家还是最好自己本地搭一个测试的平台~

文章目录

  • 1. 数据准备
  • 2. Backtrader回测框架准备
  • 3. 评价指标

下面的数据准备与Backtrader回测准备,只是博主提供的一个参考,在开始正式介绍量化策略的时候是不会涉及到每个数据的采集,手把手的代码,这些都是不会提及的,只会提供一个backtrader的策略类,作为对策略的编程实现。

1. 数据准备

比如股票数据:

  1. 首先创建一个data文件夹,然后在文件夹里创建一个stock_data的文件夹

  2. 创建一个code文件夹用来存放程序文件

  3. 然后新建一个python文件,使用如下代码:

    import time
    import akshare as ak
    from tqdm import tqdm
    from loguru import loggerdef extract_data():start_date = "20150101"end_date = "20221101"stock_list = ak.stock_zh_a_spot_em()  # 东方财富网-沪深京 A 股-实时行情数据for stock_code in tqdm(stock_list['代码']):time.sleep(1)stock_df = ak.stock_zh_a_hist(symbol=stock_code, period="daily", start_date=start_date, end_date=end_date, adjust="hfq")  # 后复权stock_df.to_pickle("../data/stock_data/{}.pkl".format(stock_code))logger.debug("ADD DATA {}", stock_code)if __name__ == '__main__':extract_data()
    

这里博主把股票数据保存到data/stock_data/文件夹下,以股票代码.pkl的格式保存:

2. Backtrader回测框架准备

Backtrader足够简单,同时也非常接近实盘(国外可以一键切换实盘,国内没有接口)

Backtrader的使用请参考:Backtrader量化&回测1——基本的交易策略与挂单买卖

从策略到最终影响金额,都会经历四个步骤:

  1. 策略信号
  2. 委托
  3. 订单
  4. 金额与标的的置换

因此盯紧订单的变化就可以了解策略对金额变动的影响,为了将更多精力用于策略本身的编写上,我们写一个策略模版,然后以后的策略都可以通过继承这个模版,把与策略无关的变量、操作都写在模版里:

from loguru import logger
import backtrader as btclass TemplateStrategy(bt.Strategy):def __init__(self):# 记录用self.buy_bond_record = {}  # 记录购买的订单self.sell_bond_record = {} # 记录卖出的订单def next(self):"""最核心的触发策略"""raisedef notify_order(self, order):"""通知订单状态,当订单状态变化时触发"""today_time_string = self.datetime.datetime().strftime('%Y-%m-%d')if order.status in [order.Submitted, order.Accepted]:  # 接受订单交易,正常情况returnif order.status in [order.Completed]:if order.isbuy():self.buy_bond_record.setdefault(today_time_string, {})self.buy_bond_record[today_time_string].setdefault(order.data._name.replace(".", "_"), [])self.buy_bond_record[today_time_string][order.data._name.replace(".", "_")].append({"order_ref": order.ref,"bond_name": order.data._name,"size": order.size,"price": order.executed.price,"value": order.executed.value,"trade_date": self.datetime.datetime(0),})logger.debug('{} 订单{} 已购入 {} , 购入单价 {:.2f}, 数量 {}, 费用 {:.2f}, 手续费 {:.2f}'.format(self.datetime.date(), order.ref, order.data._name, order.executed.price, order.size,order.executed.value, order.executed.comm))elif order.issell():self.sell_bond_record.setdefault(today_time_string, {})self.sell_bond_record[today_time_string].setdefault(order.data._name.replace(".", "_"), [])self.sell_bond_record[today_time_string][order.data._name.replace(".", "_")].append({"order_ref": order.ref,"bond_name": order.data._name,"size": order.size,"price": order.executed.price,"value": - order.executed.price * order.size,"sell_type": order.info.sell_type,"trade_date": self.datetime.datetime(0),})logger.debug('{} 订单{} 已卖出 {}, 卖出金额 {:.2f}, 数量 {}, 费用 {:.2f}, 手续费 {:.2f}'.format(self.datetime.date(), order.ref, order.data._name, order.executed.price, order.size,-order.executed.price * order.size, order.executed.comm))elif order.status in [order.Margin, order.Rejected]:logger.warning('{} 订单{} 现金不足、金额不足拒绝交易', self.datetime.date(), order.ref)elif order.status in [order.Canceled]:logger.debug("{} 订单{} 已取消", self.datetime.date(), order.ref)elif order.status in [order.Expired]:logger.warning('{} 订单{} 超过有效期已取消, 订单开价 {}, 当天最高价{}, 最低价{}', self.datetime.date(), order.ref, order.price,order.data.high[0], order.data.low[0])

之后的策略均继承此TemplateStrategy策略类,并覆写def next(self)函数即可,这一部分会将所有的订单在日志中打印下来

在程序中,购买的订单可以使用如下代码:

self.buy(data=self.getdatabyname(stock_name), # 针对哪一个股票代码size=100, # 数量price=self.getdatabyname(stock_name).close[0], # 以当天的收盘价购买exectype=bt.Order.Limit, # 限价单valid=self.getdatabyname(stock_name).datetime.date(1),  # 有效期1天)

3. 评价指标

我们使用quantstats这个库来对回测结果进行评价,这个库里的计算方法简单粗暴,通过对已有的计算方法的封装,我们得到可以方便的进行评价的方法:

import pandas as pd
import quantstats as qsdef cal_daily_return(fund_values: pd.Series):"""根据资金变动,计算日资产的变化率:param fund_values: 每日的总资产"""fund_values = fund_values.sort_index()daily_re: pd.Series = (fund_values / fund_values.shift(1)) - 1daily_re.iloc[0] = 0return daily_redef cal_rolling_feature(daily_return_series: pd.Series, rf=0.02, record_dict: dict = None):"""计算各种指标:param daily_return_series: 日收益的变化率:param rf: 无风险收益,这里定为0.02:param record_dict: 指标的结果会追加到这个字典中"""if record_dict is None:record_dict = {}daily_return_series.index = pd.to_datetime(daily_return_series.index.values)feature_df = pd.DataFrame(index=daily_return_series.index)feature_df['累积收益率'] = qs.stats.compsum(daily_return_series).valuesfeature_df['回撤'] = qs.stats.to_drawdown_series(daily_return_series)record_dict.update({"累积收益率": feature_df['累积收益率'].iloc[-1]})feature_dict = {"复合年增长": qs.stats.cagr(daily_return_series, rf=rf),"夏普比率": qs.stats.sharpe(daily_return_series, rf=rf),"索蒂诺": qs.stats.sortino(daily_return_series, rf=rf),"omega": qs.stats.omega(pd.DataFrame(daily_return_series), rf=rf),"最大回撤": qs.stats.max_drawdown(daily_return_series),"最大回撤期(天)": int(qs.stats.drawdown_details(feature_df['回撤'])['days'].max()),"年波动率": qs.stats.volatility(daily_return_series),}record_dict.update(feature_dict)# 决定保留的小数for key, value in record_dict.items():if isinstance(value, float):record_dict[key] = value.round(3)return feature_df, record_dict

量化策略——准备3 数据、Backtrader回测框架与quantstats评价指标相关推荐

  1. backtrader回测框架实例

    backtrader是基于Python的量化回测框架,功能丰富,操作方便.其优点是运行速度快,支持pandas的矢量运算:内置多种技术指标计算,还支持股票分析技术指标库talib:支持参数自动寻优运算 ...

  2. 量化交易 米筐 单因子回测框架(因子方向性确定)

    因子方向性确定 当筛选出部分因子后,其实我们还要去观察它在回测过程中真实的收益率情况, 所以需要建立每个因子的回测框架,主要对不同分位上的股票进行统计. 也就是 以下图: 代码 # 可以自己impor ...

  3. Python backtrader回测之布林带策略

    在做量化分析时,我们有很多种策略,这些策略的好坏如何去评价,那就是用过往数据进行测试.这里就需要用到量化分析的回测系统了.由于刚入门,就使用了Python中的backtrader.由于自己Python ...

  4. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    1 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的,交易将无利可图.均值回归是金融学的一个重要概念,指股票价格无 ...

  5. 量化交易-Backtrader回测

    目录 一.基础篇-backtrader简介 二.backtrader回测应用实例 三.backtrader数据全解析 3.1 数据中必须包含 3.2 一切皆是数据源 3.3 参数 3.4 Lines线 ...

  6. python量化策略源码_Python量化交易进阶讲堂-创建自定义量化回测框架

    欢迎大家订阅<Python实战-构建基于股票的量化交易系统>小册子,小册子会陆续推出与小册内容相关的专栏文章,对涉及到的知识点进行更全面的扩展介绍,并且会有选择地收录至小册中,更便于广大读 ...

  7. 11、【股票策略】用backtrader回测在A股上复利年化收益率超20%的“狗股策略”?

    11.用backtrader回测在A股上复利年化收益率超20%的"狗股策略"? 更进一步的回测代码可以参考版本4:[股票策略]使用backtrader测试狗股策略版本4-在版本3的 ...

  8. A股月份效应的研究——基于python量化视角(backtrader回测)

    A股月份效应的研究 前言 <易经>早就揭示出:物极必反,盛极必衰! 阴阳总是不断交替的.股票市场也一样,涨跌互现,涨多了会出现调整,跌多了会出现反弹,因此我们看到K线组合总是红(阳)绿(阴 ...

  9. 12、【股票策略】使用backtrader回测升级版的狗股策略-基于股息率和市净率两个因子

    12.使用backtrader回测升级版的狗股策略-基于股息率和市净率两个因子 更进一步的回测代码可以参考版本4:[股票策略]使用backtrader测试狗股策略版本4-在版本3的基础上进行代码改进优 ...

最新文章

  1. 远程管理linux系统工具,远程管理Linux系统工具的设计与实现Linux013
  2. 防止Domino邮件服务器作为垃圾邮件转发服务器
  3. SwiftTheme--iOS换肤解决方案
  4. 不是python对文件的读操作方法的是-python的文件操作方法
  5. Mysql(12)——inner join的用法
  6. tnsnames.ora 的编写
  7. python的UML类图自动生成工具--pyreverse安装和使用
  8. Gson解析数组和list容器
  9. windows java环境搭建_Java环境搭建(Windows环境)-Fun言
  10. 极光推送源码api封装改造
  11. 用overleaf 写 计算机学报 格式的论文
  12. 婚姻是一场精神上的门当户对
  13. iphone 4s IOS9 越狱教程
  14. 微信公众号如何运营和管理?
  15. Nagios基本介绍
  16. vue向后端发送数据并得到返回值
  17. 《Python自然语言处理-雅兰·萨纳卡(Jalaj Thanaki)》学习笔记:05 特征工程和NLP算法
  18. php union用法,C++_C语言、C++中的union用法总结,开始的话 已经好长时间没有 - phpStudy...
  19. 查询计算机系统操作工,计算机系统操作工B卷
  20. 最近做到一道好题,特来和大家分享一下。

热门文章

  1. 十三、JavaSE-IO体系
  2. 计算机游戏与动画技术课程,计算机游戏动画教学大纲.pdf
  3. 还愁没壁纸?Python爬取5K分辨率高清桌面壁纸
  4. 《机器人SLAM导航核心技术与实战》前言
  5. 知识工作效率八段锦 【51PPT】
  6. 霍华德大学计算机科学,霍华德大学MBA专业怎么样?
  7. php百度地图创建应用程序,使用百度地图API创建第一个电子地图
  8. Verilog中Case语句
  9. ENDNOTE中使用Adobe打开PDF后提示“只读无法保存”
  10. Python 一个快速视频剪辑编辑神器 — Moviepy