量化交易:开发传统趋势策略之---双均线策略

本文以双均线策略为例,描述如何在BigQuant策略平台上,开发一个传统的趋势跟踪策略,以更好地理解BigQuant回测机制。

双均线策略的策略思想是:当短期均线上穿长期均线时,形成金叉,此时买入股票。当短期均线下穿长期均线时,形成死叉,此时卖出股票。研究表明,双均线系统虽然简单,但只要严格执行,也能长期盈利。

策略的构建流程如下图所示:

构建策略流程

BigStudio环境下构建如下流程

第一步,通过证券代码列表模m1块指定回测的股票和回测起止日期。

第二步,通过特征输入列表模块m2定义买入和卖出信号

  • 定义5日均线大于50日均线作为买入条件信号buy_condition,

  • 定义5日均线小于50日均线作为卖出条件信号sell_condition。

这里的等号表示将表达式重命名,以免表达式过长导致不方便后续的过滤操作。

buy_condition=where(mean(close_0,5)>mean(close_0,50),1,0)
sell_condition=where(mean(close_0,5)<mean(close_0,50),1,0)

 上述代码中使用的close_0默认是后复权价格,如果想采用真实价格计算信号,那么可以改写为

buy_condition=where(mean(close_0/adjust_factor_0,5)>mean(close_0/adjust_factor_0, 50),1,0)
sell_condition=where(mean(close_0/adjust_factor_0,5,5)<mean(close_0/adjust_factor_0, 50),1,0)

第三步,通过基础特征抽取模块获取表达式中基础因子数据close_0,

第四步,通过衍生特征抽取m8获取buy_condition和sell_condition对应的因子表达式数据。

第五步,利用缺失值处理模块m6对含有缺失值的行进行删除处理。

第六步,将证券代买列表模块的输出和计算好的买卖条件信号输出给回测模块m3。

在回测模块中,首先在初始化函数里通过context.set_commission设置交易手续费

# 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))

本例中,设置股票的买入手续费按照成交额的0.0003收取,卖出手续费按成交额的0.0013收取,不足5元按照5元收取。

然后,在数据准备函数中定义全局变量context.daily_stock_buy和context.daily_stock_sell分别获取每日符合买卖条件的股票列表

# 回测引擎:准备数据,只执行一次
def bigquant_run(context):# 加载计算数据df = context.options['data'].read_df()# 函数:求满足开仓条件的股票列表def open_pos_con(df):return list(df[df['buy_condition']>0].instrument)# 函数:求满足平仓条件的股票列表def close_pos_con(df):return list(df[df['sell_condition']>0].instrument)# 逐日计算每日买入股票列表context.daily_stock_buy= df.groupby('date').apply(open_pos_con)# 逐日计算每日卖出股票列表context.daily_stock_sell= df.groupby('date').apply(close_pos_con)

 最后,在主函数中进行每日交易逻辑的编写

# 回测引擎:每日数据处理函数,每天执行一次
def bigquant_run(context, data):# 获取今日的日期字符串today = data.current_dt.strftime('%Y-%m-%d')  # 通过positions对象,使用列表生成式的方法获取目前持仓的股票列表stock_hold_now = {e.symbol: p.amount * p.last_sale_pricefor e, p in context.portfolio.positions.items()}try:buy_stock = context.daily_stock_buy[today]  # 当日符合买入条件的股票except:buy_stock=[]  # 如果没有符合条件的股票,就设置为空try:sell_stock = context.daily_stock_sell[today]  # 当日符合卖出条件的股票except:sell_stock=[] # 如果没有符合条件的股票,就设置为空# 需要卖出的股票:已有持仓中符合卖出条件的股票stock_to_sell = [ i for i in stock_hold_now if i in sell_stock ]# 如果有卖出信号if len(stock_to_sell)>0:for instrument in stock_to_sell:# 将标的转化为equity格式以便下单操作sid = context.symbol(instrument) # 获取股票持仓cur_position = context.portfolio.positions[sid].amount# 如果有股票持仓并且处于可交易状态,则下单卖出if cur_position > 0 and data.can_trade(sid):# 通过order_target_percent下单至指定仓位比例(通常0到1之间)context.order_target_percent(sid, 0) # 如果有买入信号/需要调整持仓if len(buy_stock )>0:# 每只股票的比重为等资金比例持有weight = 1/len(buy_stock )for instrument in buy_stock :# 将标的转化为equity格式以便下单操作sid = context.symbol(instrument)if  data.can_trade(sid):context.order_target_percent(sid, weight) # 买入

策略案例---

策略名称

双均线策略

策略思路

  1. 长期均线小于短期均线且没有持仓, 则买入;
  2. 长期均线大于短期均线且持有, 则卖出.

股票池筛选

600519.SHA 这一只股票

