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

本文以双均线策略为例,描述如何在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.hqwc.cn/news/190934.html

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

相关文章

csapp深入理解计算机系统 bomb lab(1)phase_1

实验目的&#xff1a;进一步了解机器级代码&#xff0c;提高汇编语言、调试器和逆向工程等方面原理与技能的掌握。 实验环境&#xff1a;C、linux 实验获取&#xff1a;进入csapp官网&#xff0c;点击linux/x86-64 binary bomb下载实验压缩包。 实验说明&#xff1a;一共有6…

DRF纯净版项目搭建和配置

一、安装模块和项目 1.安装模块 pip install django pip install djangorestframework pip install django-redis # 按需安装 2.开启项目和api (venv) PS D:\pythonProject\env_api> django-admin startproject drf . (venv) PS D:\pythonProject\env_api> python ma…

maptalks三维地图网址

三维 地址: http://examples.maptalks.com/examples/cn/gltf/gltf-marker/shader

记一次服务器配置文件获取OSS

一、漏洞原因 由于网站登录口未做双因子校验,导致可以通过暴力破解获取管理员账号,成功进入系统;未对上传的格式和内容进行校验,可以任意文件上传获取服务器权限;由于服务器上配置信息,可以进一步获取数据库权限和OSS管理权限。二、漏洞成果 弱口令获取网站的管理员权限通…

vue解除数据双向绑定

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

从0开始学习JavaScript--JavaScript DOM操作与事件处理

在前端开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;是一个至关重要的概念&#xff0c;它为JavaScript提供了一种与HTML和XML文档交互的方法。本文将深入探讨DOM的概念与作用&#xff0c;以及JavaScript与DOM之间的密切关系。 DOM的概念与作用 DOM是什么&#…

python正则匹配示例

需要再如下图的txt中把 1100开头的订单号 提取出来&#xff0c;这个时候需要用到正则表达式 import rewith open(source.txt, r) as file:lines file.readlines()target \1100 target_lines [] for line in lines:if line.find(target) ! -1: print("match string…

基于PLC的自动洗碗机控制系统(论文+源码)

1.系统设计 本课题基于PLC的自动洗碗机控制系统&#xff0c;在此将主要功能设定如下&#xff1a; 通过上下喷头旋转喷水湿润餐具&#xff1b;添加洗涤剂&#xff08;洗碗液&#xff09;&#xff1b;上下喷头喷水洗涤餐具&#xff1b;排出污水&#xff1b;往碗碟上喷洒更多的水…

八股文-TCP的四次挥手

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;它的连接的建立和关闭过程都是经过精心设计的。在TCP连接关闭时&#xff0c;使用四次挥手来保证数据的完整传输和连接的正常终止。 漫画TCP的四次挥手 第一次挥手&#…

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

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

Android Studio 写一个Java调用c++ 的demo

前提条件&#xff1a; 本地已经配置好了ndk环境,如果没有配置好&#xff0c;建议参考macos 配置ndk环境-CSDN博客 这篇链接。 新建一个Empty Project 比如我这里的Project的名字是HelloJNI&#xff0c;包名是com.example.hellojni 然后在src目录下&#xff0c;右键选择Add C …

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

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