量化研究--年化57%全球动量模型策略回测,学习使用

文章声明:本内容为个人的业余研究,和任何单位,机构没有关系,文章出现的股票代码,全部只是测试例子,不做投资参考,投资有风险,代码学习使用,不做商业用途

本文利用全球动量模型策略回测,设置原理,选择几个相关性特别低的标的建立组合

图片

c.trade_code_list=['513100.SH', '513350.SH', '159915.SZ','159937.SZ','511130.SH']  c.trade_code_name=['纳斯达克ETF', '标普油气ETF', '创业板ETF','黄金ET','30年国债ETF']

利用5日动量收益做为排序因子

图片

交易原理如果股票池最高的,开仓的条件收益大于0就开仓,不然就全部卖出,空仓

调仓的原理,如果最高收益的标的在持股里面就持股,不然就是卖出全部标的,买入收益最高的标的

点击回测开始回测,可以设置回测参数

点击回测按钮

图片

图片

回测的结果

年化57%

图片

全部的回测代码,当然我也有实盘的代码

#encoding:gbk'''全球动量模型策略回测作者:小果'''import pandas as pdimport numpy as npimport talibdef init(c):  #账户  c.account='55011947'  #账户类型  c.account_type='STOCK'  #开始时间  c.start='20200101 00:00:00'  #结束时间  c.end='20500101 00:00:00'  #测试资金  c.capital=200000  #交易股票池  c.trade_code_list=['513100.SH', '513350.SH', '159915.SZ','159937.SZ','511130.SH']  c.trade_code_name=['纳斯达克ETF', '标普油气ETF', '创业板ETF','黄金ET','30年国债ETF']  c.df=pd.DataFrame()  c.df['证券代码']=c.trade_code_list  c.df['名称']=c.trade_code_name  print(c.df)  #动量因子天数  c.n=5  c.start_tarder_return=0  #老版本的回测需要设定股票池,配合历史数据使用  c.set_universe(c.trade_code_list)def handlebar(c):  #当前K线索引号  d=c.barpos  #获取当前K线日期  today=timetag_to_datetime(c.get_bar_timetag(d),'%Y-%m-%d')  today_1=''.join(str(today).split('-'))  '''  #注意时间格式是20240101  hist=c.get_market_data_ex(stock_code=c.trade_code_list,period='1d',  end_time=today_1, count=-1, dividend_type='follow',fill_data=True, subscribe=False)  print(hist)  '''  '''  get_history_data(len, period, field, dividend_type = 0,skip_paused = True)  '''  #  '''  默认参数,除复权,默认不复权,可选值包括:  0:不复权  1:向前复权  2:向后复权  3:等比向前复权  4:等比向后复权  '''  #必须使用前复权  #hist=c.get_history_data(100,'1d',['open','close','low','high'],1)  df=c.df  return_list=[]  hold_stock=get_position(c,c.account,c.account_type)  if hold_stock.shape[0]>0:    hold_stock_list=hold_stock['证券代码'].tolist()  else:    hold_stock_list=[]  for stock,name  in zip(c.trade_code_list,c.trade_code_name):    try:      hist=c.get_market_data_ex(      fields=[],       stock_code=[stock],       period='1d',       start_time=str(c.start)[:8],       end_time=today_1,       count=-1,       fill_data=True,       subscribe=True)      hist=hist[stock]      close_list=hist['close'].tolist()[-c.n:]      zdf=((close_list[-1]-close_list[0])/close_list[0])*100      return_list.append(zdf)    except:      pass      return_list.append(-1)  df['收益']=return_list  df['时间']=today_1  df=df.sort_values(by='收益',ascending=True)  max_stock=df['证券代码'].tolist()[-1]  stock=max_stock  max_name=df['名称'].tolist()[-1]  max_return=df['收益'].tolist()[-1]  print('收益最高的标的{} {} 收益{}'.format(max_name,max_stock,max_return))  if max_return>c.start_tarder_return:    if max_stock in hold_stock_list:      print('最高收益标的在{}持股不调仓'.format(stock))      buy_df=pd.DataFrame()      sell_df=pd.DataFrame()    else:      print('最高收益标的不在{}持股调仓,卖出全部持股,买入最高收益'.format(stock))      buy_df=pd.DataFrame()      buy_df['证券代码']=[max_stock]      buy_df['名称']=[max_stock]      buy_df['收益']=[max_return]      sell_df=hold_stock  else:    print('收益最高的标的{} {} 收益{}小于0 卖出全部空仓'.format(max_name,max_stock,max_return))    buy_df=pd.DataFrame()    sell_df=hold_stock    if sell_df.shape[0]>0:    for stock in sell_df['证券代码'].tolist():      order_target_percent(stock, 0, c, c.account)      print('{} 卖出标的{}'.format(today_1,stock))  else:    print('{} 没有卖出标的'.format(today_1))  if buy_df.shape[0]>0:    for stock in buy_df['证券代码'].tolist():      order_target_percent(stock, 1, c, c.account)      print('{} 买入收益最高的标的{}'.format(today_1,stock))  else:    print('{} 没有买入标的'.format(today_1))    #获取账户总权益m_dBalancedef get_account(c,accountid,datatype):  '''  获取账户数据  '''  accounts = get_trade_detail_data(accountid, datatype, 'account')  result={}  for dt in accounts:    result['总资产']=dt.m_dBalance    result['净资产']=dt.m_dAssureAsset    result['总市值']=dt.m_dInstrumentValue    result['总负债']=dt.m_dTotalDebit    result['可用金额']=dt.m_dAvailable    result['盈亏']=dt.m_dPositionProfit  return result#获取持仓信息{code.market:手数}def get_position(c,accountid,datatype):  '''  获取持股数据  '''  positions = get_trade_detail_data(accountid,datatype, 'position')  data=pd.DataFrame()  if len(positions)>0:    df=pd.DataFrame()    for dt in positions:      df['股票代码']=[dt.m_strInstrumentID]      df['市场类型']=[dt.m_strExchangeID]      df['证券代码']=df['股票代码']+'.'+df['市场类型']      df['证券名称']=[dt.m_strInstrumentName]      df['持仓量']=[dt.m_nVolume]      df['可用数量']=[dt.m_nCanUseVolume]      df['成本价']=[dt.m_dOpenPrice]      df['市值']=[dt.m_dInstrumentValue]      df['持仓成本']=[dt.m_dPositionCost]      df['盈亏']=[dt.m_dPositionProfit]      data=pd.concat([data,df],ignore_index=True)  else:    data=pd.DataFrame()  return data 

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

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

