基于BigQuant的量化策略实现

文章目录

一、BigQuant的重要模块说明

1.回测模块

二、基于技术指标的策略实现

1.库函数导入与全局变量初始化

2.每日逻辑函数编写

策略1:  MACD金叉+MA多头买入

策略2:  利用MA指标进行择股

3.策略结果展示

策略1: MACD金叉+MA多头买入

策略2: MA择股

 

三、基于QP优化的策略实现

1.基于经典QP的handle函数

2.增加限制条件使股票具有多样性:

3.融合技术指标的QP策略:

4.策略结果展示

策略1:经典基于QP优化策略

策略2:限制股票权重的QP优化策略

策略3:融合技术指标的QP优化策略



前言

提示:本文主要介绍了BigQuant的简单使用,并复现了基于技术指标的策略与基于QP优化的策略。


提示:以下是本篇文章正文内容,下面案例可供参考

一、BigQuant的重要模块说明

1.回测模块

m=M.trade.v2(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
)

说明1: instrument为初始选股池

说明2:start_date为回测开始时间

说明3:end_date为回测结束时间

说明4:capital_base初始资产

说明5:handle_data是我们自己需要自定义的函数,该函数每天执行一次

def handle_data(context,data):##技术指标所需要的最大天数max_need_period=26if context.trading_day_index<26:returnif (context.trading_day_index)%20!=0:return print(context.trading_day_index)##记录筛选后的股票和股票数目stock_selected=[]stock_count=0for stock in stock_list:    sid=context.symbol(stock)prices = data.history(sid,'price',26,'1d')##是否符合MA指标ma_short=data.history(sid,'price',context.ma_short_period,'1d').mean()ma_long=data.history(sid,'price',context.ma_long_period,'1d').mean()if ma_short>ma_long and data.can_trade(sid) and stock_count<10:stock_selected.append(stock)stock_count+=1##是否符合MACD指标try:macd, signal, hist = talib.MACD(np.array(prices), context.macd_short_period,context.macd_long_period, context.macd_dea)if macd[-1] - signal[-1] > 0 and macd[-2] - signal[-2] < 0 and stock_count<10:if cur_position == 0 and data.can_trade(sid):stock_selected.append(stock)stock_count+=1except:passif stock_count==10:breakcash=context.portfolio.cash per_stock=1/len(stock_selected)for stock in stock_selected:sid=context.symbol(stock)price=data.current(sid,'price')context.order_target_percent(sid,per_stock)

 

 

二、基于技术指标的策略实现

1.库函数导入与全局变量初始化

其中stocks是初始选股池,我们可以自行定义

import pandas as pd
import talib as tadf=pd.read_csv('stocks.csv')stock_list=[row['stock'] for index,row in df.iterrows()]

 

2.每日逻辑函数编写

策略1:  MACD金叉+MA多头买入

说明:1)每20日进行一次调仓

           2)最多买入10只股票

#选股池
instruments=stock_list#回测时间
start_date='2019-01-03'
end_date='2021-01-22'def initialize(context):##买入卖出均为0.3%,最少5元context.set_commission(PerOrder(buy_cost=0.0003,sell_cost=0.0003,min_cost=5))##macd参数设置 dif短线:12 dif长线:26 dea:9context.macd_short_period=12context.macd_long_period=26context.macd_dea=9#ma参数设置:ma短线5 ma长线20context.ma_short_period=5context.ma_long_period=20##每天执行一次
def handle_data(context,data):##技术指标所需要的最大天数max_need_period=26if context.trading_day_index<26:returnif (context.trading_day_index)%20!=0:return print(context.trading_day_index)##记录筛选后的股票和股票树木stock_selected=[]stock_count=0for stock in stock_list:    sid=context.symbol(stock)prices = data.history(sid,'price',26,'1d')##是否符合MA指标ma_short=data.history(sid,'price',context.ma_short_period,'1d').mean()ma_long=data.history(sid,'price',context.ma_long_period,'1d').mean()if ma_short>ma_long and data.can_trade(sid) and stock_count<10:stock_selected.append(stock)stock_count+=1##是否符合MACD指标try:macd, signal, hist = talib.MACD(np.array(prices), context.macd_short_period,context.macd_long_period, context.macd_dea)if macd[-1] - signal[-1] > 0 and macd[-2] - signal[-2] < 0 and stock_count<10:if cur_position == 0 and data.can_trade(sid):stock_selected.append(stock)stock_count+=1except:passif stock_count==10:breakcash=context.portfolio.cash per_stock=1/len(stock_selected)for stock in stock_selected:sid=context.symbol(stock)price=data.current(sid,'price')context.order_target_percent(sid,per_stock)

策略2:  利用MA指标进行择股