1. 主要参数
# 股票选择
instruments = ['600519.SHA']  
# 开始时间
start_date = '2017-11-24'  
# 结束时间
end_date = '2021-11-24'
2. 策略回测主体
# 初始化账户
def initialize(context):context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)) # 设置手续费,买入成本为万分之三,卖出为千分之1.3context.short_period = 5 # 短期均线context.long_period = 50 # 长期均线 def handle_data(context, data):# 长期均线值要有意义,需要在50根k线之后if context.trading_day_index <  context.long_period:   returnk = instruments[0] # 标的为字符串格式sid = context.symbol(k) # 将标的转化为equity格式price = data.current(sid, 'price') # 最新价格short_mavg = data.history(sid, 'price',context.short_period, '1d').mean() # 短期均线值long_mavg = data.history(sid, 'price',context.long_period, '1d').mean() # 长期均线值cash = context.portfolio.cash  # 现金cur_position = context.portfolio.positions[sid].amount # 持仓# 交易逻辑# 如果短期均线大于长期均线形成金叉,并且没有持仓,并且该股票可以交易if short_mavg > long_mavg and cur_position == 0 and data.can_trade(sid):  context.order(sid, int(cash/price/100)*100) # 买入# 如果短期均线小于长期均线形成死叉,并且有持仓,并且该股票可以交易elif short_mavg < long_mavg and cur_position > 0 and data.can_trade(sid):  context.order_target_percent(sid, 0) # 全部卖出
3.回测接口
m=M.trade.v3(instruments=instruments,start_date=start_date,end_date=end_date,initialize=initialize,handle_data=handle_data,order_price_field_buy='open', # 以开盘价买入order_price_field_sell='open', # 以开盘价卖出capital_base=1000000, # 本金)

详情参见: 双均线可视化策略 - bigquant

 

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

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

相关文章

【2023春李宏毅机器学习】生成式学习的两种策略

文章目录 1 各个击破2 一步到位3 两种策略的对比 生成式学习的两种策略&#xff1a;各个击破、一步到位 对于文本生成&#xff1a;把每一个生成的元素称为token&#xff0c;中文当中token指的是字&#xff0c;英文中的token指的是word piece。比如对于unbreakable&#xff0c;他…

优化|优化求解器自动调参

原文信息&#xff1a;MindOpt Tuner: Boost the Performance of Numerical Software by Automatic Parameter Tuning 作者&#xff1a;王孟昌 &#xff08;达摩院决策智能实验室MindOpt团队成员&#xff09; 一个算法开发者&#xff0c;可能会幻想进入这样的境界&#xff1a;算…

【Android】如何使用模拟器调试安卓项目

1、电脑安装逍遥模拟器&#xff0c;用来跑安卓项目。安装好模拟器之后&#xff0c;直接起安卓项目&#xff0c;自动会在选择设备处显示 2、如果前端是安卓后端是其他语言的话&#xff0c;这种前后端分离的模式&#xff0c;需要监听端口&#xff0c;原因是运行安卓和后端编译器都…

NC65 如何设置现金流量明细查询的查询框中核算账簿可多选??

NC65 如何设置现金流量明细查询的查询框中核算账簿可多选&#xff1f;&#xff1f; NC65 如何设置现金流量明细查询的查询框中核算账簿可多选&#xff1f;&#xff1f;效果如下图 解决方案二开&#xff0c;即在 nc.ui.gl.cashflowcase.CashFlowDetailQueryUI 的 onButtonQuer…

安装银河麒麟linux系统docker(docker-compose)环境,注意事项(一定能解决,有环境资源)

1&#xff1a;安装docker环境必须使用麒麟的版本如下 2&#xff1a;使用docker-compse up -d启动容器遇到的文件 故障1&#xff1a;如果运行docker-compose up 报“Cannot create redo log files because data files are corrupt or the database was not shut down cleanly a…

使用docker部署nacos分布式集群

本文目的 在服务器中部署nacos集群&#xff0c;并连接外置数据库关于外置的mysql部署和单例nacos如何部署请看下面的两个链接 如何使用docker部署mysql docker部署容器化mysql5.7-CSDN博客 如何使用docker部署nacos 容器化部署Nacos&#xff1a;从环境准备到启动-CSDN博客…

mfc140u.dll丢失的解决方法,以及针对每个解决mfc140u.dll丢失办法的优缺点

在使用电脑的过程中&#xff0c;有时会遇到一些与动态链接库文件&#xff08;DLL&#xff09;相关的错误。其中&#xff0c;mfc140u.dll丢失是一种常见的问题&#xff0c;它可能导致应用程序无法正常运行。在本文中&#xff0c;我们将探讨关于mfc140u.dll丢失的解决办法&#x…

WordPress主题WoodMart v7.3.2 WooCommerce主题和谐汉化版下载

WordPress主题WoodMart v7.3.2 WooCommerce主题和谐汉化版下载 WoodMart是一款出色的WooCommerce商店主题&#xff0c;它不仅提供强大的电子商务功能&#xff0c;还与流行的Elementor页面编辑器插件完美兼容。 主题文件在WoodMart Theme/woodmart.7.3.2.zip&#xff0c;核心在P…

利用 Pandoc + ChatGPT 优雅地润色论文,并保持 Word 公式格式:Pandoc将Word和LaTeX文件互相转化

论文润色完美解决方案&#xff1a;Pandoc 与 ChatGPT 的强强联合 写在最前面其他说明 一、通过 Pandoc 将 Word 转换为 LaTeX 的完整指南步骤 1: 安装 PandocWindows:macOS:Linux: 步骤 2: 准备 Word 文档步骤 3: 转换文档步骤 4: 检查并调整输出步骤 5: 编译 LaTeX 文档总结 二…

Ubuntu 22.04安装Rust编译环境并且测试

我参考的博客是《Rust使用国内Crates 源、 rustup源 |字节跳动新的 Rust 镜像源以及安装rust》 lsb_release -r看到操作系统版本是22.04,uname -r看到内核版本是uname -r。 sudo apt install -y gcc先安装gcc&#xff0c;要是结果给我的一样的话&#xff0c;那么就是安装好了…

【SpringBoot篇】分页查询 | 扩展SpringMvc的消息转换器

文章目录 &#x1f6f8;什么是分页查询&#x1f339;代码实现⭐问题&#x1f384;解决方法 做了几个项目&#xff0c;发现在这几个项目里面&#xff0c;都实现了分页查询效果&#xff0c;所以就总结一下&#xff0c;方便学习 我们基于黑马程序员的苍穹外卖来讲解分页查询的要点…

Java中如何通过路径表达式找值:XPath和JsonPath以及SpEL详解及对比

大家好&#xff0c;我是G探险者。 我们编程时&#xff0c;在前后端数据交互和传输过程中&#xff0c;往往需要对报文中的某个字段或者某个标签的值进行解析读取&#xff0c;报文通常是以json或者xml作为数据交换格式&#xff0c;而json和xml这两种格式的报文结构都是具备一定的…

docker容器自启动

场景 当服务器关机重启后&#xff0c;docker容器每次都要去docker start 容器id 怎么可以下次让它自启动呢&#xff1f; 解决 先 # docker ps -a 查到之前启动过的容器id # docker update --restartalways 容器id重启后&#xff0c;reboot&#xff0c;就不用再单独去启动容…

string类的总结

目录 1.为什么要学习string类 2.string的标准库 3.string类的常用接口说明 1.string类对象的常见构造 2.string类对象的容量操作 3.string类对象的3种遍历方法 3.1 [ ] 下标 3.2 基于范围的for循环 3.3 迭代器 4 string类对象的元素访问 4.1 operator[]&#xff1a; 4.…

目标检测—YOLO系列(二 ) 全面解读复现YOLOv1 PyTorch

精读论文 前言 从这篇开始&#xff0c;我们将进入YOLO的学习。YOLO是目前比较流行的目标检测算法&#xff0c;速度快且结构简单&#xff0c;其他的目标检测算法如RCNN系列&#xff0c;以后有时间的话再介绍。 本文主要介绍的是YOLOV1&#xff0c;这是由以Joseph Redmon为首的…

交通 | 神奇动物在哪里?Operations Research经典文章

论文作者&#xff1a;Robert G. Haight, Charles S. Revelle, Stephanie A. Snyder​ 论文原文&#xff1a;Robert G. Haight, Charles S. Revelle, Stephanie A. Snyder, (2000) An Integer Optimization Approach to a Probabilistic Reserve Site Selection Problem. Operat…

VR智慧景区:VR赋能文旅产业,激活消费潜能

随着国家数字化战略的不断深入实施&#xff0c;文旅产业数字化转型的步伐也在逐渐加快&#xff0c;以VR技术赋能文旅产业&#xff0c;让文旅景区线上线下双渠道融合&#xff0c;进一步呈现文化底蕴、激活消费潜能。 VR智慧景区以沉浸式、互动式、科技感的方式&#xff0c;将景区…

Thrift协议详解

前言特点高效性的体现可拓展性的体现 应用场景示例拓展其他常用协议接口描述语言&#xff08;IDL&#xff09;TBinaryProtocolTCompactProtocolTDebugProtocolTDenseProtocolTJSONProtocol 前言 Thrift协议是一种接口描述语言和二进制通讯协议&#xff0c;它被用来定义和创建跨…

基于STM32的多组外部中断(EXTI)的优化策略与应用

在某些嵌入式应用中&#xff0c;可能需要同时处理多个外部中断事件。STM32系列微控制器提供了多组外部中断线&#xff08;EXTI Line&#xff09;&#xff0c;可以同时配置和使用多个GPIO引脚作为外部中断触发器。为了有效管理和处理多组外部中断&#xff0c;我们可以采取一些优…

uart控制led与beep

仲裁模块代码&#xff1a; // 外设控制模块&#xff0c;根据uart接收到的数据&#xff0c;控制led与beep的标志信号。 module arbit(input wire sys_clk ,input wire sys_rst_n ,input wire pi_flag …