最近刚开始学习量化交易,在聚宽网上看了几篇教程,对操作流程有了大致的了解,接下来打算好好研究一下交易策略。

据大奖章基金的Simons透露,他那个每年收益率20%以上的系统,一点都不费解(complicated),但是非常复杂(complex)。

我的理解是,一个好的量化交易系统,不一定要用到高深的算法和技术,但是必须包含很多种简单的算法和技术。

换句话说,你得从最基础的算法开始,一个模块一个模块地加上去,选股、择时、风控、资金管理,每个方向都要综合考虑好几种不同的指标,才能打造出一个不费解但很复杂(not complicated but complex)的交易系统。

爱因斯坦说过,上帝只做加法。

也许基于人工智能(AI)的交易系统构造起来不用这么麻烦,这个以后有空再研究。

眼下先从择时技术开始,先看看最简单的MACD,也就是双均线策略。

MACD指标

MACD系列指标由三个指标沟构成,分别是DIF,DEA和HIST。DIF是12日指数移动平均线(EMA12,又称快线)与26日指数移动平均线(EMA26,又称慢线)的背离程度: $$DIF=EMA(12)−EMA(26)$$

DEA是DIF的9日指数移动平均线: $$DEA=EMA(DIF,9)$$

HIST是DIF与DEA的差值乘以2: $$HIST=(DIF−DEA)×2$$

HIST又称MACD柱,是MACD系列指标中最重要的一个,有些人只根据它来决定是否买入卖出,但我查询了一番文献,还进行了一系列的试错,发现还是综合考虑另外两个指标更好。

废话不多说了,上代码。

Python代码

第一步:导入各种库

import numpy as np

import pandas as pd

import talib as ta

# 这个是聚宽网(joinquant)的数据下载API,免费账户每天能下载100万条数据

from jqdatasdk import *

# 登录验证

auth("你的手机号", "你的密码")

import matplotlib.pyplot as plt

%matplotlib inline

第二步:下载数据

# 下载2015-2018年的沪深300指数,频率为每天,只要收盘价

price = get_price("000300.XSHG", start_date="2015-01-01", end_date="2018-12-31", frequency="daily", fields=['close'])['close']

# 用python自带的tseries库中的pct_change()函数计算日收益率

ret = price.pct_change()

# 画图

plt.figure(figsize=(18,8))

ax1 = plt.subplot(2,1,1)

ax1.plot(price)

ax2 = plt.subplot(2,1,2)

ax2.plot(ret)

plt.show()沪深300指数和日收益率

这4年间,沪深300指数的走势还是很典型的:2015年暴涨暴跌,2016-2017两年间温和上涨,2018年快速下跌。

第三步:计算指标

# 用talib库中的相应函数计算MACD指标

dif, dea, hist = ta.MACD(price)

# 计算EMA12和EMA26

ema12 = ta.EMA(price, 12)

ema26 = ta.EMA(price, 26)

第四步:生成交易信号

这里只考虑做多,不考虑做空的情况。

为了方便比较,我尝试了集中不同的策略。

# sig1只考虑HIST指标,HIST转正时开仓买入,转负时清仓

sig1 = (hist>0)

# sig2同时考虑HIST指标和DEA指标,只有当HIST转正,且DEA在0以上时,才开仓买入,任何一个指标变负即清仓。

# 这是文献中建议的方法

sig2 = (hist>0) & (dea>0)

# sig3同时考虑HIST和EMA指标,只有当HIST为正,而且当前价格在慢线(26日指数加权平均价)上方时,才开仓买入,任何一个指标转负即清仓。

# 网上有人建议过这种方法(如果我没有理解错的话)

sig3 = (hist>0) & (price>ema26)

接下来,我们来直观地比较一下这三个交易信号。

plt.figure(figsize=(18,12))

ax1=plt.subplot(4,1,1)

ax1.plot(price)

ax2=plt.subplot(4,1,2)

ax2.bar(x=sig1.index, height=sig1.values)

ax3=plt.subplot(4,1,3)

ax3.bar(x=sig2.index, height=sig2.values)

ax4=plt.subplot(4,1,4)

ax4.bar(x=sig3.index, height=sig3.values)

plt.show()交易信号

看起来策略1最激进,策略2最保守。后者完美地避开了15年和18年的两段暴跌,期间一次买入指令也没有发出过,但在16-17年的缓慢回升中,参与度似有不足。

第五步:模拟交易

简单起见,这里不考虑手续费。

以策略2为例,作图比较该策略和“买入-持有”策略的表现。

# sig2滞后一期、去除空值、转换成整数

sig2_lag = sig2.shift(1).fillna(0).astype(int)

# sig2_lag与股票日收益率相乘,即可得策略日收益率。python能自动对齐时间序列的日期。

sig2_ret = sig2_lag*ret

# 计算策略累计收益

cum_sig2_ret = (1+sig2_ret).cumprod()

# 把股票价格转换成从1开始,方便比较

price_norm = price/price[0]

# 开始作图

plt.figure(figsize=(18,8))

plt.plot(price_norm)

plt.plot(cum_sig2_ret)

plt.legend(["benchmark", "strategy cumulative return"], loc="upper left")

plt.show()累计收益率

由此可见,策略2在股市暴涨暴跌期间表现出色,它几乎完整地抓住了15年上半年的暴涨,却完美地避开了15年下半年和18年的暴跌。但是,在股市温和上涨的16、17年,该策略的表现却落后于大盘。