相关文章

【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期

目录 1. start() (1) start() 的性质 (2) start() 和 Thread类 的关系 2. 终止一个线程 (1)通过共享的标记结束线程 1. 通过共享的标记结束线程 2. 关于 lamda 表达式的“变量捕获” (2) 调用interrupt()方法 1. isInterrupted() 2. currentThread() …

Linux驱动开发(3):字符设备驱动

上一章节我们了解到什么是内核模块,模块的加载卸载详细过程以及内核模块的使用等内容。 本章,我们将学习驱动相关的概念,理解字符设备驱动程序的基本框架,并从源码上分析字符设备驱动实现和管理。 主要内容有如下五点:…

布谷直播源码部署服务器关于数据库配置的详细说明

布谷直播源码搭建部署配置接口数据库 /public/db.php(2019年8月后的系统在该路径下配置数据库,老版本继续走下面的操作) 在项目代码中执行命令安装依赖库(⚠️注意:如果已经有了vendor内的依赖文件的就不用执行了&am…

【Linux】从零开始使用多路转接IO --- 理解EPOLL的 LT水平触发模式 与 ET边缘触发模式

当你偶尔发现语言变得无力时, 不妨安静下来, 让沉默替你发声。 --- 里则林 --- 从零开始认识多路转接 1 EPOLL优缺点2 EPOLL工作模式 1 EPOLL优缺点 poll 的优点(和 select 的缺点对应) 接口使用方便:虽然拆分成了三个函数,…

云轴科技ZStack助力新远科技开启化工行业智能制造新篇章

新远科技基于云轴科技ZStack Cube超融合和ZStack Zaku容器云平台打造了灵活高效的IT基础设施,实现了IaaS和PaaS层的全面覆盖,优化了资源利用率,降低了硬件成本和运维复杂性,同时强化了数据安全和业务连续性。 化工行业的数字化先…

认识类和对象

认识类 类是用来对一个实体 ( 对象 ) 来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥) 类中包含的内容称为 类的成员。属性主要是用来描述类的,称之为 类的成员属性或者 类成员变量。方法主要说明类具有哪些功…

npm镜像的常用操作

查看当前配置的 npm 镜像 npm config get registry切换官方镜像 npm config set registry https://registry.npmjs.org/切换淘宝镜像(推荐) npm config set registry https://registry.npmmirror.com/切换腾讯云镜像 npm config set registry http://mirrors.cloud.tencent…

网购选择困难症怎么破?别忘了你的这位“帮手”

