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

news2024/11/18 23:32:09

本文以双均线策略为例,描述如何在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_price
                 for 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.3
    context.short_period = 5 # 短期均线
    context.long_period = 50 # 长期均线 

def handle_data(context, data):
    
    # 长期均线值要有意义,需要在50根k线之后
    if context.trading_day_index <  context.long_period:   
        return
    
    k = 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.coloradmin.cn/o/1223648.html

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

相关文章

纯CSS自定义滚动条样式

.my-carousel{height: 474px;overflow-y: auto; } /*正常情况下滑块的样式*/ .my-carousel::-webkit-scrollbar {width: 5px; } .my-carousel::-webkit-scrollbar-thumb {border-radius: 8px;background-color: #ccc; } .my-carousel::-webkit-scrollbar-track {border-radius:…

机器学习笔记 - 隐马尔可夫模型的简述

隐马尔可夫模型是一个并不复杂的数学模型,到目前为止,它一直被认为是解决大多数自然语言处理问题最为快速、有效的方法。它成功地解决了复杂的语音识别、机器翻译等问题。看完这些复杂的问题是如何通过简单的模型得到描述和解决,我们会由衷地感叹数学模型之妙。 人类信息交流…

小程序申请,商户号申请,微信支付开通操作流程

总目录 文章目录 总目录前言1 申请商户号&#xff08;如已有商户号跳过&#xff09;1 申请流程与资料2 详细申请步骤 2 申请开通接入微信支付步骤3 申请微信小程序1 申请小程序步骤2 查看小程序AppID 4 微信支付普通商户与AppID账号关联结语 前言 本文主要讲解如何申请微信商户…

为什么选择B+树作为数据库索引结构?

背景 首先&#xff0c;来谈谈B树。为什么要使用B树&#xff1f;我们需要明白以下两个事实&#xff1a; 【事实1】 不同容量的存储器&#xff0c;访问速度差异悬殊。以磁盘和内存为例&#xff0c;访问磁盘的时间大概是ms级的&#xff0c;访问内存的时间大概是ns级的。有个形象…

二叉树中的深搜之二叉树的所有路径

257. 二叉树的所有路径 - 力扣&#xff08;LeetCode&#xff09; 对于二叉树的深度搜索&#xff0c;要学会从以下三个角度来去看待问题&#xff1a; 1. 全局变量&#xff0c;有时候全局变量会减少参数的个数&#xff0c;简化很多流程&#xff1b; 这道题目&#xff0c;要返回根…

Python3语法总结-数据转换②

Python3语法总结-数据转换② Python3语法总结二.Python数据类型转换隐式类型转换显示类型转换 Python3语法总结 二.Python数据类型转换 有时候我们&#xff0c;需要对数据内置的类型进行转换&#xff0c;数据类型的转换。 Python 数据类型转换可以分为两种&#xff1a; 隐式类…

zabbix-proxy分布式监控

Zabbix是一款开源的企业级网络监控软件&#xff0c;可以监测服务器、网络设备、应用程序等各种资源的状态和性能指标。在大型环境中&#xff0c;如果只有一个Zabbix Server来监控所有的节点&#xff0c;可能会遇到性能瓶颈和数据处理难题。 为了解决这个问题&#xff0c;Zabbi…

搜索引擎ElasticSearch分布式搜索和分析引擎学习,SpringBoot整合ES个人心得

ElasticSearch Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java语言开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。Elas…

ROS 学习应用篇(十)ROS中常用可视化工具的使用

ros工具箱有rqt_console、rqt_graph、rqtplot、rqt_image_view rqt plugins下可以打开多个调试窗口&#xff0c;非常好用偶吼吼 Rviz 重点来了 打开方式就是 rocore rivz gazebp roslaunch gazebo_ros **** 可以输入这玩一玩。

【面试经典150 | 数学】Pow(x, n)

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;快速幂-递归方法二&#xff1a;快速幂-迭代 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主…

前端JS 使用input完成文件上传操作,并对文件进行类型转换

使用input实现文件上传 // 定义一个用于文件上传的按钮<input type"file" name"upload1" />// accept属性用于定义允许上传的文件类型&#xff0c; onchange用于绑定文件上传之后的相应函数<input type"file" name"upload2"…

主办方:上海视频媒体,多样式多渠道跨屏传播

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 一&#xff0c;邀请视频媒体参加活动发布会&#xff0c;好处多多&#xff0c;首先现场气氛会很热烈&#xff0c;主办方会很有面子&#xff0c;视频媒体不管是电视台还是视频网站&#xf…

vue解除数据双向绑定

let obj JSON.parse(JSON.stringify(data));例如&#xff0c;table列表中&#xff0c;点击编辑时&#xff0c;可对val进行如上操作来解除双向绑定

竞赛选题 疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据全国疫情数据分析与3D可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff0…

云课五分钟-07安装Opera失败-版本不匹配

前篇&#xff1a; 云课五分钟-06一段代码调试debug-AI与人工 其中已经遇到了一些问题&#xff0c;在和文心一言交互过程中&#xff0c;由于提问不合适&#xff0c;得不到所期望的结果。 那么这一节本可以避免&#xff0c;但是为了展示失败&#xff0c;需要将过程录制。 视频…

游戏工作中用到的一些第3方软件和作用

记录下平时工作中发现的一些好用的软件: Snipaste:截屏软件 最好用的功能就是可以将截的图留在屏幕上,用来做提醒或者对比. RenderDoc:图形调试器 图形图像开\分析和捕捉时要用到的强大工具,可以捕捉图形帧并分析和调试.涵盖Vulkan,D3D11,D3D12.OpenGL,OpenGL ES以及windows …

【Vue渲染】 条件渲染 | v-if | v-show | 列表渲染 | v-for

目录 前言 v-if和v-show的区别和联系 v-show和v-if如何选择 条件渲染|v-if|v-show v-if v-if v-else v-if v-else-if v-else template v-show 列表渲染|v-for v-for 前言 本文介绍Vue渲染&#xff0c;包含条件渲染v-if和v-show的区别和联系以及列表渲染v-for v-if和…

Mybatis学习笔记-映射文件,标签,插件

目录 概述 mybatis做了什么 原生JDBC存在什么问题 MyBatis组成部分 Mybatis工作原理 mybatis和hibernate区别 使用mybatis&#xff08;springboot&#xff09; mybatis核心-sql映射文件 基础标签说明 1.namespace&#xff0c;命名空间 2.select&#xff0c;insert&a…

如何使商城系统达到高并发?

电子商务的蓬勃发展&#xff0c;商城系统的高并发处理能力成为企业竞争的关键。下面将为大家介绍一些有效的方法和策略&#xff0c;以帮助大家构建一个高并发的商城系统(仅供参考)。 一、优化数据库设计和查询 商城系统的高并发处理首先需要考虑的是数据库的设计和查询优化。合…