总而言之,该策略简单归简单,表现却不俗,在大盘下跌近20%的4年中,实现了近60%的收益,目测最大回测不超过10%。

当然,这款策略还有改进的余地,比如说,如果把交易频率调低,也许表现会更好。

接下来,我打算寻找:

1. 一个更加适应温和上涨行情的策略;

2. 一个能有效区分暴涨暴跌行情和温和涨跌行情的指标。

请大家积极发言献策!

python量化交易策略实例_python量化交易策略入门(一):MACD的威力相关推荐

  1. python量化交易策略实例_Python量化实例 – 基于股票的金融数据量化分析

    说明:本文只是通过自己的已学知识对 一.分析目的 利用预先设定的策略,通过对股票交易的历史数据进行回测,验证该策略是否能指导股票交易. 二.数据处理 1.数据集描述 数据集简介:此数据集来源于Nasd ...

  2. python不同时间周期k线_Python量化交易基础讲堂-股票分笔数据跨周期处理

    <Python实战-构建基于股票的量化交易系统>小册子主要侧重于 Python 实战讲解,但在内容设计上提供了前置基础章节帮助读者快速掌握基础工具的使用.同时我们会持续更新一些关于Pyth ...

  3. python数据分析包pandas论文_python数据分析pandas包入门学习(一)pandas数据结构介绍...

    本文参考<利用python进行数据分析>的第五章 pandas入门python 1 pandas数据结构介绍 pandas有两种主要的数据结构:series和DataFrame Serie ...

  4. python量化交易策略实例_Python进阶量化交易场外篇3——最大回撤评价策略风险...

    新年伊始,很荣幸笔者的<教你用 Python 进阶量化交易>专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习 ...

  5. python量化交易的框架_python量化交易框架easyquant试用体会

    在github上发现一个python写的,看上去简单实用的量化交易框架easyquant,作者是在他写的easytrader上实现了自动读取行情和交易登入,初步试验了雪球登入,效果还不错. 安装这个框 ...

  6. python量化交易学习笔记_Python量化交易学习笔记(45)——深度学习挖短线股5

    前4篇文章分别记录了利用深度学习挖短线股的数据预处理.模型训练.结果预测及策略回测过程,本文记录根据筛选短线股票的过程. 选股流程 1.股票数据下载更新 例如现在是2020年11月23日19:00,我 ...

  7. python找出主力合约价格_Python实盘交易之期货指数映射主力与“自动换月”

    点及财经,股票期货专业投机者. 前言 通常情况下,大部分的程序化交易者都采用期货指数作为信号的产生,而报单是需要用主力合约的价格去报,这就是"指数映射主力". 因为,主力换月会有跳 ...

  8. python时间序列平稳性检验_Python量化投资基础:时间序列的平稳性检验

    主要内容: 1. 自相关性和自相关系数 2. 强平稳和弱平稳 3. Python平稳性检验实战 重要性:10分 (1-10). 时间序列数据的平稳性对于我们采用什么样的分析方式.选择什么样的模型有着至 ...

  9. python中递归函数的实例_Python 递归函数详解及实例

    Python 递归函数 如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是 ...

最新文章

  1. P2261 [CQOI2007]余数求和
  2. 启动子级时出错_减速机安装与使用时需注意的八个要点,细节很重要!
  3. 《TensorFlow技术解析与实战》——第3章 可视化TensorFlow 3.1PlayGround
  4. Jquery源码分析-整体结构
  5. Redis Sentinel 配置文件
  6. code换取微信openid_关于PHP如何获取微信的openID教程
  7. Java EE 6 VS Spring 3:Java EE已经杀死了Spring? 没门!
  8. 执行本地sql_实用!5个在线 SQL 数据库环境
  9. 解决mac 系统软件被阻止载入点允许没反应的问题
  10. 用java编写的一个迪杰斯特拉算法(单源最短路径算法,Dijkstra算法)。
  11. pythoncsv格式清洗与转换_Python中 CSV格式清洗与转换的实例代码
  12. python做鼠标自动移动_Python实现鼠标自动在屏幕上随机移动功能
  13. HBase Rowkey的散列与预分区设计
  14. 【Java多线程】synchronized同步语句块
  15. vue实现添加购物车光标效果
  16. 微信开发者工具登录问题,网络连接失败
  17. Linux 创建用户角色并添加ssh登录权限
  18. Cell:PopCOGenT鉴定微生物基因组间的基因流动
  19. 摄影曝光基础——光圈、快门、ISO
  20. 思科三层交换机不同vlan互通_Cisco三层交换机实现不同vlan之间的通信

热门文章

  1. ios上架图片在线制作_iOS、Windows 值得下载的 12 个新 App
  2. 知识点滴 - 什么是当量
  3. 商城后台管理React+Springboot
  4. 再现“换桥奇迹”|人大金仓助力大型运营商完成营销系统国产化升级
  5. 网页采集器-八爪鱼采集器
  6. 车位地磁检测器产品选型指导(干货!)
  7. usb hub芯片 android,usb hub芯片GL850G详解
  8. 25款专业的 WordPress 电子商务网站主题
  9. wxpython应用程序_用wxPython创建GUI应用程序展示NASA图片(第一部分)
  10. oracle spool循环导出文件,oracle 使用spool导出数据到文件