说明:1)每20日进行一次调仓

           2)ma3>ma5且ma5>ma10且ma10>ma15时买入股票

           3)最多买入5只股票

def handle_data(context,data):##技术指标所需要的最大天数max_need_period=26if context.trading_day_index<26:returnif (context.trading_day_index)%20!=0:return print(context.trading_day_index)##记录筛选后的股票和股票树木stock_selected=[]stock_count=0for stock in stock_list:    sid=context.symbol(stock)prices = data.history(sid,'price',26,'1d')##是否符合MA指标ma_3=data.history(sid,'price',3,'1d').mean()ma_5=data.history(sid,'price',5,'1d').mean()ma_10=data.history(sid,'price',10,'1d').mean()ma_15=data.history(sid,'price',15,'1d').mean()if ma_3>ma_5 and ma_5>ma_10 and ma_10>ma_15 and data.can_trade(sid) and stock_count<5:stock_selected.append(stock)stock_count+=1##是否符合MACD指标if stock_count==5:breakcash=context.portfolio.cash per_stock=1/len(stock_selected)for stock in stock_selected:sid=context.symbol(stock)price=data.current(sid,'price')context.order_target_percent(sid,per_stock)

3.策略结果展示

策略1: MACD金叉+MA多头买入

策略2: MA择股

 

三、基于QP优化的策略实现

1.基于经典QP的handle函数

说明:构造优化问题缺点比较明显,最后最优权重会集中在某一支股票,不利于风险分散

def handle_data(context,data):##技术指标所需要的最大天数if context.trading_day_index<100:returnif (context.trading_day_index)%20!=0:return print(context.trading_day_index)price_df=pd.DataFrame()stock_num=120count=0for stock in instruments:count+=1sid=context.symbol(stock)prices = data.history(sid,'price',5,'1d')price_df=pd.concat([price_df,prices],axis=1)price_df.fillna(0,inplace=True)if(count==stock_num):break## 120,5price_np=price_df.to_numpy().T##cov##(120,120)cov_df= pd.DataFrame(np.cov(price_np))P=matrix(cov_df.to_numpy())q=-matrix(np.mean(price_np,axis=1),(stock_num,1))##Ax=bA=matrix(1.,(1,stock_num))b=matrix(1.)##GX<=hG = -matrix(np.eye(stock_num)) h = opt.matrix(0.0, (stock_num,1))##solver:solvers.options['show_progress'] = Falsesol = solvers.qp(P,q,G,h,A,b)weight=list(sol['x'])stock_selected_list=[]sum_weight=0.0cur=0for stock in stock_list:      sid=context.symbol(stock)if data.can_trade(sid):stock_selected_list.append(stock)sum_weight+=weight[cur]else:weight[cur]=0cur+=1cur=0for stock in stock_list:if weight[cur]!=0:sid=context.symbol(stock)price=data.current(sid,'price')context.order_target_percent(sid,weight[cur]/sum_weight)cur+=1

2.增加限制条件使股票具有多样性:

方法:修改QP约束中的G矩阵与h矩阵

  ##GX<=htemp_df1= pd.DataFrame(-np.eye(stock_num))temp_df2= pd.DataFrame(np.eye(stock_num))G_df=pd.concat([temp_df1,temp_df2],axis=0)G = matrix(G_df.to_numpy()) ##xi<=0.2temp_list=[]for i in range(stock_num):temp_list.append([0.0])for i in range(stock_num):temp_list.append([0.2])h = opt.matrix(np.array(temp_list))

3.融合技术指标的QP策略:

说明:1)按5日的数据构造协方差矩阵与收益均值矩阵

           2)每20日进行一次调仓

           3)如果满足ma3>ma5且ma5>ma10且ma10>ma15权重翻倍

