0018-量化第五天:QMT—日内回转回测注释
目录
一、模型介绍
二、可学习部分
1.通过应用ContextInfo.barpos确定时间段和时间点
2.取一个股票的时间段值
3.设置不交易时间
三、代码逐行解释
一、模型介绍
本策略首先买入当前加载图的股票10000股
随后根据60s的数据来计算MACD(12,26,9)线,
在MACD>0,MACD_pre<0的时候买入100股,MACD<0,MACD_pre>0的时候卖出100股
但每日操作的股票数不超过原有仓位,并于收盘前把仓位调整至开盘前的仓位
二、可学习部分
1.通过应用ContextInfo.barpos确定时间段和时间点
startdate = timetag_to_datetime(ContextInfo.get_bar_timetag(d - 35), '%Y%m%d%H%M%S')#将毫秒时间转换成日期时间,这种方式可以输出到秒的值,设置35分钟前是开始时间enddate = timetag_to_datetime(ContextInfo.get_bar_timetag(d), '%Y%m%d%H%M%S')print startdate,enddatedate = timetag_to_datetime(ContextInfo.get_bar_timetag(d), '%Y-%m-%d %H:%M:%S')print('日期', date)
2.取一个股票的时间段值
df = ContextInfo.get_market_data(['close'], stock_code=ContextInfo.get_universe(), start_time=startdate,end_time=enddate, period=ContextInfo.period)#1支股票代码,在一个时间段取值,返回pandas.DataFrame(pandas二维表格型数据结构类型的值。
3.设置不交易时间
if int(date[-8:-6] + date[-5:-3]) > 1455: #14+55return
三、代码逐行解释
# coding:gbk
'''
回测模型示例(非实盘交易策略)'''
import numpy as np
import pandas as pd
import talibdef init(ContextInfo):MarketPosition = {}ContextInfo.MarketPosition = MarketPosition # 初始化持仓ContextInfo.set_universe([ContextInfo.stockcode + '.' + ContextInfo.market])ContextInfo.first = 0ContextInfo.Lots = 100 # 设定交易手数ContextInfo.day = [0, 0]ContextInfo.ending = 0ContextInfo.total = 10000ContextInfo.accountID = 'testS'def handlebar(ContextInfo):d = ContextInfo.barpos #当前运行到的 K 线的位置if d < 35:returnstartdate = timetag_to_datetime(ContextInfo.get_bar_timetag(d - 35), '%Y%m%d%H%M%S')#将毫秒时间转换成日期时间,这种方式可以输出到秒的值,设置35分前是开始时间enddate = timetag_to_datetime(ContextInfo.get_bar_timetag(d), '%Y%m%d%H%M%S')date = timetag_to_datetime(ContextInfo.get_bar_timetag(d), '%Y-%m-%d %H:%M:%S')print('日期', date)print(date[-8:-6])print(date[-5:-3])flage = False #这是用于在过去的图上绘出信号的singleemited = Falsedf = ContextInfo.get_market_data(['close'], stock_code=ContextInfo.get_universe(), start_time=startdate,end_time=enddate, period=ContextInfo.period)#1支股票代码,在一个时间段取值,返回pandas.DataFrame(pandas二维表格型数据结构类型的值。#ContextInfo.get_universe()获取股票池中的股票,返回列表#ContextInfo.get_market_data()获取行情数据#ContextInfo.period 获取当前周期# print dfif df.empty:return# print dfif ContextInfo.first == 0: #控制开盘买入order_shares(ContextInfo.get_universe()[0], ContextInfo.total, 'fix', df.iloc[-1, 0], ContextInfo,ContextInfo.accountID)#iloc通过整数位置获得行和列的数据。逗号表示 -1(行) 和 0(列),也就是最后一行的第一列flage = Truesingleemited = TrueContextInfo.first = 1ContextInfo.day[-1] = date[8:10] #当日日期ContextInfo.turnaround = [0, 0]ContextInfo.MarketPosition[ContextInfo.get_universe()[0]] = ContextInfo.totalreturnContextInfo.day[0] = date# 14:55:00之后不再交易if int(date[-8:-6] + date[-5:-3]) > 1455: #14+55returnavaliable = get_avaliable(ContextInfo.accountID, 'STOCK') #获取可用资金holding = get_holdings(ContextInfo.accountID, 'STOCK') #获取持仓if ContextInfo.get_universe()[0] not in list(holding.keys()): #标的无持仓holding[ContextInfo.get_universe()[0]] = 0 #持仓字典值为0# 计算MACD线if ContextInfo.total >= 0: #设置买入大于0recent_date = np.array(df.iloc[-35:, 0]) #是取二维数组中第一维的所有数据macd = talib.MACD(recent_date)[0][-1]macd_pre = talib.MACD(recent_date)[0][-2]# 根据MACD>0则开仓,小于0则平仓if date[-8:-3] != '14:55':if macd > 0 and macd_pre < 0:# 根据MACD>0则开仓,小于0则平仓if avaliable > df.iloc[-1, 0] * ContextInfo.Lots * 100: #可用资金充足order_shares(ContextInfo.get_universe()[0], ContextInfo.Lots, 'fix', df.iloc[-1, 0], ContextInfo,ContextInfo.accountID)flage = Truesingleemited = TrueContextInfo.MarketPosition[ContextInfo.get_universe()[0]] += ContextInfo.Lots #开盘买入+新下单的持仓总数print (ContextInfo.get_universe()[0], 'open position at market price', ContextInfo.Lots, '股')elif macd < 0 and macd_pre > 0 and holding[ContextInfo.get_universe()[0]] >= ContextInfo.Lots:order_shares(ContextInfo.get_universe()[0], -ContextInfo.Lots, 'fix', df.iloc[-1, 0], ContextInfo,ContextInfo.accountID)flage = Falsesingleemited = Trueprint(ContextInfo.get_universe()[0], 'close position at market price', ContextInfo.Lots, '股')ContextInfo.MarketPosition[ContextInfo.get_universe()[0]] -= ContextInfo.Lots #开盘买入-新下单的持仓总数else: # 临近收盘时若仓位数不等于昨仓则回转所有仓位if ContextInfo.MarketPosition[ContextInfo.get_universe()[0]] > ContextInfo.total: #今天持仓比预订多,卖order_shares(ContextInfo.get_universe()[0],-(ContextInfo.MarketPosition[ContextInfo.get_universe()[0]] - ContextInfo.total), 'fix',df.iloc[-1, 0], ContextInfo, ContextInfo.accountID)flage = Falsesingleemited = True# print ContextInfo.get_universe()[0], '回转操作市价单平多仓', ContextInfo.MarketPosition[ContextInfo.get_universe()[0]] - ContextInfo.total, '股'ContextInfo.MarketPosition[ContextInfo.get_universe()[0]] = ContextInfo.totalif ContextInfo.MarketPosition[ContextInfo.get_universe()[0]] < ContextInfo.total: #今天持仓比预订少,买order_shares(ContextInfo.get_universe()[0],(ContextInfo.total - ContextInfo.MarketPosition[ContextInfo.get_universe()[0]]), 'fix',df.iloc[-1, 0], ContextInfo, ContextInfo.accountID)flage = Truesingleemited = True# print ContextInfo.get_universe()[0], '回转操作市价单开多仓', ContextInfo.total - ContextInfo.MarketPosition[ContextInfo.get_universe()[0]] , '股'ContextInfo.MarketPosition[ContextInfo.get_universe()[0]] = ContextInfo.total# 更新过去的日期数据'''ContextInfo.day[-1] = ContextInfo.day[0]if singleemited:if flage:ContextInfo.paint('do_buy',1,-1,0,"yellow",'noaxis')ContextInfo.paint('do_sell',0,-1,0,"red",'noaxis')else:ContextInfo.paint('do_buy',0,-1,0,"yellow",'noaxis')ContextInfo.paint('do_sell',1,-1,0,"red",'noaxis')'''# ContextInfo.paint('holding',ContextInfo.MarketPosition[ContextInfo.get_universe()[0]],-1,0)def get_avaliable(accountid, datatype): #获得可用资金result = 0resultlist = get_trade_detail_data(accountid, datatype, "ACCOUNT")for obj in resultlist:result = obj.m_dAvailablereturn resultdef get_holdings(accountid, datatype): #返回值为股票数量的字典holdinglist = {}resultlist = get_trade_detail_data(accountid, datatype, "POSITION")for obj in resultlist:holdinglist[obj.m_strInstrumentID + "." + obj.m_strExchangeID] = obj.m_nCanUseVolumereturn holdinglist
0018-量化第五天:QMT—日内回转回测注释相关推荐
- Python 量化投资实战教程(3) —A股回测MACD策略
量化投资系列文章: Backtrader 教程 - Python 量化投资实战教程(1) Python 量化投资实战教程(2) -MACD策略(+26.9%) Python 量化投资实战教程(3) - ...
- Python量化交易实战-38使用开源项目回测双均线策略
B站配套视频教程观看 使用PyAlgoTrade回测双均线策略 双均线策略:长短周期均线,通过金叉,死叉的方式买入卖出股票,获取收益的策略. 回顾上节课代码的部分,上节课完成了可视化代码的部分, 主要 ...
- 量化策略——准备3 数据、Backtrader回测框架与quantstats评价指标
我们一般使用AKShare这个库来获取股票数据或策略中用得到的数据: AKShare github主页:https://github.com/akfamily/akshare 使用Backtrader ...
- 量化交易:止盈策略与回测
我们买基金或股票的时候通常用最简单的策略进行决策:低买高卖,跌的多了就加仓拉低持有成本,达到收益率就卖出. 那么如何用代码表示这个策略呢?首先定义交易信号则是:0.5%时买入,目标止盈线是1.5%,达 ...
- 日内回转交易(股票)——Python量化
目录 1. 原理 1.1 日内回转交易 1.2 股票的日内回转交易 1.3 MACD指标简介 2. 策略思路 3. 策略代码 4. 回测结果与稳健性分析 1. 原理 1.1 日内回转交易 日内回转交易 ...
- 日内回转交易策略-股票
1. 原理 1.1 日内回转交易 日内回转交易,顾名思义就是在一天内完成"买"和"卖"两个相反方向的操作(可一次也可多次),也就是"T+0" ...
- Python量化投资——股票择时到底能否赚钱?ADX指标的有效性回测
ADX指标的有效性回测 Python量化投资--`ADX`技术指标的有效性研究 背景介绍 技术指标介绍 指标用法建议 `qteasy`中的ADX内置策略 433支股票五年回测结果 12.45% --该 ...
- 小散量化炒股记|说某个指标能赚钱?不盲从,先量化回测一番!
前言 相信大家都听说了量化交易这个东西了吧!量化交易是一种新兴的系统化金融投资方法. 那么,什么才是普通股民所适合的量化交易打开方式呢? 本文就用一个接地气的股票分析场景 -- 用量化回测来识别技术指 ...
- 量化交易中用到的回测评估指标(策略收益、基准收益、Alpha比率、Beta比率、夏普比率、索提诺比率)详解
前言 近日在做A股的过程中接触到了量化交易.通过一个月时间的了解发现并非全自动印钞机,也有可能有全自动接盘侠的潜质.故现阶段以学习量化交易的知识为主,多学多问总是没错的嘛~ 现阶段使用Python爬取 ...
最新文章
- 视觉三维重建的关键技术及实现思路汇总
- Windows 10或成为最后一个Windows版本
- 如何构建高可用ZooKeeper集群
- python百分号和斜杠_Python中正反斜杠(‘/’和‘\’)的意义与用法
- NYOJ 358 取石子(五)
- 最近对latin-1这个字符集产生了不少好感
- jquery mysql实现加入购物车_jQuery实现加入购物车飞入动画效果
- 密码学专题 密钥生成|分组加密的模式 ECB|CBC|CFB|OFB
- canal mysql从库_canal中间件|数据增量同步解决方案
- 坯子库曲面推拉教程_一招曲面流动,搞定99%异形建模
- dede自定义表单html,织梦自定义表单制作在线订单详细解说
- Spring-boot-AnnotationConfigServletWebApplicationContext
- SQL分页查询的写法总结-MySQL、SQL Server、Oracle
- 挑战程序设计竞赛学习笔记2
- MTk2503,使用移动物联网卡上线慢问题
- 计算机毕业设计Java车辆保险管理系统(源码+系统+mysql数据库+lw文档)
- flash for linux安装教程,Flash Player 9 FOR Linux 的安装
- 10家不错的iphone编程资源站
- Poisson方程的五点差分格式例题求解-Matlab实现
- 工作室多拨宽带如何优化?