每年双十一对不少人来说,既是购物剁手狂欢节,也是货比三家纠结得不行的选择困难症复发期。而现在,Pura 70 能够帮助我们解决不够了解商品、选择困难症等问题啦。 小艺圈选,圈出你感兴趣的商品,快速货比三家 利用指关…

175页PPTBCG某企业健康智能制造与供应链战略规划建议书

智能制造与供应链战略规划方法论是一个系统性、科学性的框架,旨在指导企业实现智能制造转型和供应链优化。以下是对这一方法论的核心内容的归纳和阐述: 一、智能制造的目标与原则 明确智能制造目标: 提高生产效率:通过引入自动…

【VS+QT】联合开发踩坑记录

最新更新日期:2024/11/05 0. 写在前面 因为目前在做自动化产线集成软件开发相关的工作,需要用到QT,所以选择了VS联合开发,方便调试。学习QT的过程中也踩了很多坑,在此记录一下,提供给各位参考。 1. 环境配…

flutter 专题四 Flutter渲染流程

一、 Widget - Element - RenderObject关系 二、 Widget 、Element 、RenderObject 分别表示什么 2.1 Widget Widget描述和配置子树的样子 Widget就是一个个描述文件,这些描述文件在我们进行状态改变时会不断的build。但是对于渲染对象来说,只会使用最…

芯片需要按一下keyup或者复位按键虚拟或者下载之后芯片能下载却运行不了或者需要额外供电。

这些问题很有可能是因为外围电路器件幅值与设计不同的存在,导致你需要外部供电才能实现一个正常运行,可以检查一下外围电路在供电区域的电流区,电阻幅值是否和原理图设计时看的一模一样或者直接更换 因为按键会失灵,首先检查复位按…

React基础大全

文章目录 一、React基本介绍1.虚拟DOM优化1.1 原生JS渲染页面1.2 React渲染页面 2.需要提前掌握的JS知识 二、入门1.React基本使用2.创建DOM的两种方式2.1 使用js创建(一般不用)2.2 使用jsx创建 3.React JSX3.1 JSX常见语法规则3.2 for循环渲染数据 4.模…

leetcode 2043.简易银行系统

1.题目要求: 示例: 输入: ["Bank", "withdraw", "transfer", "deposit", "transfer", "withdraw"] [[[10, 100, 20, 50, 30]], [3, 10], [5, 1, 20], [5, 20], [3, 4, 15], [10, 50]] 输出&#xff…

【网络】网络层协议IP

目录 IP协议报头 报头分离和向上交付 四位版本 8位服务类型 16位总长度 八位生存时间 16位标识一行 网段划分 DHCP 私有IP范围 公网划分之CIDR 特殊的IP地址 缓解IP地址不够用的方法 NAT技术 代理服务器 NAT和代理服务器的区别 内网穿透和内网打洞 路由 IP是…

Qt菜单功能实现

本文介绍Qt菜单功能实现。 Qt开发过程中,菜单功能用的还是比较多的,本文针对菜单栏和右键菜单功能实现作简要描述。 1.菜单栏 1)界面设计 在界面中添加菜单栏(本例中名为“menubar”),并依次添加需要的菜单&#x…

2024 网鼎杯 - 青龙组 Web WP

2024 网鼎杯 - 青龙组 WEB - 02 打开容器一个登录界面,随便输入账号密码可以进到漏洞界面 这里有一个发送给boss的功能,一眼xss 有三个接口:/flag 、/update 、/submit /flag :要求boss才能访问,/update &#xf…

MySQL核心业务大表归档过程

记录一下2年前的MySQL大表的归档,当时刚到公司,发现MySQL的业务核心库,超过亿条的有7张表,最大的表有9亿多条,有37张表超过5百万条,部分表行数如下: 在测试的MySQL环境 : pt-archiv…

stm32使用串口DMA实现数据的收发

前言 DMA的作用就是帮助CPU来传输数据,从而使CPU去完成更重要的任务,不浪费CPU的时间。 一、配置stm32cubeMX 这两个全添加上。参数配置一般默认即可 代码部分 只需要把上期文章里的HAL_UART_Transmit_IT(&huart2,DATE,2); 全都改为HAL_UART_Tra…

大数据分库分表方案

分库分表介绍 分库分表应用场景 分库分表介绍 大数据分库分表是一种数据库架构技术,旨在应对大数据量场景下的数据库性能瓶颈。以下是对大数据分库分表的详细解释: 一、定义与背景 定义: 分库:将一个大型数据库按照一定的规则…