def handle_data(context,data):##技术指标所需要的最大天数if context.trading_day_index<100:returnif (context.trading_day_index)%20!=0:return print(context.trading_day_index)price_df=pd.DataFrame()stock_num=120count=0for stock in instruments:count+=1sid=context.symbol(stock)prices = data.history(sid,'price',5,'1d')price_df=pd.concat([price_df,prices],axis=1)price_df.fillna(0,inplace=True)if(count==stock_num):break## 120,5price_np=price_df.to_numpy().T##cov##(120,120)cov_df= pd.DataFrame(np.cov(price_np))P=matrix(cov_df.to_numpy())q=-matrix(np.mean(price_np,axis=1),(stock_num,1))##Ax=bA=matrix(1.,(1,stock_num))b=matrix(1.)##GX<=htemp_df1= pd.DataFrame(-np.eye(stock_num))temp_df2= pd.DataFrame(np.eye(stock_num))G_df=pd.concat([temp_df1,temp_df2],axis=0)G = matrix(G_df.to_numpy()) ##xi<=0.2temp_list=[]for i in range(stock_num):temp_list.append([0.0])##每只权重不超过0.2for i in range(stock_num):temp_list.append([0.2])h = opt.matrix(np.array(temp_list))##solver:solvers.options['show_progress'] = Falsesol = solvers.qp(P,q,G,h,A,b)weight=list(sol['x'])stock_selected_list=[]sum_weight=0.0cur=0for stock in stock_list:      sid=context.symbol(stock)if data.can_trade(sid):stock_selected_list.append(stock)sid=context.symbol(stock)##融入技术指标,如果满足条件,,权重加倍ma_3=data.history(sid,'price',3,'1d').mean()ma_5=data.history(sid,'price',5,'1d').mean()ma_10=data.history(sid,'price',10,'1d').mean()ma_15=data.history(sid,'price',15,'1d').mean()sum_weight+=weight[cur]if ma_3>ma_5 and ma_5>ma_10 and ma_10>ma_15:sum_weight+=weight[cur]*2weight[cur]*=2else:weight[cur]=0cur+=1cur=0for stock in stock_list:if weight[cur]!=0:sid=context.symbol(stock)price=data.current(sid,'price')context.order_target_percent(sid,weight[cur]/sum_weight)cur+=1

4.策略结果展示

策略1:经典基于QP优化策略

 

策略2:限制股票权重的QP优化策略

 

策略3:融合技术指标的QP优化策略

 

 

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

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

相关文章

【定量分析、量化金融与统计学】纵向数据分析(1)——截面数据、时间序列数据和纵向数据

一、截面数据&#xff08;Cross-sectional Data&#xff09; 截面数据就是固定时间来分析其他变量同一时间内的关系。 例如&#xff1a;比较2022年的全国20个省市的GDP与人口&#xff0c;那么我们就是限定了2022年&#xff0c;去找GDP和人口的可能关系。 再例如&#xff1a;…

gdp数据分析

1 概述 本文主要分析china,usa,king,japan,russia5个国家的gdp&#xff0c;时间从1800-2040&#xff0c;后面的数据为预测数据&#xff0c;不准确。 2 绘制折线图 import pandas as pd import matplotlib.pyplot as pltdata pd.read_csv("line_animation.csv") x…

Python量化策略入门1-如何利用聚宽(JoinQuant)下载金融数据

[TOC]量化策略入门1-如何利用聚宽(JoinQuant)下载金融数据 前言 量化策略入门系列文章是本人学习股票量化笔记&#xff0c;最终输出结果希望是一个可在本地运行的回测框架&#xff0c;包含数据获取&#xff0c;数据处理&#xff0c;策略回测等。 本文主要为了介绍如何利用聚…

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

文章目录 前言一、k 线 图 是 什 么 &#xff1f;二、K 线 图 结 构&#xff08;1&#xff09; 影 线 和 实 体&#xff08;2&#xff09; 十 字 线 四、 双 均 线 策 略&#xff08;一&#xff09;、金叉&#xff08;二&#xff09;、死叉&#xff08;三&#xff09;、均 线 策…

老板,摊牌了,不装了,pyechart高端实现我国GDP大数据图

