01、什么是量化交易?
量化交易是一种依赖于先进的数学模型和计算机技术的交易方式,旨在制定能带来超额收益的多种“大概率”事件策略。
这个过程从大量的历史数据中筛选,极大地减少了投资者情绪波动的影响,避免了在市场极度狂热或悲观的情况下作出非理性的投资决策。
这种交易方式不依赖人的主观判断,而是以数学模型替代,通过分析数据和趋势来制定交易策略。
比如可以利用Python语言实现布林线策略,并以特定指数为例绘制交易信号图。
此外,量化交易并不局限于某一特定的交易方法,例如股票多因子策略(阿尔法)、期货CTA策略等都可以被认为是量化交易的方法。
总的来说,量化交易就是利用计算机技术从庞大的历史数据中筛选出能带来超额收益的事件以制定策略并进行交易的过程。
02、详解十种量化交易经典策略
量化交易策略模型是量化交易的核心,而一些经典的量化交易策略更是被视为量化交易的基石。
这些策略包括:
一、市场中性策略:
市场中性策略是一种投资策略,旨在通过同时构建多头和空头头寸以对冲市场风险,从而实现无论市场上涨或下跌环境下都能获得稳定收益。
这种策略不依赖市场的上涨或下跌来赚钱,而是通过对整体收益的保护来获取利润。
中性策略的构建方式多种多样,其主要分为股票多头端、对冲端及中性三部分。
其中,股票多头端通常采用量化多头策略,这是因为在当前市场环境下,主观多头策略所采用的主要投资方式(中长周期、集中持仓等)难以通过对冲有效获取稳定收益,不符合股票中性策略设计的初衷。
对冲端则是利用各类对冲工具建立空头头寸进行对冲,以达到对系统性风险的敏感度为0的目标。
目前市场上股票中性策略所使用的对冲工具主要为股指期货及场内外融券两类。
二、均值回归策略:
均值回归策略是一种广泛应用于量化交易中的策略,它依赖于股票价格无论高于均值回归策略是一种广泛应用于量化交易中的策略,它依赖于股票价格无论高于或低于价值中枢都会以很高的概率向价值中枢回归的趋势,即当标的价格由于波动而偏离移动的均线时,它将调整并重新归于均线。
这是一种赌趋势反转的策略,与趋势跟踪策略——赌趋势的继续不同。
均值回归策略的运行方式可以有多种。
例如,可以利用股票每天的平均回报率来找出股票回报率的分布,然后找出标准差(即均值),设定交易策略,如当回报率的pct change高于+5σ时卖出,低于-5σ时买入等。
另外,相对强弱指数(RSI)也是一个重要的工具,它是利用14天股票数据计算出来的,由0-100,超过70时为超买,低于30时为超卖。
通过计算RSI和股价的pct_change,可以帮助我们找出市场在指定RSI数值下的情绪及表现,从而制定有效的交易策略。
三、套利策略:
套利策略是一种广泛应用在金融市场中的交易方式,它依赖于同一种资产在不同市场或不同时间的价格差异,即“一价定律”。
投资者通过低买高卖的方式,利用这些价格差异获取收益。
套利策略的种类繁多,主要包括期货套利、统计套利和期权套利等。
期货套利策略是最常见的一种,它利用期货市场上不同合约之间的价差进行套利的交易行为。
根据具体的合约选择与策略构建,通常可以分为跨期套利、跨品种套利、跨市场套利三类策略。
跨期套利策略是同一市场中相同品种的不同月份期货合约之间的套利交易;
跨市场套利策略是不同市场内相同品种或高相关性品种期货合约之间的套利交易;
跨品种套利策略是高相关性品种间同一到期月份期货合约之间的套利交易。
此外,统计套利和期权套利也是重要的套利策略。
统计套利是通过分析历史数据,找出金融资产价格之间的关系,从而制定交易策略。
而期权套利则是利用期权价格与标的资产价格之间的关系进行套利。
四、趋势跟踪策略:
趋势跟踪策略是一种主流且盈利能力强的交易策略,它的基本思想是“顺势而为”,即在市场存在趋势时,通过跟随趋势方向来获取收益。
这种策略通常遵循非常明确的准则:当进入信号出现时买入,退出信号出现时卖出;
价格是最重要的因素,同时资产管理和风险控制也是非常重要的组成部分。
最为经典的趋势跟踪策略之一是唐奇安通道突破系统,也被称为“四周规则”。
这个系统最原始的版本是在创20个交易日新高之后买入,创20个交易日新低之后卖出。
这是一种无需任何指标的策略,仅需对两个价格的突破进行判断,便可以创下不菲的交易成绩。
五、统计套利策略:
统计套利是一种量化交易策略,这种策略依赖于数学模型和历史数据分析,而不依赖于市场环境。
它的基本操作方法是将股票价格与模型预测的理论价值进行对比,然后根据这个对比结果构建证券投资组合的多头和空头,从而获取稳定的无风险超额收益率。
统计套利最常见的策略是配对交易策略。
在配对交易中,投资者会选择两只股票(或更多)进行交易,其中一只股票被买入,而另一只则被卖空,从而建立起一个市场中性的头寸。
如果这两只股票的价格发生同幅度的涨跌,那么无论市场走势如何,这个策略都能带来利润。
六、事件驱动策略:
事件驱动策略是一种主流且成熟的对冲基金投资策略,它依赖于重大的公司事件或转变来获取投资收益。
这种策略的运作方式通常涉及到并购套利、定向增发、大宗交易和复合策略等多种子策略。
并购套利是其中的一种常见形式,它是通过利用企业合并前后的价格差异来获取利润。
在实际操作中,投资者会在预测到两家公司可能会合并的情况下,购买其中一家公司的股票,并卖空另一家公司的股票。
如果这个预测成真,那么无论合并后的公司股票价格上涨还是下跌,投资者都能从中获利。
七、量价分析策略:
量价分析是一种主流的交易策略,它依赖于对价格、交易量以及持仓量三者之间关系的深入理解。
这种策略的目标是通过对市场价格走势和交易量的观察来预测未来的价格变化。
在具体应用时,投资者会密切关注成交量这一重要指标,因为它是股票市场供求关系的表现形式,反映了买卖双方对某只股票即时价格的认可度。
交易量的大小表明了交易者在不同价位上买卖股票的数量,代表了股票的活跃程度和流通性,并由此透露出市场的人气买卖意愿。
根据股价与成交量的不同关系,投资者将量价之间的关系进行了详细的分类,总结出了六种基本形式:量增价跌、量增价平、量增价涨、量缩价跌、量缩价平、量缩价涨。
此外,还有如无量涨停(一字板)、无量跌停、底部放量、地量地价、天量天价等六种特殊的情况。
八、质量轮动策略:
质量轮动策略是一种投资策略,其基本理念是通过对市场上不同资产的质量进行评估和比较,进而发现并利用价值被低估的资产。
这种策略通常涉及对股票、债券等多类资产的全面研究,包括企业的财务健康状况、经营业绩、市场地位以及行业前景等多个方面。
在实际操作中,质量轮动策略的构建首先需要确定候选池,即待分析的股票或其他资产列表。
然后,投资者会对这些资产进行详细的质量评估,并将它们按照质量的高低进行排序。
接下来,投资者会选择质量最高的若干资产进行投资,同时定期对已投资产进行再评估,以确保投资组合内的资产始终是市场上最优质的。
九、风险平价策略:
风险平价策略是一种投资策略,旨在平衡投资组合中各资产类别的风险贡献度,以实现投资组合风险的最优化。
这种策略的核心理念是通过对不同类别资产的权重进行平衡配置,将整个投资组合的风险均匀地分配到各个资产中去。
在实施风险平价策略时,投资者首先需要确定候选池,即待分析的股票或其他资产列表。
然后,对这些资产进行详细的风险评估,并将它们按照风险的大小进行排序。
接下来,投资者会选择风险最高的若干资产进行投资,同时定期对已投资产进行再评估,以确保投资组合内的资产始终保持均衡的风险分布。
十、CTA策略:
CTA策略,全称为商品交易顾问策略(Commodity Trading Advisor Strategy),是一种主要应用于期货和期权市场的策略。
这种策略的核心思想是通过对市场趋势的追踪,以此作为投资决策的依据。
在实施CTA策略时,投资者首先需要确定一个候选资产列表,这些资产通常是期货,例如股指期货、大宗商品期货和国债期货等。
然后,投资者会对这些资产的价格走势进行详尽的研究,以便找出可能的价格波动范围或者长短期均线的变化模式。
当价格突破这些设定的范围或模式时,投资者会采取相应的交易行动。
03、如何将量化交易策略运用到实战中
投资者了解了每一种量化交易策略的基本逻辑以后,需要自己写好相应的代码,然后运用到量化交易软件上进行回测,看一看这策略在过去的几年行情走势中的实战效果如何,如不理想,还需要进行代码更改。
那么如何在量化交易软件回测的选择上,我们应该如何选择量化交易软件?
这里给大家介绍两款国内主流的量化交易软件:迅投QMT和恒生Ptrade。可以私信或留言博主获取免费软件。佣金股票万一,ETF万0.5,可转债上海万0.44、深圳万0.5,融资5%。
在我们回测好某种交易逻辑可行以后,我们将会把量化交易运用到实战里,这时,我们需要找到量化交易软件的对接端口。
那么怎么对接QMT和Ptrade端口呢,建议投资者直接找证券公司的专业客户经理。
下面给大家介绍一个量化实用策略:
获取行情信息
get_history - 获取历史行情
get_history(count, frequency='1d', field='close', security_list=None, fq=None, include=False, fill='nan', is_dict=False)
使用场景
该函数仅在回测、交易模块可用
接口说明
该接口用于获取最近N条历史行情K线数据。支持多股票、多行情字段获取。
注意事项:
该接口只能获取2005年后的数据。
针对停牌场景,我们没有跳过停牌的日期,无论对单只股票还是多只股票进行调用,时间轴均为二级市场交易日日历,停牌时使用停牌前的数据填充,成交量为0,日K线可使用成交量为0的逻辑进行停牌日过滤。
参数
count: K线数量,大于0,返回指定数量的K线行情;必填参数;入参类型:int;
frequency:K线周期,现有支持1分钟线(1m)、5分钟线(5m)、15分钟线(15m)、30分钟线(30m)、60分钟线(60m)、120分钟线(120m)、日线(1d)、周线(1w/weekly)、月线(mo/monthly)、季度线(1q/quarter)和年线(1y/yearly)频率的数据;选填参数,默认为'1d';入参类型:str;
field:指明数据结果集中所支持输出的行情字段;选填参数,默认为['open','high','low','close','volume','money','price'];入参类型:list[str,str]或str;输出字段包括:
- open -- 开盘价,字段返回类型:numpy.float64;
- high -- 最高价,字段返回类型:numpy.float64;
- low --最低价,字段返回类型:numpy.float64;
- close -- 收盘价,字段返回类型:numpy.float64;
- volume -- 交易量,字段返回类型:numpy.float64;
- money -- 交易金额,字段返回类型:numpy.float64;
- price -- 最新价,字段返回类型:numpy.float64;
- preclose -- 昨收盘价,字段返回类型:numpy.float64(仅日线返回);
- high_limit -- 涨停价,字段返回类型:numpy.float64(仅日线返回);
- low_limit -- 跌停价,字段返回类型:numpy.float64(仅日线返回);
- unlimited -- 判断查询日是否是无涨跌停限制(1:该日无涨跌停限制;0:该日不是无涨跌停限制),字段返回类型:numpy.float64(仅日线返回);
security_list:要获取数据的股票列表;选填参数,None表示在上下文中的universe中选中的所有股票;入参类型:list[str,str]或str;
fq:数据复权选项,支持包括,pre-前复权,post-后复权,dypre-动态前复权,None-不复权;选填参数,默认为None;入参类型:str;
include:是否包含当前周期,True –包含,False-不包含;选填参数,默认为False;入参类型:bool;
fill:行情获取不到某一时刻的分钟数据时,是否用上一分钟的数据进行填充该时刻数据,'pre'–用上一分钟数据填充,'nan'–NaN进行填充(仅交易有效);选填参数,默认为'nan';入参类型:str;
is_dict:返回是否是字典(dict)格式{str: array()},True –是,False-不是;选填参数,默认为False;返回为字典格式取数速度相对较快;入参类型:bool;
返回
第一种返回数据:
当获取单支股票(单只股票必须为字符串类型security_list='600570.SS',不能用security_list=['600570.SS'])的时候,无论行情字段field入参单个或多个,返回的都是pandas.DataFrame对象,行索引是datetime.datetime对象,列索引是行情字段,为str类型。比如:
如果当前时间是2017-04-18,get_history(5, '1d', 'open', '600570.SS', fq=None, include=False)将返回:
open | |
---|---|
2017-04-11 | 40.30 |
2017-04-12 | 40.08 |
2017-04-13 | 40.03 |
2017-04-14 | 40.04 |
2017-04-17 | 39.90 |
第二种返回数据:
当获取多支股票(多只股票必须为list类型,特殊情况:当list只有一个股票时仍然当做多股票处理,比如security_list=['600570.SS'])的时候,如果行情字段field入参为单个,返回的是pandas.DataFrame对象,行索引是datetime.datetime对象,列索引是股票代码的编号,为str类型。比如:
如果当前时间是2017-04-18,get_history(5, '1d', 'open', ['600570.SS','600571.SS'], fq=None, include=False)将返回:
600570.SS | 600571.SS | |
---|---|---|
2017-04-11 | 40.30 | 17.81 |
2017-04-12 | 40.08 | 17.56 |
2017-04-13 | 40.03 | 17.42 |
2017-04-14 | 40.04 | 17.40 |
2017-04-17 | 39.90 | 17.49 |
第三种返回数据:
当获取多支股票(多只股票必须为list类型,特殊情况:当list只有一个股票时仍然当做多股票处理,比如security_list=['600570.SS'])的时候,如果行情字段field入参为多个,则返回pandas.Panel对象,items索引是行情字段(如'open'、'close'等),里面是很多pandas.DataFrame对象,每个pandas.DataFrame的行索引是datetime.datetime对象, 列索引是股票代码,为str类型,比如:
如果当前时间是2015-01-07,get_history(2, frequency='1d', field=['open','close'], security_list=['600570.SS', '600571.SS'], fq=None, include=False)['open']将返回:
600570.SS | 600571.SS | |
---|---|---|
2015-01-05 | 54.77 | 26.93 |
2015-01-06 | 51.00 | 25.83 |
假如要对panel索引中的对象进行转换,比如将items索引由行情字段转换成股票代码,可以通过panel_info = panel_info.swapaxes("minor_axis", "items")的方法转换。
比如:
panel_info = get_history(2, frequency='1d', field=['open','close'], security_list=['600570.SS', '600571.SS'], fq=None, include=False)
按默认索引:df = panel_info['open']
对默认索引做转换:panel_info = panel_info.swapaxes("minor_axis", "items")
转换之后的索引:df = panel_info['600570.SS']
关于numpy和pandas,请看下面的第三方库介绍。
示例
def initialize(context):
g.security = ['600570.SS', '000001.SZ']
set_universe(g.security)
def before_trading_start(context, data):
# 获取农业版块过去10天的每日收盘价
industry_info = get_history(10, frequency="1d", field="close", security_list="A01000.XBHS")
log.info(industry_info)
def handle_data(context, data):
# 股票池中全部股票过去5天的每日收盘价
his = get_history(5, '1d', 'close', security_list=g.security)
log.info('股票池中全部股票过去5天的每日收盘价')
log.info(his)
# 获取600570(恒生电子)过去5天的每天收盘价,
# 一个pd.Series对象, index是datatime
log.info('获取600570(恒生电子)过去5天的每天收盘价')
log.info(his['600570.SS'])
# 获取600570(恒生电子)昨天(数组最后一项)的收盘价
log.info('获取600570(恒生电子)昨天的收盘价')
log.info(his['600570.SS'][-1])
# 获取股票池中全部股票昨天的收盘价
log.info('获取股票池中全部股票昨天的收盘价')
log.info(his.iloc[-1])
# 获取600570(恒生电子)昨天(数组最后一项)的收盘价
log.info('获取600570(恒生电子)昨天的收盘价')
log.info(his.iloc[-1]['600570.SS'])
# 取得每一列的平均值
log.info('取得每一列的平均值')
log.info(his.mean())
# 获取股票池中全部股票的过去10分钟的成交量
his1 = get_history(10, '1m', 'volume')
log.info('获取股票池中全部股票的过去10分钟的成交量')
log.info(his1)
# 获取恒生电子的过去5天的每天的收盘价
his2 = get_history(5, '1d', 'close', security_list='600570.SS')
log.info('获取恒生电子的过去5天的每天的收盘价')
log.info(his2)
# 获取恒生电子的过去5天的每天的后复权收盘价
his3 = get_history(5, '1d', 'close', security_list='600570.SS', fq='post')
log.info('获取恒生电子的过去5天的每天的后复权收盘价')
log.info(his3)
# 获取恒生电子的过去5周的每周的收盘价
his4 = get_history(5, '1w', 'close', security_list='600570.SS')
log.info('获取恒生电子的过去5天的每天的收盘价')
log.info(his4)
# 获取多只股票的开盘价和收盘价数据
panel_info = get_history(2, frequency='1d', field=['open','close'], security_list=g.security)
open_df = panel_info['open']
log.info('获所有股票的取开盘价数据')
log.info(open_df)
df = open_df['600570.SS']
log.info('仅获取恒生电子的开盘价数据')
log.info(df)
# panel索引中的对象进行转换
panel_info2 = panel_info.swapaxes("minor_axis", "items")
df = panel_info2['600570.SS']
log.info('仅获取恒生电子的开盘价和收盘价数据')
log.info(df)
open_df = df['open']
log.info('获取恒生电子的开盘价数据')
log.info(open_df)