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

news/2024/11/8 23:45:15 标签: 学习

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

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

图片

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.niftyadmin.cn/n/5744570.html

相关文章

SpringBoot整合Liquibase对数据库管理和迁移

简介 Liquibase是一个用于用于跟踪、管理和应用数据库变化的开源工具,通过日志文件(changelog)的形式记录数据库的变更(changeset),然后执行日志文件中的修改,将数据库更新或回滚(rollback)到一致的状态。它的目标是提供一种数据库类型无关的…

Kafka面试题 part-1

一、kafka消息发送的流程? 发送原理: 在消息发送的过程中,涉及到了两个线程——main 线程和 Sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccumulator,Sender 线程不断从 R…

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

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

【宝藏】浏览器端的模块化问题(1)

接下来我们一起进入webpack的课程学习中,本课程的特点在于: 合适的深度:webpack 使用层面相对简单,但其原理层面非常复杂。合适的广度:webpack 生态圈极其繁荣,有海量的第三方库可以融入到 webpack 中。 …

ubuntu离线部署ollama

一、ollama部署 1、ollama官网安装教程,可以参考这个进行部署,下载对应版本 以intel为例下载安装包 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz sudo tar -C /usr -xzf ollama-linux-amd64.tgz2、运行安装…

【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案

作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:WebStorm 目录 问题概述 原因 解决方案 解决方法 潜在问题修改 最终效果呈现 额外内容 管理员界面路由配置 WebStorm背景更换 法一: 法二: 问题概…

esp32学习:利用虫洞ESP32开发板,快速实现无线图传

我们的虫洞开发板,能够完美运行esp who AI代码,所以实现无线图传那是非常容易的,我们先看看examples目录: 里面有比较多的web例程,在这些例程下,稍作修改,就可以快速实现我的图传无线功能&#…

【动态规划-划分型 DP】力扣2369. 检查数组是否存在有效划分

给你一个下标从 0 开始的整数数组 nums ,你必须将数组划分为一个或多个 连续 子数组。 如果获得的这些子数组中每个都能满足下述条件 之一 ,则可以称其为数组的一种 有效 划分: 子数组 恰 由 2 个相等元素组成,例如,…