pyechart实现我国GDP大屏展示图 from typing import Listimport pyecharts.options as opts from pyecharts.globals import ThemeType from pyecharts.commons.utils import JsCode from pyecharts.charts import Timeline, Grid, Bar, Map, Pie, Linedata [{"time"…

将《2020中国统计年鉴》中的GDP数据换算成不变GDP数据

文章目录 前言一、数据来源二、计算步骤1.理解一下公式和不同的指数国内生产总值指数&#xff08;上一年100&#xff09;国内生产总值指数&#xff08;1978年100&#xff09;现价GDP: 即当年价GDP&#xff0c;也叫名义GDP&#xff0c;包含价格浮动因素&#xff0c;不可比不变价…

【qstock量化】数据篇之宏观指标和财经新闻文本

qstock简介 qstock由“Python金融量化”公众号开发&#xff0c;试图打造成个人量化投研分析开源库&#xff0c;目前包括数据获取&#xff08;data&#xff09;、可视化(plot)、选股(stock)和量化回测&#xff08;backtest&#xff09;四个模块。其中数据模块&#xff08;data&a…

使用Postman模拟发送get、post、delete、put请求

使用Postman模拟发送get、post、delete、put请求 现在的模拟发送请求插件很多&#xff0c;包括在idea上都自带了Test restful web service来模拟请求&#xff0c;但亲测postman更好用一些 今天来分享如何使用postman发送各种请求 1.下载 postman是谷歌的一款插件&#xff0…

使用hutool发送POST请求

之前使用Java程序发送请求都是使用的HttpURLConnection&#xff0c;不太方便&#xff0c;可以使用hutool封装好的方法。 引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.0.M4</…

10小时训练数据打造多语种语音识别新高度

本文联合撰写&#xff1a; 腾讯&#xff1a;吕志强&#xff0c;颜京豪&#xff0c;胡鹏飞&#xff0c;康健&#xff0c;阿敏巴雅尔 导语&#xff5c;在刚刚结束的NIST OPENASR评测中&#xff0c;TEG AI语音联合清华大学&#xff0c;刷新世界小语种语音识别比赛6项第一。从2000年…

Python开发智能语音机器人——小O同学

本篇代码存在部分错误 &#xff0c;现已经更新 &#xff08;https://blog.csdn.net/aqqwvfbukn/article/details/131277668&#xff09; 这次项目开发能按部就班顺利完成&#xff0c;主要是靠队友成功在软件的前期设计阶段&#xff0c;需求分析和用例设计起到了重要的作用。当…

微信小程序实现图林机器人聊天和百度AI语音识别的简单人工客服

用微信小程序实现简单的人工客服 最近在做软件工程的课程设计&#xff0c;选择性的做了微信小程序的简单的人工客服。在这里对该课程设计的原理和实现进行一个讲解&#xff0c;也算做一个总结和笔记&#xff0c;方便自己以后查看、复习和帮助大家的学习。 工具&#xff1a;微信…

Python实现语音识别(基于百度语音识别)

我是一名2016级电子信息工程的学生&#xff0c;这是第一次发博客&#xff0c;因为经常在这里查资料 &#xff0c;自己也应该贡献一点经验吧&#xff0c;也可以当是记录自己学习的过程吧。 最近在自学python&#xff0c;然后18年9月份正好python加入计算机二级&#xff0c;再然…

玩转百度语音识别,就是这么简单

http://www.cnblogs.com/bigdataZJ/p/SpeechRecognition.html 明后两天就是公司一年一度的Fedex Day了。我的理解就是技术界的头脑风暴&#xff0c;idea喷如泉涌的盛大节日。 对于这次活动每个人或者两三个人一组需要有个idea&#xff0c;针对当前的产品现状&#xff0c;提出自…

语音-小度自定义技能

文章目录 前言一、学习简介二、代码快速开发三、官网配置3.1 百度云CFC配置3.2 小度官网配置 四、测试4.1连接技能4.2 意图测试4.3 断开技能 前言 主要是为了记录下学习小度自定义技能的过程 一、学习简介 参考官网解释 自定义技能简介 二、代码快速开发 快速开发java 我…

人人都是绘画大师!微软必应接入DALL·E模型,文字生成图像!

机器之心编辑部 微软必应完善文字生成图像能力&#xff0c;Adobe 今日也发布 Firefly&#xff0c;杀入生成式 AI 这场游戏。 今晚实在是有些热闹。 一边英伟达 GTC 正在进行中&#xff0c;一边谷歌正式开放了 Bard 的测试&#xff0c;这里微软必应也不甘寂寞。 今日&#xff0c…

对比编程语言的四种错误处理方法,哪种才是最优方案?

△点击上方“Python猫”关注 &#xff0c;回复“1”领取电子书 作者&#xff1a;Andrea Bergia 译者&#xff1a;豌豆花下猫Python猫 英文&#xff1a;Error handling patterns 转载请保留作者及译者信息&#xff01; 错误处理是编程的一个基本要素。除非你写的是“hello world…

巴比特 | 元宇宙每日必读:不再盲目迷信硬件掘金,大厂XR集体后撤,业内人士建议多条腿走路,生态和内容才有更广阔市场...

摘要&#xff1a;据极点商业报道&#xff0c;元宇宙凉热之间&#xff0c;大厂集体收缩XR业务。是舆论定调的风口已过&#xff0c;还是如业内人士所言&#xff0c;进入理智探索时代&#xff1f;为何短短半年时间内&#xff0c;大厂们态度就发生了截然不同的变化&#xff1f;“与…

学会这些思维模型,窥见查理·芒格的致胜秘笈(二)

目录 导语 模型五&#xff1a;SCQA模型 模型六&#xff1a;问题树模型 模型七&#xff1a;MECE原则 模型八&#xff1a;SWOT分析 模型九&#xff1a;波特五力模型 模型十&#xff1a;波斯顿矩阵 导语 读者朋友们好&#xff0c;在我上一篇文章介绍了几个最核心和底层的模…

产品读书《穷查理宝典:查理.芒格智慧箴言录》

要通过提升自己&#xff0c;来强化对世界的感知&#xff0c;内在的能力才能增长&#xff0c;和世界的大趋势才能互相匹配。这种匹配度提高了&#xff0c;无论你是用来投资、创业&#xff0c;还是做其他事情&#xff0c;都会无往而不利。 查理芒格在书中反复强调的4点内容有&a…