当前位置: 首页 > 新闻 > 信息荟萃
编号:405
零起点Python大数据与量化交易.pdf
http://www.100md.com 2019年12月24日
第1页
第8页
第14页
第21页
第47页
第527页

    参见附件(23954KB,617页)。

     零起点Python大数据与量化交易是由何海群所著,主要讲述了关于Python大数据与量化交易,作者运用大量数据的分析,总结出量化交易的学习经验,可以直接适用于实盘交易。

    零起点Python大数据与量化交易预览图

    《零起点Python大数据与量化交易》目录

    第1章 从故事开始学量化 1

    第2章 常用量化技术指标与框架 56

    第3章 金融数据采集整理 101

    第4章 PAT案例汇编 162

    第5章 zwQuant整体架构 196

    第6章 模块详解与实盘数据 237

    第7章 量化策略库 282

    第8章 海龟策略与自定义扩展 309

    第9章 TA-Lib函数库与策略开发 329

    第10章 扩展与未来 360

    《零起点Python大数据与量化交易》作者简介

    何海群,网名:字王,CHRD前海智库CTO,《中华大字库》发明人,出版书籍20余部,在人工智能、数据分析等方面具有20年一线专业经验;zwPython开发平台、zwQuant量化软件设计师,中国“Python创客”项目和“Python产业联盟”发起人,国内Python量化课程《Python量化实盘?魔鬼训练营》创始人,也是极宽量化开源团队的创始人。其研究成果有:“小数据”理论、快数据模型、黑天鹅算法、人工智能“足彩图灵法则”等;其论文《人工智能与中文字型设计》是中文字库行业三大基础建模理论之一。论文《人工智能与中文字型设计》是中文字库行业三大基础建模理论之一。

    《零起点Python大数据与量化交易》内容简介

    《零起点Python大数据与量化交易》是国内较早关于Python大数据与量化交易的原创图书,配合zwPython开发平台和zwQuant开源量化软件学习,是一套完整的大数据分析、量化交易的学习教材,可直接用于实盘交易。《零起点Python大数据与量化交易》有三大特色:第一,以实盘个案分析为主,全程配有Python代码;第二,包含大量的图文案例和Python源码,无须专业编程基础,懂Excel即可开始学习;第三,配有专业的zwPython集成开发平台、zwQuant量化软件和zwDat数据包。

    《零起点Python大数据与量化交易》内容源自笔者的原版教学课件,虽然限于篇幅和载体,省略了视频和部分环节,但核心内容都有保留,配套的近百套Python教学程序没有进行任何删减。考虑到广大入门读者的需求,笔者在各个核心函数环节增添了函数流程图。

    零起点Python大数据与量化交易截图

    目 录

    内容简介

    前言

    第1章 从故事开始学量化

    1.1 亿万富翁的“神奇公式”

    1.1.1 案例1-1:亿万富翁的“神奇公式”

    1.1.2 案例分析:Python图表

    1.1.3 matplotlib绘图模块库

    1.1.4 案例分析:style绘图风格

    1.1.5 案例分析:colormap颜色表

    1.1.6 案例分析:颜色表关键词

    1.1.7 深入浅出

    1.2 股市“一月效应”

    1.2.1 案例1-2:股市“一月效应”

    1.2.2 案例分析:“一月效应”计算

    1.2.3 案例分析:“一月效应”图表分析

    1.2.4 案例分析:颜色表效果图

    1.2.5 “一月效应”全文注解版Python源码

    1.2.6 大数据·宏分析

    1.3 量化交易流程与概念

    1.3.1 数据分析I2O流程

    1.3.2 量化交易不是高频交易、自动交易

    1.3.3 小资、小白、韭菜

    1.3.4 专业与业余

    1.4 用户运行环境配置

    2.4.1 TA-Lib金融软件包

    2.4 常用量化技术指标

    2.3.2 案例2-2:模块库列表

    2.3.1 常用量化软件包简介

    2.3 常用量化软件包

    2.2.4 主流Python量化框架

    2.2.3 我国主流Python量化网站

    2.2.2 国外主流Python量化网站

    2.2.1 量化行业关键词

    2.2 Python量化系统框架

    2.1.4 KISS法则

    2.1.3 main程序主入口

    2.1.2 量化程序结构

    2.1.1 案例要点与事件编程

    2.1 案例2-1:SMA均线策略

    第2章 常用量化技术指标与框架

    1.6 量化、中医与西医

    1.5.7 实战胜于一切

    1.5.6 单版本双开、多开模式

    1.5.5 Python2、Python 3双版本双开模式

    1.5.4 图像显示配置

    1.5.3 代码配色技巧

    1.5.2 Spyder编辑器界面设置

    1.5.1 模块检测

    1.5 Python实战操作技巧

    1.4.2 金融股票数据包

    1.4.1 程序目录结构

    3.7 历史数据

    3.6.3 CSV文件处理

    3.6.2 案例3-3:下载股票代码数据

    3.6.1 沪深股票列表

    3.6 财经数据源模块库TuShare

    3.5 案例3-2:下载美股数据

    3.4 开源文档库Read the Docs

    3.3 美股数据源模块库

    3.2 案例3-1:zwDatX数据类

    3.1.3 专业数据模块库

    3.1.2 专业财经数据API

    3.1.1 大数据综合API

    3.1 常用数据源API与模块库

    第3章 金融数据采集整理

    2.7 起点与终点

    2.6.3 其他常用量化策略

    2.6.2 均值回归策略

    2.6.1 动量交易策略

    2.6 常用量化策略

    2.5.4 ETF套利策略

    2.5.3 海龟交易法则

    2.5.2 Beta策略

    2.5.1 阿尔法(Alpha)策略

    2.5 经典量化策略

    2.4.4 量化分析常用指标

    2.4.3 TA-Lib函数调用

    2.4.2 案例2-3:MA均线函数调用

    4.3.1 案例4-6:均线交叉策略

    4.3 均线交叉策略

    4.2.4 案例4-5:A股版SMA均线策略

    4.2.3 案例4-4:增强版SMA均线策略

    4.2.2 案例4-3:原版SMA均线策略

    4.2.1 SMA简单移动平均线

    4.2 SMA均线策略

    4.1.2 案例4-2:投资组合收益计算

    4.1.1 案例4-1:下载多组美股数据

    4.1 投资组合与回报率

    第4章 PAT案例汇编

    3.11 为有源头活水来

    3.10.4 案例3-12:数据归一化

    3.10.3 案例3-11:A股策略PAT实盘分析

    3.10.2 案例3-10:数据格式转化

    3.10.1 中美股票数据格式差异

    3.10 数据归一化处理

    3.9.4 案例3-9:美股交易数据下载

    3.9.3 案例3-8:A股指数行情数据下载

    3.9.2 案例3-7:A股交易数据下载

    3.9.1 案例3-6:A股基本概况数据下载

    3.9 zwDat超大股票数据源与数据更新

    3.8 其他交易数据

    3.7.4 案例3-5:下载历史复权数据

    3.7.3 历史复权数据

    3.7.2 案例3-4:下载近期股票数据

    3.7.1 历史行情

    5.5 回溯案例:对标测试

    5.4 常用量化分析参数

    5.3 示例程序

    5.2.10 zw_TA-Lib:金融函数模块

    5.2.9 zwStrategy:策略工具函数

    5.2.8 zwBacktest:回溯测试工具函数

    5.2.7 zwQTDraw.py:量化绘图工具函数

    5.2.6 zwQTBox:常用“量化”工具函数集

    5.2.5 zwTools模块:常用(非量化)工具函数

    5.2.4 zwSys模块:系统变量与类定义

    5.2.3 模块说明

    5.2.2 安装与更新

    5.2.1 目录结构

    5.2 功能简介

    5.1 发布前言

    第5章 zwQuant整体架构

    4.7 案例与传承

    4.6.2 案例4-13:A股版RSI2策略

    4.6.1 案例4-12:RSI2策略

    4.6 RSI2策略

    4.5.2 案例4-11:A股版布林带策略

    4.5.1 案例4-10:布林带策略

    4.5 布林带策略

    4.4.2 案例4-9:A股版VWAP动量策略

    4.4.1 案例4-8:VWAP动量策略

    4.4 VWAP动量策略

    4.3.2 案例4-7:A股版均线交叉策略

    6.3.1 mul多个时间点的交易数据

    6.3 零点策略

    6.2.6 输出回溯结果数据、图表

    6.2.5 回溯测试:zwBackTest

    6.2.4 绑定策略函数

    6.2.3 dataPre数据预处理

    6.2.2 设置策略参数

    6.2.1 设置股票数据源

    6.2 运行流程详解

    6.1.3 运行总流程

    6.1.2 代码构成

    6.1.1 案例6-1:投资回报率

    6.1 回溯流程

    第6章 模块详解与实盘数据

    5.8 新的起点

    5.7.8 绘图模板

    5.7.7 数据预处理

    5.7.6 量化系统的价格体系

    5.7.5 案例5-1:qxLib数据

    5.7.4 qxLib、xtrdLib

    5.7.3 案例:内存数据库数据包

    5.7.2 Bars数据包

    5.7.1 stkLib内存数据库

    5.7 主体框架

    5.6 回报参数计算

    5.5.2 对标测试2:VWAP策略

    5.5.1 对标测试1:投资回报参数

    7.5 BBands布林带策略

    7.4.2 案例7-6:实盘VWAP策略

    7.4.1 案例7-5:VWAP策略

    7.4 VWAP策略

    7.3.4 人工优化参数

    7.3.3 案例7-4:CMA均线交叉策略修改版

    7.3.2 对标测试误差分析

    7.3.1 案例7-3:均线交叉策略

    7.3 CMA均线交叉策略

    7.2.3 案例7-2:实盘SMA均线策略

    7.2.2 实盘下单时机与推荐

    7.2.1 案例7-1:SMA均线策略

    7.2 SMA均线策略

    7.1.2 通用数据预处理函数

    7.1.1 量化系统的三代目

    7.1 量化策略库简介

    第7章 量化策略库

    6.6 稳定第一

    6.5.4 案例6-5:大盘指数更新

    6.5.3 案例6-4:A股实盘数据更新

    6.5.2 实盘数据更新

    6.5.1 大盘指数文件升级

    6.5 金融数据包与实盘数据更新

    6.4.2 数据源格式修改

    6.4.1 案例6-3:数据源修改

    6.4 不同数据源与格式修改

    6.3.2 案例6-2:多个时间点交易

    9.2 MACD策略

    9.1.2 矩阵版TA-Lib金融函数模块

    9.1.1 TA-Lib官网

    9.1 TA-Lib技术指标

    第9章 TA-Lib函数库与策略开发

    8.13 庖丁解牛

    8.12 案例8-7:入库

    8.11 tur海龟策略v9:加入策略库

    8.10.3 案例8-6:参数优化

    8.10.2 参数优化

    8.10.1 案例8-5:图表输出

    8.10 tur海龟策略v5:数据图表输出

    8.9 案例8-4:策略分析

    8.8 tur海龟策略v4:策略分析

    8.7 案例8-3:数据预处理

    8.6 tur海龟策略v3:数据预处理

    8.5 案例8-2:策略初始化

    8.4 tur海龟策略v2:策略初始化

    8.3 案例8-1:海龟策略框架

    8.2 tur海龟策略v1:从零开始

    8.1.2 海龟投资策略

    8.1.1 自定义策略

    8.1 策略库

    第8章 海龟策略与自定义扩展

    7.6 大道至简1+1

    7.5.2 案例7-8:实盘BBands布林带策略

    7.5.1 案例7-7:BBands布林带策略

    10.3 系统整合

    10.2.7 案例10-3:inxCut数据切割

    10.2.6 大盘数据切割

    10.2.5 案例10-2:读取指数

    10.2.4 大盘指数读取函数

    10.2.3 扩展zwQuantX类变量

    10.2.2 大盘指数内存数据库

    10.2.1 大盘指数文件升级

    10.2 大盘指数资源

    案例10-1:SMA均线策略扩展

    10.1 回顾案例2-1:SMA均线策略

    第10章 扩展与未来

    9.5 基石、策略与灵感

    9.4.4 案例9-5:A股版RSI策略

    9.4.3 预留参数优化接口

    9.4.2 RSI策略

    9.4.1 RSI取值的大小

    9.4 RSI策略

    9.3.4 案例9-4:KDJ02

    9.3.3 KDJ策略2

    9.3.2 案例9-3:KDJ01

    9.3.1 KDJ策略1

    9.3 KDJ策略

    9.2.4 案例9-2:MACD_v2

    9.2.3 MACD策略2

    9.2.2 案例9-1:MACD_v1

    9.2.1 MACD策略110.3.1 案例10-4:整合设置

    10.3.2 案例10-5:修改指数代码

    10.3.3 修改sta_dataPre0xtim函数

    10.3.4 案例10-6:整合数据切割

    10.3.5 修改绘图函数

    10.4 扩展完成

    案例10-7:SMA均线扩展策略

    10.5 其他扩展课题

    10.5.1 复权数据冲突

    10.5.2 波动率指标DVIX

    10.5.3 修改回溯主函数zwBackTest

    10.5.4 案例10-8:波动率

    10.5.5 空头交易

    10.5.6 虚拟空头交易

    10.5.7 修改检查函数

    10.5.8 案例10-9:空头数据

    10.6 终点与起点

    附录A zwPython开发平台用户手册

    附录B Python量化学习路线图

    图书在版编目(CIP)数据

    零起点Python大数据与量化交易 何海群著. —北京:电子工业出版社,2017.2

    (金融科技丛书)

    ISBN 978-7-121-30659-4

    Ⅰ. ①零… Ⅱ. ①何… Ⅲ. ①软件工具-程序设计 Ⅳ. ①TP311.561

    中国版本图书馆CIP数据核字(2016)第308385号

    责任编辑:黄爱萍

    印 刷:三河市双峰印刷装订有限公司

    装 订:三河市双峰印刷装订有限公司

    出版发行:电子工业出版社 北京市海淀区万寿路173信箱 邮编:

    100036

    开 本:787×980 116

    印 张:27.5

    字 数:528千字

    版 次:2017年2月第1版

    印 次:2017年2月第1次印刷

    定 价:99.00元

    凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店

    售缺,请与本社发行部联系,联系及邮购电话:(010)88254888,88258888。

    质量投诉请发邮件至zlts@phei.com.cn,盗版侵权举报请发邮件至

    dbqq@phei.com.cn。

    本书咨询联系方式:(010)51260888-819,faq@phei.com.cn。

    未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。

    版权所有,侵权必究。

    内容简介

    本书是国内较早关于Python大数据与量化交易的原创图书,配合

    zwPython开发平台和zwQuant开源量化软件学习,是一套完整的大数据

    分析、量化交易的学习教材,可直接用于实盘交易。本书有三大特色:

    第一,以实盘个案分析为主,全程配有Python代码;第二,包含大量的

    图文案例和Python源码,无须专业编程基础,懂Excel即可开始学习;第

    三,配有专业的zwPython集成开发平台、zwQuant量化软件和zwDat数

    据包。

    本书内容源自笔者的原版教学课件,虽然限于篇幅和载体,省略了

    视频和部分环节,但核心内容都有保留,配套的近百套Python教学程序

    没有进行任何删减。考虑到广大入门读者的需求,笔者在各个核心函数

    环节增添了函数流程图。

    丛书编委会

    主编:何海群

    编委:

    欧耘华 ,CHRD前海智库创始人,Python产业联盟发起人。科技金

    融、消费金融、艺术金融与产业政策专家。北京亚欧科技、深圳“中国

    科谷”等多家机构特聘专家。

    刘志明 ,免费开源金融数据接口TuShare创始人,专业从事量化投

    资支持与服务。

    杨适安 ,中信建投证券金融产品及创新业务部副总裁,对期权、期货等衍生品种有较深入的研究,擅长用中低频量化的方法配置大类资

    产和金融产品。

    吴尚谦 ,金融交易实盘培训专家,纯实盘首席金融交易教练,15

    年股票、期货、外汇实盘交易经验,金融交易混元合一交易系统发明

    人,业内领先的现场实盘逻辑推演教学法资深讲师。北京正道阳光投资

    管理有限公司总经理。

    曹嘉和 ,美国普林顿大学荣誉博士,北大当代企业文化研究所研

    究员。现任北大中国持续发展研究中心政府与社会资本合作研究所所

    长,未名湖智库秘书长。

    王丁杰 ,QuantDigger量化软件开发者,擅长机器学习、NLP自然

    语言处理、人工智能。

    王黎中 ,资深金融交易心理专家,北京正道阳光投资管理有限公

    司副总经理,幸福紫薇俱乐部董事长。

    王家苍 ,经济学博士,李约瑟(《中国科学技术史》作者)隔代

    弟子,产业政策专家。长期致力于科技和文化的融合研究,参与科技金

    融、消费金融和艺术金融等课题的研究。

    蔡磊 ,原高通公司工程师、项目经理,精通Python数据挖掘、数据

    库技术、机器学习、量化交易理论,熟悉4G无线技术、手机芯片架构

    及VOIP技术,极宽量化开源团队核心成员。

    王硕 ,高级软件工程师,精通Python数据分析,擅长Java、JavaScript、HTML5和数据库技术,极宽量化开源团队核心成员。

    吴娜 ,电信数据挖掘工程师,精通缠论和江恩波动理论,率先研

    发江恩波动法则量化模型,著有《游戏数据分析的艺术》,极宽量化开

    源团队发起成员。

    余勤 ,AMD验证工程师,擅长数据分析,热爱Python量化分析,极宽量化开源团队发起成员。

    孙洋洋 ,西南财经大学金融工程硕士,擅长机器学习、网络爬

    虫,有私募机构量化分析系统开发实盘经验,极宽量化开源团队发起成

    员。

    李政隆 ,上海交大计算机硕士,分布式系统架构师,擅长金融数

    据抓取与分析,极宽量化开源团队发起成员。

    前言

    2014年,美国银行、美林证券的“石英”项目、摩根大通的“雅典

    娜”项目都不约而同地选择了Python作为金融行业的标准编程语言。

    全世界的金融工程行业全部重新洗牌,这为中国的金融工程从业人

    员带来了前所未有的机遇。资本的力量是强大的,也是冷酷无情的。

    2016年5月,《华尔街日报》报道,目前华尔街的三大编程语言

    是:C、Java与Python。其中,C与Java成为三大语言之一有两方面原

    因:一方面是由于历史积累,另一方面是系统架构设计的需要。而在应

    用领域Python更胜一筹,因为Python已经成为金融行业量化领域的标准

    编程语言。

    本书是国内较早关于Python大数据与量化交易的原创图书。本书配

    合zwPython、zwQuant开源量化软件学习,是一套完整的大数据分析、量化交易的学习教材,可直接用于实盘交易。

    本书内容包括:

    近50万字的图文课件;

    数十套结合课件的Python教学代码;

    全套zwPython开源平台;

    业内首套面向初学者的开源量化系统zwQuant;

    国内较大的开源金融数据包zwDat,包括tick数据。

    100%零基础,无须任何编程、交易经验,也不需要具备超强的数

    据分析能力,只要会使用Excel就可以轻松学会本书讲解的知识点。读

    完本书内容和配套的教学代码,就能够编写简单的量化策略函数。

    本书的内容源自笔者的原版教学课件,虽然限于篇幅和载体,省略

    了视频和部分环节,但核心内容都有保留,配套的近百套Python教学程

    序没有进行任何删减。

    考虑到广大入门读者的需求,笔者在各个核心函数环节增添了函数

    流程图。

    量化新人学习指南

    1.多参考笔者的字王量化网站(http:www.ziwang.com)和笔者博

    客(以原创为主,网址是http:blog.sina.com.cnzbrow)。

    2.本书配套程序可在百度网盘下载,网址是

    http:pan.baidu.comsljIg944u。本书读者QQ群(zwPython量化总群):

    124134140。网盘和群共享包含很多资源,读者可自行下载,也可以上

    传。建议先看“漫画学××系列”,该系列比较经典,而且简单;zwQuant

    开源量化软件在群共享和网盘都可下载。

    3.强烈建议初学者先下载zwPython集成版,阅读zwPython中文手

    册,再开始学习Python,这样可以少走很多弯路。

    资源下载

    为配合本书出版,方便广大读者学习Python量化系统,笔者特意将

    与本书相关的教学资源打包成一个独立的教学版本压缩包,便于读者使

    用。

    教学版为一个独立压缩包,解压即可,并配有说明文档。

    教学版内置了zwPython2016M10版开发平台(Python 3.5版)、Python 2.7版开发平台、zwDat金融数据包、zw_down25金融数据

    下载更新程序包和zw_k10配套量化教学课件程序。

    教学版软件和配套资源下载地址如下。

    极宽公司网盘下载地址:http:pan.baidu.coms1kVO6T19,密

    码:v2ub。

    出版社网站下载地址:http:www.broadview.com.cn30659。

    以上网址如果发生变动,请读者浏览字王网站

    (http:www.ziwang.com)或者极宽公司网站(http:www.zquant.cn)

    获取最新信息。

    致谢

    虽然很多网友在笔者博客留言,要求购买本书,但本书的创作和正

    式出版还是经历了许多波折。

    如今本书终于出版,在此,要特别感谢电子工业出版社的黄爱萍和

    戴新编辑,感谢她们在选题策划和稿件整理方面做出的大量工作。

    同时,在本书创作过程中,极宽开源量化团队和培训班的全体成

    员,提出很多宝贵的意见,并对部分课件程序做了中文注解。

    特别是吴娜、余勤两位同学,为极宽开源量化文库和zwQuant开源

    量化软件编写文档,以及在团队成员管理方面做了大量工作,为他们的

    付出表示感谢。

    何海群(字王)

    北京极宽科技有限公司CTO

    2016年11月25日

    第1章

    从故事开始学量化

    本书全程采用MBA个案教学模式,每章都有介绍案例,这些案例

    都配有纯Python源码,由浅到深,尽量覆盖量化交易、量化分析的各个

    环节,同时书中还配合有关案例,对Python编程技巧、金融量化领域的

    背景知识做了部分介绍。

    即使非金融专业、没有经验的读者,也能够根据书中的案例举一反

    三,借鉴到自己的实盘操作当中。

    至于案例背后的理论、算法、模型,有些非常复杂,属于专业课

    程,甚至学术范畴,初学者无须一一细究。

    本章是入门课程,通过几个经典的案例,读者将学习以下知识:

    量化算法、量化策略(投资策略);

    不同的量化算法、量化策略所带来的收益差别;

    用Excel进行简单的量化分析;

    用Python进行简单的量化分析。

    很多人,特别是初学者,一提起量化投资就觉得很神秘、很复杂,特别是提到其中的交易算法、量化模型,更加觉得高不可攀。

    本书一开始就从趣味投资学入手,通过几个简单的小故事揭开量化

    投资的神秘面纱。

    1.1 亿万富翁的“神奇公式”

    1.1.1 案例1-1:亿万富翁的“神奇公

    式”

    假设有一位年轻人,每年定期存款1.4万元,享受平均5%的利率,如此持续40年,他可以积累的财富为:

    1.4×(1+5%)^40=169(万元)

    注意,这个公式不是一般的数学计算公式,而是复利公式,其计算

    方法如下:

    (1)本利和=本金×(1+年利率)^期限。

    (2)Excel复利计算公式为“=FV(rate,nper,pv,pmt,type)”。

    Excel操作为:“=FV(5%,40-1,-14000, -14000)”。

    结果是:1 691 196.84(元)。

    如果这位年轻人将每年应存的钱全部投资到股票或房地产市场,并

    假定能获得年均20%的投资回报率,则40年后,他能积累多少财富?

    一般人猜测是200万元至800万元。然而,“神奇公式”给出的答案是

    下面用Excel分析一下这个“神奇公式”。

    经扣除了各种风险因素。

    资策略,20%的年收益需要考虑风险因素,此次假设20%的年收益率已

    保守的银行储蓄策略,5%的年收益基本可以实现。激进的股市投

    激进投资策略:股市投资,20%的年收益。

    保守投资策略:银行储蓄,5%的年收益。

    在“神奇公式”这个案例中,就涉及到两种不同的策略和算法公式。

    段。

    量化投资所用的算法、模式、策略,其实只是数据分析的一种手

    增长速度都是几何裂变模式的。

    谓,关键是稳定。只要稳定了,使用复利公式,哪怕是1%的增长,其

    做量化分析、量化投资,任何算法、模型、短期收益的高低都无所

    这个“神奇公式”就是所有量化分析的基础公式:复利计算公式。

    比,你会发现两者收益的差距达60多倍,多么令人惊讶!

    试着将这个天文数字与平均投资回报率仅为5%的定期存款结果相

    结果是:102 814 009.76(元)。

    Excel操作为:“=FV(20%,40-1,-14000,-14000)”。

    (40-1)]=1.0281(亿元)

    这个数据是依照财务学计算年金的公式得到的:1.4×[(1+20%)^

    1.0281亿元!配套文件名是\zwpython\zw_k10\dat\k101.xls。

    打开文件,如图1-1所示。

    图1-1 “神奇公式”收益表

    从“神奇公式”收益表我们可以看到:

    用户累计投入56万元(1.4万元×40);

    保守模式,5%年收益率,40年总收益169万元,投资回报率3

    倍;

    激进模式,20%年收益率,40年总收益1.02亿元,投资回报率184

    倍;

    激进模式与保守模式两者的回报相差61倍。

    下面再看看“神奇公式”Python版本的脚本程序。

    脚本文件名为\zwpython\zw_k10\k101.py。

    -- coding: utf-8 --

    import numpy as np

    =======================

    def sta001(k,nyear,xd):

    d2=np.fv(k,nyear,-xd,-xd);

    d2=round(d2)

    return d2

    =======================

    d40=1.440

    print(d40,40 x 1.4=,d40)

    d=sta001(0.05,40-1,1.4);

    print(01保守投资模式,,d,round(dd40))

    d2=sta001(0.20,40-1,1.4);

    print(02激进投资模式,,d2,round(d2d40))

    dk=round(d2d)

    print(dk,两者差别(xx倍):,dk)

    以上程序运行结果如图1-2所示,和Excel的计算结果完全一致。

    图1-2 “神奇公式”Python程序运行结果

    算法(Algorithm)是指解题方案准确而完整的描述,是一系列解决

    问题的清晰指令。算法代表着用系统的方法描述解决问题的策略机制。

    也就是说,能够对一定规范的输入,在有限时间内获得所要求的输

    出。如果一个算法有缺陷,或不适合于某个问题,那么执行这个算法将

    不会解决这个问题。

    案例1-1中的Python程序k101.py就是采用最简单的顺序算法,依照

    先后顺序,根据不同收益率,依次调用策略计算函数sta001计算相关的

    总收益。

    读者仔细对比一下Excel与Python程序两个不同的分析过程,可以发

    现,其中的关键都是fv函数:

    d2=np.fv(k,nyear,-xd,-xd);

    fv为复利函数,看起来简单,其实具体编程非常复杂,这些现成函

    数读者知道如何调用就可以了。同样,量化分析的相关软件和算法原理

    都很专业,一般用户只需要知道如何使用相关的软件和工具就可以了。

    有趣的是,Excel与Python程序的复利函数不仅名称一样,而且连调

    用的参数、顺序都是一致的。

    所以笔者经常说,Pandas(潘达思)数据分析软件不过是Python版

    本的Excel报表而已,量化分析其实很简单,懂Excel就可以入门学习

    了。

    事实上,微软公司的Excel电子表格软件是世界上最流行的数据分

    析、量化分析工具之一。Excel可以完成各种专业的数据分析,提供

    BI(商业智能)功能,甚至还能够提供服务器的功能。

    不过,综合而言,专业的量化分析、数据分析使用Python语言和

    Pandas数据分析软件更加专业、简单和方便。

    目前,大数据领域已经公认:十亿以下的大数据项目,Pandas数据

    分析软件是首选的工程一线的处理方案。

    注意

    本节的案例“神奇公式”Python版本的脚本程序文件名为

    \zwpython\zw_k10\k101.py。

    在文件名“k101.py”中,字母k后的第一个字符1代表第1章的案

    例,即k101.py表示第1章的第一个Python案例程序。本书均采用这种

    命令方式,k2~k9表示第2~第9章的案例,kx表示第10章的案例。

    1.1.2 案例分析:Python图表

    5%、10%、15%、20%。

    我们采用四种不同的利率设置:

    年利率,看看不同的年利率最终对应的年收益是如何变化的。

    下面在程序k101.py中加入图表绘制语句,再通过参数设置不同的对应参数:0.05、0.10、0.15、0.20。

    脚本文件名为\zwpython\zw_k10\k101dr.py。

    脚本代码如下:

    -- coding: utf-8 --

    import numpy as np

    import scipy as sp

    import pandas as pd

    import matplotlib as mpl

    import matplotlib.pyplot as plt

    import seaborn as sns

    =======================

    mpl.style.use('seaborn-whitegrid');

    def sta001(k,nyear,xd):

    d2=np.fv(k,nyear,-xd,-xd);

    d2=round(d2)

    return d2

    =======================

    d40=1.440

    print(d40,40 x 1.4=,d40)

    d=sta001(0.05,40-1,1.4);

    print(01保守投资模式,,d,round(dd40))

    d2=sta001(0.20,40-1,1.4);

    print(02激进投资模式,,d2,round(d2d40))

    dk=round(d2d)

    print(dk,两者差别(xx倍):,dk)

    dx05=[sta001(0.05,x,1.4) for x in range(0,40)]

    dx10=[sta001(0.10,x,1.4) for x in range(0,40)]

    dx15=[sta001(0.15,x,1.4) for x in range(0,40)]

    dx20=[sta001(0.20,x,1.4) for x in range(0,40)]

    print(dx05)print(dx20)

    df=pd.DataFrame(columns=['dx05','dx10','dx15','dx20']);

    df['dx05']=dx05;df['dx10']=dx10;

    df['dx15']=dx15;df['dx20']=dx20;

    print

    print(df.tail)

    df.plot;

    运行结果如图1-3所示。

    图1-3 “神奇公式”收益图

    从图1-3可以看出,5%、10%、15%和20%的年利率对应的最终40年

    总收益分别是169万元、620万元、2491万元和10281万元。

    注意在图1-3中,图形上面的最后一行字符:

    39 169 620 2491 10281

    这行数字表示不同的年利率对应的最后一年的收益结果,其中第一

    个数字是39,它是index(索引),之所以是39,是因为第一年只有本

    金,没有利息收入,所以40年的总收益必须扣除第一年的收益,在复利

    公式中按39年来计算时间。

    1.1.3 matplotlib绘图模块库

    单纯的数据分析非常枯燥,大量的数据令读者很头疼,所以需要把

    数据图形化显示。

    可视化计算是量化分析、数据分析的一个重要组成部分,Python量

    化分析和数据分析最重要的绘图模块是matplotlib。

    matplotlib绘图模块是Python编程语言最著名的绘图模块库,类似于

    MATLAB和R语言,它提供了一整套和MATLAB相似的命令API,非常

    适合交互式的制图。

    matplotlib的官方网址是http:matplotlib.org。

    matplotlib绘图模块的文档相当完备,并且网站的Gallery页面中有上

    百幅缩略图,打开之后都有源程序。如果用户需要绘制某种类型的图,那么只需要在这个页面中浏览、复制、粘贴一下,基本上都能完成。

    在Python语言中,比较著名的绘图模块还有gnuplot和seaborn,不过

    语法与Python差别太大,通常使用不多。

    近年来,随着Python在大数据、金融量化方面的扩展,出现了许多

    新的绘图模块库,但matplotlib依然是最重要的Python绘图模块。

    matplotlib 2.0版本正在开发中,同时也出现了许多优秀的、第三方

    matplotlib扩展库,如Basemap、seaborn、mplot3D、ggplot、prettyplotlib

    和iTerm2。

    其中,seaborn和ggplot是统计绘图模块库和美化增强库:

    prettyplotlib模块库与数据分析、量化分析领域关联大,是用得较多的绘

    图模块库。

    这些绘图模块库在各自官方网站及Python网站的pyPI模块库下载中

    心都有下载。pyPI网址是https:pypi.python.orgpypi。

    Python常用的模块库如图1-4~图1-6所示。

    图1-4 seaborn绘图模块

    图1-5 prettyplotlib绘图模块

    图1-6 ggplot绘图模块

    matplotlib绘图模块库非常专业且庞大,有关的细节读者可慢慢研

    究,具体内容可浏览http:matplotlib.orgmpl_toolkitsindex.html。

    1.1.4 案例分析:style绘图风格

    下面介绍matplotlib模块库中的style绘图风格函数,它是与绘图效果

    关联最大的一个函数。

    脚本文件名为\zwpython\zw_k10\k101sty.py。

    全部代码如下:

    -- coding: utf-8 --

    import numpy as np

    import scipy as sp

    import pandas as pd

    import matplotlib as mpl

    import matplotlib.pyplot as plt

    import seaborn as sns

    import prettyplotlib

    import ggplot

    =======================

    mpl.style.use('seaborn-whitegrid');

    def sta001(k,nyear,xd):

    d2=np.fv(k,nyear,-xd,-xd);

    d2=round(d2)

    print(nyear,d2)

    return d2

    def dr_xtyp(_dat):

    xtyp=['bmh','dark_background','fivethirtyeight','ggplot', 'grayscale','default'];

    i=0;

    for xss in plt.style.available:

    plt.figure

    plt.style.use(xss);

    _dat.plot

    fss=tmp\\k101_+xss+.png;plt.savefig(fss);

    i+=1;

    print(i,xss,,,fss)

    plt.show

    =======================

    dx05=[sta001(0.05,x,1.4) for x in range(0,40)]

    dx10=[sta001(0.10,x,1.4) for x in range(0,40)]

    dx15=[sta001(0.15,x,1.4) for x in range(0,40)]

    dx20=[sta001(0.20,x,1.4) for x in range(0,40)]

    df=pd.DataFrame(columns=['dx05','dx10','dx15','dx20']);

    df['dx05']=dx05;df['dx10']=dx10;

    df['dx15']=dx15;df['dx20']=dx20;

    print(df.tail)

    dr_xtyp(df)

    这段代码中最重要的语句是:

    plt.style.use(xss);

    另外,还可以设置绘图风格。在Python中,内置的绘图风格有21

    种,包括bmh、classic、dark_background、fivethirtyeight、ggplot、grayscale、seaborn-bright、seaborn-colorblind、seaborn-dark、seaborn-

    darkgrid、seaborn-dark-palette、seaborn-deep、seaborn-muted、seaborn-

    notebook、seaborn-paper、seaborn-pastel、seaborn-poster、seaborn-talk、seaborn-ticks、seaborn-white和seaborn-whitegrid。

    其中,大部分是seaborn模块库引入的,运行后输出图保存

    在“tmp”目录下,具体效果如图1-7所示。

    图1-7 matplotlib的不同style参数效果图

    此外,在目录“x:\zwPython\zw_k10\pic\style\”中也有类似的效果图

    片。

    通常,style绘图参数一般使用seaborn-whitegrid,即白色网格。在导

    入模块库后和其他程序语句前,用matplotlib设置为全局风格,代码如

    下:

    mpl.style.use('seaborn-whitegrid');

    1.1.5 案例分析:colormap颜色表

    下面介绍颜色表colormap。

    脚本文件名为\zwpython\zw_k10\k101cmap.py,全部代码如下:

    -- coding: utf-8 --

    import numpy as np

    import scipy as sp

    import pandas as pd

    import matplotlib as mpl

    import matplotlib.pyplot as plt

    import seaborn as sns

    import prettyplotlib

    import ggplot

    =======================

    mpl.style.use('seaborn-whitegrid');

    def sta001(k,nyear,xd):

    d2=np.fv(k,nyear,-xd,-xd);

    d2=round(d2)

    return d2

    def dr_cmap(_dat):

    fss='cor_maps.csv'

    cm8 = pd.read_csv(fss,encoding='gbk')

    i=0;

    for xss in cm8['name']:

    plt.figure

    _dat.plot(colormap=xss)

    fss=tmp\\k101cor_+xss+.png;plt.savefig(fss);

    i+=1;print(i,xss,,,fss)

    plt.show

    =======================

    dx05=[sta001(0.05,x,1.4) for x in range(0,40)]

    dx10=[sta001(0.10,x,1.4) for x in range(0,40)]

    dx15=[sta001(0.15,x,1.4) for x in range(0,40)]

    dx20=[sta001(0.20,x,1.4) for x in range(0,40)]

    df=pd.DataFrame(columns=['dx05','dx10','dx15','dx20']);

    df['dx05']=dx05;df['dx10']=dx10;

    df['dx15']=dx15;df['dx20']=dx20;

    print(df.tail)

    dr_cmap(df)

    运行结果保存在“tmp”目录下。

    colormap设置语句如下:

    _dat.plot(colormap=xss)

    在plot语句中,颜色表用关键词“colormap”指定,通常内置的颜色

    表有数十种,具体数量随着matplotlib版本的不同及扩充模块的不同而有

    所差异。在笔者测试的版本中,colormap颜色表有76种,具体参见文件

    cor_map.csv,它在“\zwpython\doc\”目录下。

    此外,在目录“x:\zwPython\zw_k10\pic\cormap\”中也有相关的效果

    图片。

    因为线条图色彩效果表现不佳,因此在后面的条形图中再进行介

    绍。

    matplotlib不同的colormap颜色表参数效果图如图1-8所示。

    图1-8 matplotlib不同的colormap颜色表参数效果图1

    1.1.6 案例分析:颜色表关键词

    colormap颜色表可以使用预设的参数,也可以编写脚本来抓取系统

    内置的颜色表参数。

    脚本文件名为\zwpython\zw_k10\k101cmap2.py,示例代码如下:

    -- coding: utf-8 --

    import numpy as np

    import scipy as sp

    import pandas as pd

    import matplotlib as mpl

    import matplotlib.pyplot as plt

    import seaborn as sns

    import prettyplotlib

    import ggplot

    =======================

    mpl.style.use('seaborn-whitegrid');

    def sta001(k,nyear,xd):

    d2=np.fv(k,nyear,-xd,-xd);

    d2=round(d2)

    return d2

    =======================

    dx05=[sta001(0.05,x,1.4) for x in range(0,40)]

    dx10=[sta001(0.10,x,1.4) for x in range(0,40)]

    dx15=[sta001(0.15,x,1.4) for x in range(0,40)]

    dx20=[sta001(0.20,x,1.4) for x in range(0,40)]

    df=pd.DataFrame(columns=['dx05','dx10','dx15','dx20']);

    df['dx05']=dx05;df['dx10']=dx10;

    df['dx15']=dx15;df['dx20']=dx20;

    print(df.tail)

    df.plot(colormap='xss')

    df.plot(colormap='hot')

    运行结果如图1-9所示。

    图1-9 matplotlib不同的colormap颜色表参数效果图2

    下面修改一下代码:

    取消第40行前的“”注释符号;

    在第41行前加上“”注释符号。

    修改后,相关代码如图1-10所示。

    图1-10 colormap颜色表参数代码修改

    再次运行,因为“xss”是错误的颜色代码,因此运行出错,提示信息

    如图1-11所示。

    图1-11 错误colormap颜色表参数运行截图

    复制“Possible values are:”后面的文字到记事本或UltraEdit编辑软件

    (推荐用UltraEdit软件编辑文本)。

    把文字里的“,”(逗号)替换成“回车换行”符号,即可获得系统内置

    的可用colormap颜色列表。

    需要注意的是,在文件cor_map.csv中只收录了正序的colormap颜色

    关键词。在关键词后面加上“_r”就可以组成同色系的、反序颜色表关键

    词,如Blues与Blues_r。

    1.1.7 深入浅出

    Python绘图风格函数;

    Python图表绘制;

    神奇公式的Python编程分析;

    神奇公式的Excel量化分析;

    趣味理财学之“神奇公式”;

    下面对1.1节的内容进行小结,1.1节主要讲述了以下内容:Python颜色表colormap;

    Python颜色表关键词。

    通常,讲到“神奇公式”的Python编程分析本节就可以结束了。但

    是,我们通过这个最简单的编程案例逐步深入,进一步学习了相关的

    Python绘图、style绘图风格、colormap颜色表等多种实战技巧。

    授之以鱼,不如授之以渔。

    做学问,其实很简单,把简单的问题复杂化,从多个不同的角度不

    断分析、深入,明白了原理、掌握了逻辑,就知道如何把复杂的问题简

    单化,从最简单、最直接的角度入手解决问题。笔者希望把这种学习的

    方法传授给读者。

    学会了这种由浅入深、化繁为简的学习方法后,读者在面对各种新

    的领域、新的课题时就会知道如何把握全局、掌控方向。

    1.2 股市“一月效应”

    1.2.1 案例1-2:股市“一月效应”

    最初出现“一月效应”的国家是美国,后来其他国家的学者也陆续发

    在传统股市,每逢进入新一年的一月,股市总是升的多、跌的少。

    会呈现负值。

    是“正数”,而且会比其他月份高,而在十二月,股市的回报率很多时候

    “一月效应”是从统计学角度分析股市,发现一月份的回报率往往现“一月效应”存在于其他股市中。

    对于“一月效应”的出现,学者认为这与美国“资本增值税”的税务安

    排、员工年终奖及美国年尾的重要假期(感恩节、圣诞节、元旦)有很

    大关系。

    我国因为农历春节,通常“一月效应”会延后,大多在农历新年前

    后,即二月左右。

    笔者挑选一些经典的传统投资策略进行具体的量化分析。“一月效

    应”从量化投资角度而言,就是一种投资策略。

    不过,这种投资策略到底效果如何,我们可以通过Python编程进行

    具体的量化分析。

    “一月效应”有两段示例代码:

    k102m1.py文件,用于计算美国股票、中国A股的全部股票,以

    及多种指数成分股的相关数据;

    k102m1dr.py文件,根据计算数据,绘制相关的结果图片。

    由于是Python量化编程,所以我们不仅计算一月的升跌情况,还计

    算了其他各月的升跌情况。

    本书采用的股票代码表源自zwDat股票数据包zwDat\inx。各文件含

    义如下。

    (1)中国股票数据。

    inx_code.csv,中国A股大盘及各种指数代码。

    stk_base.csv,中国A股2810只股票代码公司概况。

    stk_code.csv,中国A股2810只股票代码。

    stk_hs300.csv,中国沪深300指数股票代码。

    stk_sz50.csv,中国上证50指数股票代码。

    stk_zz500.csv,中国中证500指数股票代码。

    (2)美国股票数据。

    inxYahoo.csv,全部6688只美股代码。

    inxYahoo30sp.csv,道琼斯30指数美股代码。

    inxYahoo100ns.csv,纳斯达克100指数美股代码。

    inxYahoo100sp.csv,道琼斯100工业指数美股代码。

    inxYahoo500sp.csv,道琼斯30指数美股代码。

    inxYahoo600.csv,量化常用美股600股票代码。

    1.2.2 案例分析:“一月效应”计算

    相关脚本文件名为\zwpython\zw_k10\k102m1.py。

    全部代码如下:

    -- coding: utf-8 --

    import sys

    import pandas as pd

    import numpy as np

    import zwSys as zw ::zwQT

    import zwTools

    ----------code

    def zw_anz_m1sub(xcod,rss,kstr):

    fss=rss+xcod+.csv;print(fss)

    nSum=0;nAdd=0;nDec=0;

    knum=int(kstr);knum2=knum+1;

    try:

    df = pd.read_csv(fss,index_col=0,parse_dates=[0],encoding= 'gbk')

    df =df.rename(columns={'Close':'close'});df =df.sort_index;

    _tim0=df.index[0];_ynum0=_tim0.year;

    _tim9=df.index[-1];_ynum9=_tim9.year+1;

    for ynum in range(_ynum0,_ynum9):

    ystr=str(ynum);_tim1x='-1';

    ystr2=ystr+-+kstr; print(ystr2,len(df),knum)

    if knum==12:

    ystr3=ystr+-+kstr+'-31';

    df2=df[(df.index>=ystr2)(df.index<=ystr3)];

    else:

    kstr2=str(knum2);

    if knum2<10:kstr2='0'+kstr2;

    ystr3=ystr+-+kstr2+'-01';

    df2=df[(df.index>=ystr2)(df.index
    print(ystr2,ystr3,len(df2))

    if (len(df2)>0):

    _tim1x=str(df2.index[0].month);

    if (len(_tim1x)<2):_tim1x='0'+_tim1x;

    if (_tim1x==kstr):

    df1=df2[ystr2];

    if (len(df1)>0):

    xd1a=df1.ix[0];xd1z=df1.ix[-1];nSum+=1;

    vd1a=xd1a['close'];vd1z=xd1z['close'];

    if (vd1z>vd1a):nAdd+=1

    else:nDec+=1;

    except IOError:

    pass; skip,error

    print('nSum,nAdd,nDec,',nSum,nAdd,nDec);

    return nSum,nAdd,nDec

    def zw_stk_anz_m01(qx,finx0,rss,ksgn):

    fss = qx.rdatInx+finx0+.csv; stk_code.csv,inxYahoo.csv

    dinx = pd.read_csv(fss,encoding='gbk')

    mx1={};mx1['finx']=finx0;mx1['ksgn']=ksgn;

    mx1['nSum']=0;mx1['nAdd']=0;mx1['nDec']=0;

    nSum=0;nAdd=0;nDec=0;

    i=0;xn9=len(dinx['code']);mx1['nstk']=xn9;

    for xcod in dinx['code']:

    i+=1;

    if (not isinstance(xcod,str)):xcod=%06d %xcod;

    dSum,dAdd,dDec=zw_anz_m1sub(xcod,rss,ksgn);

    mx1['nSum']=mx1['nSum']+dSum;

    mx1['nAdd']=mx1['nAdd']+dAdd;

    mx1['nDec']=mx1['nDec']+dDec;

    print(i,'',xn9,mx1);

    mx1['kAdd']=np.round(mx1['nAdd']100 mx1['nSum']);

    mx1['kDec']=np.round(mx1['nDec']100 mx1['nSum']);

    return mx1

    def zw_stk_anz_mx(qx,finx0,rss):

    c10=[finx,ksgn,nstk,'nSum','nAdd','nDec','kAdd','kDec'];

    df=pd.DataFrame(columns=c10);

    ftg=tmp\\mx_+finx0+.csv;print(ftg)

    for i in range(12):

    ksgn=str(i+1);

    if i<9:ksgn='0'+ksgn;

    print(ksgn)

    mx1=zw_stk_anz_m01(qx,finx0,rss,ksgn);

    ds1=pd.Series(mx1,index=c10);

    ds2=ds1.T;

    df=df.append(ds2,ignore_index=True);

    df.to_csv(ftg,index=False,encode='utf8');

    def zw_stk_anz_mx_all(qx,xlst):

    for fx in xlst:

    if (fx.find('Yah')>0):

    rss=qx.rZWusDay

    else:

    if (fx=='inx_code'):rss=qx.rZWcnXDay

    else:rss=qx.rZWcnDay

    finx0=fx;

    zw_stk_anz_mx(qx,finx0,rss);

    ============main

    qx=zw.zwDatX(zw._rdatCN);

    uslst=['inxYahoo30sp','inxYahoo100ns','inxYahoo100sp','inxYahoo600','inxYahoo500sp','inxYahoo']

    zw_stk_anz_mx_all(qx,uslst)

    cnlst=['inx_code','stk_sz50','stk_hs300','stk_zz500','stk_code','stk_code'];

    zw_stk_anz_mx_all(qx,cnlst)

    运行后,会在“zw_k10\tmp”目录下根据相应的股票代码文件名,生成对应的输出数据文件,全部是CSV格式。

    为方便分析,我们缩短相关文件名,并复制到dat目录

    下“\zwpython\zw_k10\dat\”。

    案例1-2,“一月效应”代码较长,为了便于初学者学习,我们将对

    关键代码,添加流程图,进行说明。

    案例1-2程序代码,可分为三大模块:

    文件头:import模块库库文件导入

    函数定义:定义相关的函数

    主控程序:注解main后面的语句

    我们先看看案例1-2的主程序部分代码:

    ============main

    qx=zw.zwDatX(zw._rdatCN);

    uslst=['inxYahoo30sp','inxYahoo100ns','inxYahoo100sp','inxYahoo600','inxYahoo500sp','inxYahoo']

    zw_stk_anz_mx_all(qx,uslst)

    cnlst=['inx_code','stk_sz50','stk_hs300','stk_zz500','stk_code','stk_code'];

    zw_stk_anz_mx_all(qx,cnlst)

    如图1-12所示为主程序流程图,主程序很简单:

    初始化变量qx

    先设置美股股票代码索引文件参数变量uslst,调用分析函数:

    zw_stk_anz_mx_all

    设置中国A股股票代码索引文件参数变量cnlst,调用分析函数

    zw_stk_anz_mx_all

    图1-12 流程图

    案例1-2,“一月效应”的关键数据变量df,在函数zw_stk_anz_mx定

    义中:

    def zw_stk_anz_mx(qx,finx0,rss):

    c10=[finx,ksgn,nstk,'nSum','nAdd','nDec','kAdd','kDec'];

    df=pd.DataFrame(columns=c10);

    这里预定义变量df使用的是Pandas(潘达思)数据分析模块库中的

    DataFrame类型变量,而不是用传统的Python语言内置list(列表)类型

    变量。这样做是为了便于使用Pandas作为统一的数据格式,以及方便追

    加新的数据,代码如下:

    ds1=pd.Series(mx1,index=c10);

    ds2=ds1.T;

    df=df.append(ds2,ignore_index=True);

    同样,在下面的函数zw_stk_anz_m01中,技巧性地使用了“字典”这

    种数据格式作为数据变量,而不是直接使用传统的简单变量。因为

    Pandas数据分析模块库中的DataFrame、Series数据格式预设的就是字典

    模式。在量化程序中,变量使用字典模式,在与Pandas耦合方面会方便

    很多。其他有关细节,在后续相关章节将结合具体的图表进行讲解。

    def zw_stk_anz_m01(qx,finx0,rss,ksgn):

    mx1={};mx1['finx']=finx0;mx1['ksgn']=ksgn;

    mx1['nSum']=0;mx1['nAdd']=0;mx1['nDec']=0;

    1.2.3 案例分析:“一月效应”图表分

    析

    大家参看脚本文件:\zwpython\zw_k10\k102m1dr.py。

    有关代码与案例1-2类似,只是增加了图表输出代码,具体代码请在本节源码文件中,请注意下面的语句:

    df2.plot(kind='bar',colormap='hot',rot=0,figsize=(20,5));

    代码运行结果如图1-13所示。因为运行图较长,所以在plot绘图语

    句中特意使用了以下设置:

    图1-13 股市“一月效应”运行结果

    figsize=(20,5),把图像尺寸设置为长方形;

    用rot=0把坐标显示出来,设置为无旋转;

    colormap='hot',使色彩分隔明显。

    此外,我们还使用了以下语句:

    plt.legend(ncol=3,loc=2),图标采用3列模式,位置是左上角;

    plt.tight_layout,紧缩四周空白,扩大绘图面积。

    另外,请注意,为方便分析,我们缩短相关文件名,并复制到dat

    目录下“F:\zwPython\zw_k10\dat\”。

    在图1-13中,上半部分为“一月效应”中国A股分析结果,下半部分

    为“一月效应”美股分析结果。

    “一月效应”中国A股数据表如图1-14所示,对应的数据文件为

    \zwpython\ zw_k10\dat\mx_cn.csv。

    图1-14 “一月效应”中国A股数据表

    由图1-13和图1-14可以看出,“一月效应”因为农历春节的影响具有

    滞后效果,到二月份,60%~70%的股票都是上涨的(二月)

    另外,从图1-14中可以看出,inxCN混合指数的股票,在五月、九

    月、十一月三个月份也是上涨的,关联度远远高于传统的“一月效应”。

    可能是五一、国庆、元旦假期的黄金周效应,读者可以进一步研究分

    析。股票分析结果也是70%~80%为正收益,这是一个新策略,可以称

    为“A股黄金周策略”。

    传统的算法、建模过程也和这个流程类似。对相关数据进行统计分

    析、数据挖掘,然后对高于K值的算法、框架进行验证整理和回溯测

    试,从而成为实战当中的操盘策略。

    本节的案例分析因为是入门课程,所以只考虑了上涨和下跌两种情

    况,具体的上涨和下跌幅度没有考虑。在实际建模时,必须考虑这些因

    素,并且对相关指数对应的股票进行迭代分析,计算多个时间周期的盈

    利率。

    若股票90%是上涨的,10%是下跌的,但90%的上涨幅度之和低于

    10%的下跌幅度之和,那么总收益还是负的。

    “一月效应”美股数据表如图1-15所示,对应的数据文件为

    \zwpython\zw_k10\dat\mx_us.csv。

    图1-15 股市“一月效应”美股数据表

    从图1-15中可以看出,美股“一月效应”最强的是十二月份,可能和

    圣诞假期有关系。

    从以上数据分析图表我们可以看出,“一月效应”的确存在,但并非

    指的就是“一月”,而是“二月”(中国A股)与“十二月”(美股)。

    通过不同的指数组合可以发现,大企业等蓝筹股的“一月效应”更加

    明显,中小企业创业板股票相对较弱。

    因此,对于各种投资策略绝对不能生搬硬套,要具体分析,根据实

    际分析的结果进行决策。

    1.2.4 案例分析:颜色表效果图

    本节代码请参看脚本文件\zwpython\zw_k10\k102m1cmap.py。

    本节程序源码,在函数dr_cmap中,增加了一行绘图语句:

    plt.axhline(50, color='r');

    上面的绘图语句是在Y轴数值为50的地方绘制一条红色分割线表示

    中线。

    本节案例使用colormap表现较弱,因此使用柱形图来展现相关效

    果,部分运行效果如图1-16所示。

    在图1-16中,可以挑选自己喜欢的颜色风格。

    图1-16 股市“一月效应”柱形图效果

    此外,在目录“x:\zwPython\zw_k10\pic\cormap”中也有相关的效果图

    片。

    常用的颜色表有Accent、brg、coolwarm、Dark2、rainrow、gnuplot、hot、hsv、jet、prism、raibow和Set1。

    1.2.5 “一月效应”全文注解版Python

    源码

    “一月效应”全文注解版Python源码是笔者举办的“量化培训班”学员

    (昵称:“我怎能不戏猫”)在课件源码的基础上,根据自己的学习过程

    所做的修改。

    这个全文注解版本几乎对每一行的代码都进行了详细的中文解释。

    这种注解版本非常少见,不但对Python量化初学者,而且对普通

    Python入门读者都有很高的参考价值,故收录于此。

    脚本文件名为\zwpython\zw_k10\k102m1_note.py。

    代码如下:

    -- coding: utf-8 --

    zw量化开源团队

    中文注释“我怎能不戏猫”(QQ: 316894075)

    import sys

    import pandas as pd

    import numpy as np

    import zwSys as zw ::zwQT

    import zwTools as zwt

    ----------code

    def zw_anz_m1sub(xcod,rss,monStr):kstr表示月份

    fss=rss+xcod+.csv;print(fss) 文件名

    nSum,nAdd,nDec=0,0,0 输入的月份数,其中上升的月份,其中下跌的月份

    kmon=int(monStr); 当前月 print('@m1sub',kstr,fss)

    try:

    df = pd.read_csv(fss,index_col=0,parse_dates=[0],encoding= 'utf-8') 读取文件,csv使用gbk编码

    df =df.rename(columns={'Close':'close'});df =df.sort_index; 重命名close列;按指数(年月日)重新排序

    _tim0=df.index[0];_ynum0=_tim0.year; 解释时间模式,yymmdd,这里提取了第一年

    _tim9=df.index[-1];_ynum9=_tim9.year+1; 最后一年+1

    print('@t',_tim0,_tim9)

    for ynum in range(_ynum0,_ynum9): 遍历所有年份

    ystr=str(ynum);last_day=zwt.lastDay(ynum,kmon);年份,每月最后一天的日期

    dayStr='%02d'%last_day

    monStr1=''.join([ystr,'-',monStr,'-1']) 当前月的第一天

    monStr9=''.join([ystr,'-',monStr,'-',dayStr])当前月的最后一天

    df2=df[(df.index>=monStr1)(df.index<=monStr9)]; 选取当前月1号到月底之间的数据

    print('@y',ystr1,ystr9,ystr,len(df2))

    if (len(df2)>0): 若存在交易日(处理月份用)

    _kmon5='%02d' %df2.index[0].month; 选取交易日期中的月份并转为string

    if (_kmon5==monStr): 若上述月份为函数输入的变量

    xd1a=df2.ix[0];xd1z=df2.ix[-1];nSum+=1; 交易月份+1

    vd1a=xd1a['close'];vd1z=xd1z['close']; 选取收盘价位

    if (vd1z>vd1a):nAdd+=1 比较收盘价位,判定升跌

    else:nDec+=1;

    except IOError:

    pass; skip,error

    print('nSum,nAdd,nDec,',nSum,nAdd,nDec);

    return nSum,nAdd,nDec 返回值为交易月份数量,上升,下跌

    def zw_stk_anz_m01(qx,finx0,rss,ksgn): 对每只股票运算上一个函数

    fss = qx.rdatInx+finx0+.csv; stk_code.csv,inxYahoo.csv

    print('f',fss)

    dinx = pd.read_csv(fss,encoding='utf-8') 读取CSV文件

    print(dinx.head)

    print('f2',fss)

    mx1={};mx1['finx']=finx0;mx1['ksgn']=ksgn;

    mx1['nSum']=0;mx1['nAdd']=0;mx1['nDec']=0;字典,赋值

    nSum=0;nAdd=0;nDec=0;

    xn9=len(dinx['code']);mx1['nstk']=xn9; 所读取的CSV文件的行数(code列的长度)

    遍历CSV文件中的code名,i 是计数器变量

    for i,xcod in enumerate(dinx['code']):

    if (not isinstance(xcod,str)):xcod=%06d %xcod;

    dSum,dAdd,dDec=zw_anz_m1sub(xcod,rss,ksgn);

    mx1['nSum']=mx1['nSum']+dSum;

    mx1['nAdd']=mx1['nAdd']+dAdd;

    mx1['nDec']=mx1['nDec']+dDec;

    print(i,'',xn9,xcod,mx1);

    print('xn9',xn9) ; print(len(mx1['nAdd']))

    mx1['kAdd']=np.round(mx1['nAdd']100 mx1['nSum']); 指数上升频率(估计概率)

    mx1['kDec']=np.round(mx1['nDec']100 mx1['nSum']); 指数下降频率(估计概率)

    return mx1

    def zw_stk_anz_mx(qx,finx0,rss): 生成一个CSV文件

    c10=[finx,ksgn,nstk,'nSum','nAdd','nDec','kAdd','kDec']; CSV文件的第一列

    df=pd.DataFrame(columns=c10); 定义dataframe

    ftg=tmp\\mx_+finx0+.csv;print(ftg) 打印CSV文件名

    for i in range(12):

    ksgn=%02d %(i+1);

    ksgn=str(i+1);if i<9:ksgn='0'+ksgn; 1到12月

    print(ksgn)

    mx1=zw_stk_anz_m01(qx,finx0,rss,ksgn); 利用上一个函数生成dataframe

    ds1=pd.Series(mx1,index=c10); 生成一个pandas中的series

    ds2=ds1.T; .T=转置(矩阵转置)

    df=df.append(ds2,ignore_index=True);在df中加上ds2

    df.to_csv(ftg,index=False,encode='utf8'); 保存为CSV文件,utf8编码

    def zw_stk_anz_mx_all(qx,xlst): 遍历指定list中的股票

    for fx in xlst:

    if (fx.find('Yah')>0):

    rss=qx.rZWusDay

    rss=qx.rdat+'\\us\\day\\'

    else:

    if (fx=='inx_code'):rss=qx.rdat+'\\cn\\xday\\' rss=qx. rZWcnXDay

    else:rss=qx.rdat+'\\cn\\day\\' rss=qx.rZWcnDay

    finx0=fx; 生成文件名

    zw_stk_anz_mx(qx,finx0,rss); 用上一个函数生成CSV文件

    ============main

    qx=zw.zwDatX(zw._rdat0);

    uslst=['inxYahoo30sp','inxYahoo100ns','inxYahoo100sp','inxYahoo600','inxYahoo500sp','inxYahoo']

    zw_stk_anz_mx_all(qx,uslst)

    cnlst=['inx_code','stk_sz50','stk_hs300','stk_zz500','stk_code','stk_code'];

    zw_stk_anz_mx_all(qx,cnlst)

    案例“一月效应”主程序很简单,如图1-17所示为主程序流程图。

    图1-17 主控程序流程图

    初始化变量qx

    先设置美股股票代码索引文件参数变量uslst,调用分析函数:

    zw_stk_anz_mx_all

    设置中国A股股票代码索引文件参数变量cnlst,调用分析函数

    zw_stk_anz_mx_all

    案例“一月效应”,重点在于几个自定义函数:

    zw_stk_anz_mx_all(qx,xlst):遍历指定xlst中的股票

    zw_stk_anz_mx(qx,finx0,rss):根据finx0股票指数文件,统计分析

    12个月各个月的具体数据

    zw_stk_anz_m01(qx,finx0,rss,ksgn):根据finx0股票指数文件,分

    析单个月的数据

    zw_anz_m1sub(xcod,rss,kstr):根据xcod具体股票代码,分析单只

    股票单个月的数据

    为了便于初学者学习,我们分别绘出以上几个函数的流程图。

    函数zw_stk_anz_mx_all(qx,xlst),遍历指定xlst中的股票,流程图如

    图1-18所示。

    图1-18 函数zw_stk_anz_mx_all流程图

    函数zw_stk_anz_mx(qx,finx0,rss),根据finx0股票指数文件,统计分

    析12个月各个月的具体数据,流程图如图1-19所示。

    图1-19 函数zw_stk_anz_mx流程图

    函数zw_stk_anz_m01(qx,finx0,rss,ksgn),根据finx0股票指数文件,分析单个月的数据,流程图如图1-20所示。

    图1-20 函数zw_stk_anz_m01流程图

    函数zw_anz_m1sub(xcod,rss,kstr),根据xcod具体股票代码,分析单

    只股票单个月的数据,因为这个函数比较复杂,我们进行了简化,流程

    图如图1-21所示。

    图1-21 函数zw_anz_m1sub流程图

    1.2.6 大数据·宏分析

    “一月效应”图表分析;

    “一月效应”量化分析;

    股票指数代码表;

    股市“一月效应”;

    下面对1.2节的内容进行小结,本节主要讲解了以下内容:颜色表效果图;

    “一月效应”全文注解版。

    从“一月效应”数据分析图表中我们可以看出,“一月效应”的确存

    在,但并非指的就是“一月”,而是“二月”(中国A股)与“十二月”(美

    股)。

    因此,对于各种投资策略绝对不能生搬硬套,要具体分析,根据实

    际分析结果进行决策。

    笔者在新浪博客《大数据·实战个例“宏”分析》中,有过专门阐

    述,博客截图如图1-22所示。

    对于Python量化,全世界都是零起点,都处于起步阶段。在这个阶

    “尽信书,不如无书。”

    图1-22 《大数据·实战个例“宏”分析》博客截图段,读者要充分发挥自己的主观能动性,任何权威、专家在最终的数据

    结果面前都是乏力的。

    更何况,对于Python量化,目前整个行业没有任何权威。现在比的

    是大局观,看谁的方向更正确;比的是速度,看谁的动作更快,最终把

    传统的投资策略应用到Python量化框架中。

    1.3 量化交易流程与概念

    1.3.1 数据分析I2O流程

    前面通过几个具体的案例讲述了量化分析的基本形态,下面介绍一

    些相关的基本概念。

    对于量化,大部分行业教程和软件系统的名称都是量化交易。

    IT行业和数据分析领域传统的流程划分模式如图1-23所示。

    “O”是输出,同样,这个输出不仅是输出数据,也可以是输出相关

    求或者计算机的输入设备。

    其中,“I”是输入,这个输入不仅是输入数据,也可以是用户的需

    这个流程套用目前流行的网络名词,我们称之为I2O模式。

    图1-23 I2O模式流程图的作品,或者是电脑的显示器、打印机。

    “2”是“to”的谐音字符,在I2O模式中,最重要的环节就

    是“2”(to),即分析处理,类似计算机的CPU。

    I2O模式不仅适用于IT行业和数据分析,实际上大部分行业和日常

    工作都可以采用。

    对于量化交易而言,其中的“I”就是数据采集,TuShare数据抓取模

    块和pandas数据分析模块的IO模块都是处理金融数据抓取的。

    量化交易中的环节“O”就是trade(交易),即下单环节。

    PyAlgoTrade等量化软件都有专门的模块处理trade(交易)事务。

    量化交易中的环节“2”(to)就是量化分析、Strategy(策略)分

    析,是其中最重要的环节。

    Strategy(策略)是量化交易的核心,也是一切交易的核心。

    量化的核心是策略分析,就是通过分析金融数据评估各种交易模

    型,建立各种交易策略。

    策略分析相当于计算机的CPU、汽车的发动机。有了好的策略,就

    像美剧《疑犯追踪》中的计算机,哪怕只是提供一个社保号码,剩下的

    环节即使采用最古老的人工模式,也足以完成全部的交易过程。

    对于大型金融机构而言,Strategy(策略)和Trade(交易)分离的

    好处就是保密,防止企业的核心商业机密和交易策略泄露。

    1.3.2 量化交易不是高频交易、自动

    交易

    很多人一谈到量化交易,认为就是程序化交易,计算机自动下单,这种观点其实是错误的。事实上,除了以秒、毫秒计算的高频交易,一

    般的日内交易,甚至基于5分钟、15分钟等“分时数据”的中高频交易,都可以采用人工下单的模式。

    量化交易与高频交易、程序化(自动)交易是完全不同的概念,但

    是初学者经常混淆。

    量化交易的核心是策略分析,通过对历史数据、实时数据的分析,选择最佳的交易股票(期货、外汇等金融产品)的品种,以及交易(买

    进、卖出)的时间点,也就是传统的择股交易与择时交易。

    高频交易是指从那些人们无法利用的、极为短暂的市场变化中寻求

    获利的计算机化交易。例如,某种证券买入价和卖出价差价的微小变

    化,或者某只股票在不同交易所之间的微小价差。

    自动交易起源于美国1975年出现的“股票组合转让与交易”,随着技

    术的发展和计算机系统的应用,投资经理、经纪人可以实现股票组合的

    一次性买卖交易;20世纪80年代后被广泛应用于期货期权交易。

    自动交易软件就是让计算机按照用户事先设定好的条件自动交易,当然赢亏结果取决于用户的交易计划设计得好坏。

    这样,投资者就不用把主要精力与时间放在人工盯盘与手动操作

    上,可以有充分的时间不断完善自己的交易计划,然后让计算机自动执

    行。

    金融市场的核心还是策略(Strategy),有了优秀的策略,至于使

    用什么方式下单,如计算机自动下单、人工下单,甚至电话委托、手机

    APP下单,只是流程问题。

    不想每天人工下单,自己加一个自动下单的模块就可以。我国因为

    政策限制,程序化交易API目前还没有开放,因此很多人采用外挂模

    式。

    读者可以在运行回溯分析程序后,根据自己设定的交易策略,筛选

    出股票(期货)品种代码,以及买进和卖出的数量,编写“数据交换文

    件”,再运行交易模块,按照“数据交换文件”里面的股票(期货)代码

    和交易数量,由计算机替代人工完成下单的操作。

    以zwQuant量化软件为例,自动交易模块可以加在回溯函数之后,也可以是独立的交易模块。

    1.3.3 小资、小白、韭菜

    依据假设,“一月效应”的确是一个正确的投资策略。小资、小白使

    下,可以假设盈利率与上涨率是正相关的。

    以“一月效应”为例,虽然没有计算具体的盈利率,不过一般情况

    菜的命”。

    在网络公开课中,笔者曾经说过:“小资、小白做股票,往往是韭用“一月效应”投资策略,往往只看到“一月效应”的表象,于是在一月初

    重仓“扫货”,到了月底“出货”。

    但是,根据图1-14和图1-15两张数据表可以看出:

    一月美股上涨的平均概率在51%左右;

    一月中国A股上涨的概率在45%左右,混合指数股上涨的概率更

    是低至33%。

    如果像小资、小白一样只看表面投资,那么这样投资操盘无疑是亏

    损的。

    1.3.4 专业与业余

    职业化只是第一步,只是入门。常言道,“师傅领进门,修行在个

    了解行业背景知识。

    件、zwDat股票数据包);

    熟悉本行业专业的软件工具和配套资源(例如zwQuant量化软

    了解行业的游戏规则;

    要做到职业化,通常需要做到以下三点:

    职业化素质。

    读者学习量化,也是希望尽快成为量化行业的赢家,这就需要具有

    家才是赢家。

    小资、小白做股票亏损居多,因为他们不专业。任何行业,只有专人”,说的也是这个道理。

    真正的赢家,必须是专家,超出职业化、专业化这两个阶段。要成

    为赢家,就必须采用比行业平均更高的水准来要求自己。

    以zwPython开发平台为例,笔者曾经说过,zwPython是按工业级的

    标准制作的,可以直接应用到生产环境。这句话是什么意思呢?

    做过IT企业CTO(技术总监)的人都知道,工业级的标准就是系统

    可以承受每天24小时、每周7天不间断的连续工作。

    在本书的创作过程中,几次批量下载A股数据,都近似24小时的压

    力测试,以及长达10天的中国A股历年的tick数据包下载,zwPython开

    发平台每次都顺利通过了,完全通过了7×24的实战测试。

    zwDat股票数据包是目前行业较为专业的日线数据包,之所以这么

    说,原因如下。

    地区覆盖广:同时包含了中国A股、美股纽约交易所、纳斯达克

    日线数据,未来还会增加中国香港、日本、欧洲等国家和地区的

    股票数据。

    时间跨度大:中国A股是从1994年开市起收集的,美股是从1962

    年有数字化档案开始收集的。

    品种全:基本上收录了全市场所有的活跃股票交易数据。

    未来,如果找到合适的免费数据源API,zwDat股票数据包会扩展

    到期货、外汇领域,升级为zwDat金融数据包。

    zwDat股票数据包比传统的股票数据包更加专业。

    即使是现在,只有中国A股、美股份个历史数据的情况下,我们也

    能完成一些超出目前行业标准的工作。

    以“一月效应”为例,“一月效应”其实是一个最简单的Backtest(回

    溯)测试。

    在前面的章节中,把项目扩展到12个月的测试,绘出最终的结果

    图,省略了中间的回溯曲线图,如图1-24所示。

    图1-24 “一月效应”统计图

    本书第2章将会介绍一个完整的SMA(简单均线)量化策略,这个

    量化策略源自PyAlgoTrade(简称PAT,读者群、网盘共享有中文手

    册,读者可以自行下载)。

    如图1-25所示是SMA策略收益回溯图。

    图1-25 SMA策略收益回溯图

    如图1-26所示是目前量化行业标准的SMA策略收益回溯图,很多在

    线量化平台也是这种模式,其中的技术细节在后面的章节会具体介绍。

    图1-26 量化行业标准的SMA策略收益回溯图

    这种回溯测试只是单一周期、单一地区的回溯测试。zwQaunt量化

    分析软件因为只做策略模块,所以对于策略的回溯测试,一开始要求就

    比行业标准更高。

    zwQuant量化分析软件采用的是MMM模式,是多周期、多地区、多频率的回溯测试,即Mul-Mul-Mul Backtest。

    这种MMM模式部分源自笔者多年数据分析的实盘测试经验。

    zwDat股票数据包有中国A股、美股两份数据,对跨区域的测试进

    行对比分析,已经有足够多的数据源支持。这种跨区域的测试,我们

    在“一月效应”里面已经使用过,增加其他地区的数据源后,这种跨区域

    的对比测试会更加强大。

    相对滞后的是多频率回溯测试,就是对不同频率的分时数据进行回

    溯测试,包括1分钟线、5分钟线、15分钟线、30分钟线和60分钟线等。

    目前,国内分时数据开放的API很少,而且分时数据的数据量太

    大,1分钟线的日数据量一般是10000组,是单只股票历年数据的3~5倍

    (2000~5000组)。

    这部分的工作必须使用GPU工作站或者其他超算设备配合专业的实

    时tick数据源才能启动。

    跨周期测试相对简单,对于前面两张回溯图:

    如图1-25所示是PAT的演示截图,是2000年的单年回溯测试;

    如图1-26所示是某个量化平台的截图,是2012~2016年的多年回

    溯测试。

    不管是一年回溯测试,还是多年回溯测试,都只有一个时间测试周

    期。zwQuant量化分析软件采用的是多周期测试模式,每年一个测试轮

    回,以及n-1年一个测试轮回。

    这种多周期测试,可以充分考察策略的稳定性,而稳定性是量化投

    资最重要的考量标准之一。

    从图1-26所示的多年回溯测试截图中我们可以看出:同样的一个策

    略,2014年以前曲线是平坦的,收益也是不高的;到了2015年,变化猛

    然增大,7月前快速增长,7月后急速下跌。不管这个策略收益如何,在

    稳定性方面绝对是需要进一步调整和优化的。

    1.4 用户运行环境配置

    本节主要讲解zwPython和zwDat的配置、应用流程方面的知识。

    本书所有案例程序均采用纯Python语言开发,除特别指明外,默认

    使用Python 3语法,均经过zwPython平台测试。

    图1-27 zwPython用户手册封面

    zwPython是极宽公司推出的一个Python集成版本,功能强大,内置

    了数百种专业的Python模块库;无须安装,解压即用。有关zwPython的

    使用,可参考本书附录A。

    本书所有案例程序可用于各种支持Python 3的设备平台,包括Linux

    操作系统、Mac苹果电脑,以及安卓系统,甚至树莓派。

    其他非zwPython用户运行本书程序,如果出现问题,通常是缺少有

    关的Python模块库,可以根据调试信息安装相关的Python模块库,再运

    行相关程序。

    限于篇幅,关于Python语言和pandas数据分析软件的基本操作,请

    读者查看有关图书。

    1.4.1 程序目录结构

    本书配套程序的工作目录是zwPython\zw_k10,这个目录也是默认

    的工作目录,凡是没有标注目录的脚本文件,一般都位于该目录。

    有关的程序会定时在读者群发布更新,请读者及时下载。

    zwPython目录结构如图1-28所示。

    图1-28 zwPython目录结构

    相比普通的Python版本,如图1-28所示的zwPython目录中多了一个

    zw_k10目录。

    zw_k10目录收录的是相关培训课程的配套代码和所需数据。

    zw_k10目录也可以复制到其他目录,建议放到zwPython根目录下。

    zwPython目录结构中的其他子目录如下。

    \zwPython\doc\:用户文档中心,包括用户手册和部分中文版的

    模块库资料,如fontforge、opencv和部分字王字库方面的文档。

    \zwPython\py27\:Python 2.7版本系统目录,除增加、删除模块库

    外,一般不需要改动本目录下的文件,以免出错。

    \zwPython\py35\:Python 3.5版本系统目录,除增加、删除模块库

    外,一般不需要改动本目录下的文件,以免出错。

    \zwPython\demo\:示例脚本源码,包括opencv、pygame游戏设

    计、Pandas大数据分析、zw字王等相关的示例脚本源码。

    \zwPython\zwrk\:zw工作目录,用户编写的脚本代码文件建议放

    在本目录下。

    \zwPython\zwQuant\:zw开源量化工具箱和zwQuant量化分析开

    源软件。

    zwQuant开源量化工具箱与zwPython进行了集成处理,可直接输入

    使用,支持Python 3.5。

    移植时或使用其他Python环境时,可以把zwQuant目录下的脚本文

    件全部复制到自己的代码工作目录,注意zwSys.py代码里有关数据文件

    目录的设置。

    1.4.2 金融股票数据包

    1. 数据目录结构

    zwDat股票数据包目录结构如图1-29所示。

    图1-29 zwDat股票数据包目录结构

    其中,具体目录结构如下。

    \zwDat\:zw数据源根目录。

    cn\:中国股票数据。

    Day\:A股日线数据。

    xday\:大盘等指数日线数据。

    us\:美股数据。

    Day\:美股日线数据。

    zw\:zw增强版数据包,包括中国A股、A股指数、美股数据。

    cnDay\:zw增强版,A股日线数据。

    cnXday\:zw增强版,大盘等指数日线数据。

    usDay\:zw增强版,美股日线数据。

    inx\:股票代码等参数数据。

    min\:中国A股分时数据(仅提供部分演示数据)。

    M05\:5分钟数据。

    M15\:15分钟数据。

    M30\:30分钟数据。

    M60\:60分钟数据。

    2. zwDat数据文件更新

    zwDat的inx目录在首次发布后,有关股票、指数代码文件有大量更

    新,请读者自行下载。下载后直接覆盖原zwDat\inx目录下的文件即可。

    inx更新包文件名为inx.zip。

    新的zwDat_cn数据包文件名为zwDat_cn_v2.7z,已经更新了inx目录

    下的数据,无须再下载inx更新文件包。

    网盘地址为http:pan.baidu.comsljIg944u。

    inx_code.csv:中国A股大盘及各种指数代码。

    stk_base.csv:中国A股2810只股票代码公司概况。

    stk_code.csv:中国A股2810只股票代码。

    stk_hs300.csv:中国沪深300指数股票代码。

    stk_sz50.csv:中国上证50指数股票代码。

    stk_zz500.csv:中国中证500指数股票代码。

    inxYahoo.csv:全部6688只美股代码。

    inxYahoo30sp.csv:道琼斯30指数美股代码。

    inxYahoo100ns.csv:纳斯达克100指数美股代码。

    inxYahoo100sp.csv:道琼斯100工业指数美股代码。

    inxYahoo500sp.csv:道琼斯500指数美股代码。

    inxYahoo600.csv:量化常用美股600股票代码。

    1.5 Python实战操作技巧

    1.5.1 模块检测

    import scipy:sp。

    import numpy:np。

    import statsmodels:sm。

    import talib:ta。

    import zipline:zp。

    import tushare:ts。

    import pandas:pd。

    本书常用的模块库与默认缩写字符串如下。

    本节脚本程序用于检测量化相关的重点模块库是不是安装完毕。

    \zwpython\zw_k10\k103ver.py。

    模块检测可运行相关脚本,具体代码请参见脚本文件:import matplotlib:mpl。

    import matplotlib.pyplot:plt。

    import seaborn:sns。

    import ggplot:gpl。

    import pyalgotrade:pat。

    import zipline:zp。

    import zwSys:zw(::zwQT)。

    import zwQTBox:zwBox。

    1.5.2 Spyder编辑器界面设置

    在设置界面前,把zwQuant\source\zwQTBox.py文件拖到Python编程

    语言编辑器Spyder的编辑框中,如图1-30所示。

    图1-30 Python编程语言编辑器Spyder编辑框界面

    Spyder编辑器的界面设计非常合理,参考了MATLAB,特别适合量

    化分析。国际投行一般都选择这种布局作为标配。

    通常需要优化的只有Outline(导航)面板,又称函数列表面板,类

    似Delphi语言的struct函数列表面板。

    在Spyder编辑器默认配置中,Outline面板是不显示的,单击菜单

    View→Panes→Outlines,如图1-31所示,将显示Outline面板。

    图1-31 显示Outline面板

    Outline面板显示后,它的默认位置是在代码编辑器和右侧窗口的中

    间。

    建议单击Outline面板左上角的“窗口缩放”按钮,拖动面板到右上

    方,将其与Var(变量)面板、File(文件)面板等合并。

    Outline面板的作用是对代码中的函数、类、变量进行快速导航定

    位。单击Outline面板的函数、类、变量名称后,左侧代码编辑器就会自

    动移动到相关代码,如图1-32所示。对于大型项目而言,使用Outline面

    板可以提高效率。

    图1-32 Spyder编辑器Outline面板

    1.5.3 代码配色技巧

    zwPython的IDE代码编辑器是Spyder,默认配色是Spyder模式,采

    用白底黑字,与传统的IDE环境差别很大,如图1-33所示。

    图1-33 Spyder编辑器配色模式

    如图1-34所示是最新的Delphi-xe10的编辑器配色模式(Twilight模

    式)。

    图1-34 Delphi-xe10编辑器配色模式

    这种黑底模式也是微软等开发平台标准的代码编辑器配色模式。幸

    运的是,Spyder编辑器内置的配色模式里有类似的模式。

    如图1-35所示,运行Spyder编辑器,单击菜单Tools→Preferences,打开Preferences对话框。在左侧的列表框中选择Editor(编辑器),在右

    侧的Syntax color scheme(语法的配色方案)下拉列表框中选择

    SpyderDark(暗调)模式即可。

    图1-35 调整Spyder编辑器配色模式

    不同版本的Spyder编辑器调整细节会有所不同,请读者注意。

    1.5.4 图像显示配置

    Python语言的Spyder编辑器默认的图像显示尺寸对于高清显示器来

    说尺寸有些小,需要进行调整,具体步骤如下。

    (1)单击菜单Tools→Preferences,打开Preferences对话框。

    (2)单击左侧列表框中的IPython console(IPython控制台)。

    (3)在对话框的右侧选择Graphics选项卡。

    (4)在Graphics backend选项区中,Backend选项默认为Inline,一

    般不需要更改,如要进行交互分析,可以设置为Auto matic(自动)模

    式或者Qt模式。

    (5)在Inline backend选项区中可以调整内置图像的大小,Width默

    认值为8,Height默认值为5,建议改成Width为10、Height为6。

    此外,建议勾选对话框上部的Automatically load Pylab and NumPy

    modules复选框(会自动加载Pylab、NumPy模块),如图1-36所示。

    图1-36 调整Spyder编辑器图像显示尺寸

    1.5.5 Python2、Python 3双版本双

    开模式

    客户端,通常会采用VBox等虚拟机技术。

    双开原本是网游工作室的术语,是指在一台计算机上同时打开两个zwPython开发平台在2016M10以前的版本中内置了Python 2.7和

    Python 3.x两种不同的版本。

    通常很少出现两种环境同时并发工作的情况。双开模式最保险还是

    用VBox虚拟机,不过虚拟机安装麻烦,效率太低,偶然查询资料,用

    虚拟机有些大材小用。

    由于很多Python量化库只支持Python 2.7,因此有时在运行Python

    3.x版本的程序时,需要临时调用Python 2.7的资源,这时就需要用

    Python 2.7和Python 3.x两种不同版本的双开技术。

    使用zwPython开发平台的双开模式很简单,分别运行py27.bat文件

    和py35.bat文件即可。为避免冲突,最好等一种环境完全加载完毕后,再启动另外一个版本。

    如图1-37所示是双开模式运行截图。

    图1-37 双开模式运行截图

    使用双开模式时,若显示器分辩率高,则可以左右分屏显示;若显

    示器分辨率低,则只能单屏切换。在图1-37中:

    左侧是Python 2.7版本,运行的脚本文件名是k101cmap.py;

    右侧是Python 3.5版本,运行的脚本文件名是k102m1cmap.py。

    1.5.6 单版本双开、多开模式

    相比双版本双开模式,用得更多的是单版本的双开、多开模式。下

    面以Python 3.x为例,介绍单版本的双开、多开模式。

    以colorcmap颜色表程序为例,操作步骤如下。

    (1)加载k101cmap.py脚本文件,单击工具栏中的“运行”按钮或者

    按F5快捷键,运行第1组程序。

    (2)加载k102m1cmap.py脚本文件,在代码编辑窗口选择第二个脚

    本文件k102m1cmap.py。

    (3)用鼠标右键单击右下方iPython面板的Tab栏,在弹出的快捷菜

    单中选择Open a new console(建立一个新的iPython控制台),也可以按

    Ctrl+T快捷键,如图1-38所示。

    图1-38 单版本双开模式运行设置

    (4)等新的iPython控制台初始化完毕,单击工具栏中的“运行”按

    钮或者按F5快捷键,运行第2组程序。

    单版本双开模式运行截图如图1-39所示。

    图1-39 单版本双开模式运行截图

    如果有第3组、第4组程序,依次添加、运行即可。程序的具体上限

    没有测试,不过按经验,不要超过CPU的内核数,不然会影响效率。如

    果是4核的CPU,建议3开;如果是8核的CPU,建议6~7开,要留1~2个

    CPU内核给Windows系统。

    为什么单版本双开、多开的用处比多版本用处大呢?

    在数据分析时,有时需要下载大量的数据,例如下载中国A股历年

    的日线数据,就需要一天的时间。

    这时,完全停工等待数据下载完毕,就会浪费时间。如果采用双开

    模式或多开模式,再开1~2个iPython控制台和代码编辑窗口编写、调试

    新代码,也占用不了多少CPU,却可以大大提高程序员的工作效率。这

    样就使下载、编程双管齐下:前台编辑、调试新代码,后台下载数据

    包。

    事实上,分析分时数据时,即使是5分钟数据线,几千只股票数据

    下载,也需要不少的时间。如果采用双开、多开模式,分析、下载同步

    进行,无疑效率会更高。

    1.5.7 实战胜于一切

    像中医,靠的是经验、感觉,即使使用所谓的技术,看看K线图,也只

    简单对比传统理财策略与量化投资,就像中医与西医。传统理财就

    1.6 量化、中医与西医

    自模拟操作才能掌握,请读者学习完本节内容后多加练习。

    本节介绍的大部分内容都是一线的实战技巧,这些技巧需要读者亲

    单版本双开、多开模式。

    Python 2.7、Python 3.x双版本双开模式;

    图像显示配置;

    代码配色技巧;

    界面设置;

    常用模块库与缩写;

    zwPython操作技巧;

    在1.5节中讲述了以下内容:能发现一些趋势的征兆,而无法给出具体的参数指标。量化分析就像西

    医,靠的是专业的工具、设备、软件,例如体温计、血压表、显微镜、CT、X光,把相关现象数字化,再根据病理进行治疗。

    以简单的感冒发烧为例,中医通过传统手段能够知道病人身体发

    热,需要降温,可具体发烧到多少度,却无法提供准确的数据,只能凭

    经验,开一些降温药材。西医凭借简单的体温计就可以精确地知道病人

    发烧的程度,从而针对性治疗。

    两相比较,优劣自现。

    在本章“一月效应”案例中,传统理财者可以凭借经验知道在一月份

    投资盈利的可能性大,也知道相关的滞后现象,可如何操作却没有具体

    的数据支持。

    我们通过Python程序,对历年的股票数据进行简单的统计分析,不

    仅知道美国的“一月效应”更多的是在十二月份圣诞期间、中国大部分在

    二月份春节期间,同时我们也计算出“一月效应”的盈利概率具体是多

    少。

    通过不同的指数组合,还可以发现大企业等蓝筹股的“一月效应”更

    加明显、中小企业创业板股票相对较弱。至于A股市场,混合指数的“黄

    金周效应”只是意外收获。

    不过,科学史和投资史上的偶然现象往往是机遇的开始:X光、微

    波炉、镭射……

    第2章

    常用量化技术指标与框架

    第1章是入门引导,主要介绍Python操作技巧与几个趣味投资理财

    的案例,本章其实才是量化的第一课。本章将从宏观角度、从整体上对

    Python量化领域进行整体介绍。

    通过SMA均线策略的实盘案例,介绍完整量化投资流程。

    目前主流的Python量化框架、模块库、软件包。

    Ta-Lib金融模块库与量化分析常用的金融技术指标。

    经典量化策略介绍:Alpha策略、Beta策略和海龟交易法则等。

    量化策略的分类与要点。

    2.1 案例2-1:SMA均线策略

    下面介绍一个相对完整的量化分析案例。这是一个SMA均线策略案

    例,源自PyAlgoTrade开源量化软件文档,为方便教学并便于理解,笔

    者对相关代码进行了修改和汉化,并增加了绘图输出。SMA均线策略也

    是动量策略的一种,所以SMA均线策略也可称为SMA动量策略。

    注意,下面的Python案例程序是与PyAlgoTrade相关的案例程序,只适用于Python 2.7。具体代码请参见脚本文件

    \zwpython\zw_k10\k201_sta_anz.py。

    运行代码后,程序会输出数据,包括图像和文字信息,如图2-1所

    示为运行结果,即SMA均线策略收益曲线图。

    图2-1 SMA均线策略收益曲线图

    输出的文字信息如下:

    最终资产价值 Final portfolio value: 13091.62

    累计回报率 Cumulative returns: 30.92 %

    夏普比率 Sharpe ratio: 0.72

    最大回撤率 Max. drawdown: 23.69 %

    最长回撤时间 Longest drawdown duration: 277 days, 0:00:00

    总交易 Total trades: 13

    平均利润 Avg. profit: 154

    利润方差 Profits std. dev.: 1268

    最大利润 Max. profit: 4197

    最小利润 Min. profit: -892

    平均收益率 Avg. return: 2 %

    收益率方差 Returns std. dev.: 13 %

    最大收益率 Max. return: 46 %

    最小收益率 Min. return: -7 %

    盈利交易 Profitable trades: 3

    平均利润 Avg. profit: 1964

    利润方差 Profits std. dev.: 1586

    最大利润 Max. profit: 4197

    最小利润 Min. profit: 662

    平均收益率 Avg. return: 21 %

    收益率方差 Returns std. dev.: 18 %

    最大收益率 Max. return: 46 %

    最小收益率 Min. return: 6 %

    亏损交易Unprofitable trades: 10

    平均亏损 Avg. loss: -389

    亏损方差 Losses std. dev.: 238

    最大亏损 Max. loss: -892

    最小亏损 Min. loss: -44

    平均收益率 Avg. return: -3 %

    收益率方差 Returns std. dev.: 2 %

    最大收益率 Max. return: -0 %

    最小收益率 Min. return: -7 %

    2.1.1 案例要点与事件编程

    在案例2-1的SMA均线策略程序中,策略调用的是以下语句,即20

    日SMA平均线策略:

    myStrategy = SMACrossOver(feed, orcl, 20)

    这是最简单的SMA均线策略,案例程序默认的参数是“20日平均

    线”,这个“20日”是优化后的结果,读者可以用5、15、29、21、25、30

    等不同的时间周期参数分别进行测试,这些参数的运行结果大部分都是

    负收益和低收益。

    PyAlgoTrade(简称PAT)开源量化软件采用的是目前常用的事件

    模式,而前面的案例程序采用的是最简单的SMA均线策略,核心代码是

    onBars事件函数,其他都是辅助功能,如数据源配置、绘图、计算回报

    率模块库等。

    注意,函数开头字母为on,表示是事件函数,代码如下:

    def onBars(self, bars):

    If a position was not opened, check if we should enter a long position.

    if self.__position is None:

    if cross.cross_above(self.__prices, self.__sma) > 0:

    shares = int(self.getBroker.getCash 0.9 bars[self.__instrument].getPrice)

    Enter a buy market order. The order is good till canceled.

    self.__position = self.enterLong(self.__instrument, shares, True)

    Check if we have to exit the position.

    elif not self.__position.exitActive and cross.cross_below(self.__prices, self.__sma) > 0:

    self.__position.exitMarket

    SMA均线策略很简单:

    当股票价格高于SMA平均线价格并且是向上趋势时,买入;

    当股票价格低于SMA平均线价格并且是向下趋势时,卖出。

    SMA均线策略和函数代码虽然很简单,但细节很啰嗦,而且是事件

    函数,初学者请参看流程图2-2。

    精力。虽然Python语言是全对象设计,但Python的class类是弱类,不象

    “学习Python语言应该采用“面向过程”的方式,至少可以节省90%的

    客和《zwPython开发平台用户手册》里提过:

    Python原本是脚本语言,不擅长做大工程、大项目,笔者曾经在博

    策略和回溯的量化系统,更多采用传统的循环模式,以简化系统设计。

    模块,如backtrade、pyBacktest和zwQuant等,这些新一代量化软件专注

    github.org开源项目网站近来新增的量化项目大部分是独立策略分析

    说,设计逻辑相对简单,是一体化的量化系统的主流模式。

    注意,事件模式对于数据采集、交易、分析一体化的量化系统来

    图2-2 SMA策略函数流程图C++、Java那么复杂。对于Python语言的class类,笔者建议可以简单地

    把其视为一组预定义的函数集合或数据集合,类似C语言里的struc结构

    或Delphi语言里的带函数的记录。

    对于Python程序,我们应尽量远离自省、attr开头或结尾的命令,同

    样,on开头的事件函数也尽量不要直接使用。因为on开头的事件函数,虽然有关的事件处理在函数内定义,但上级调用模块却可能放在其他的

    模块库,而Python语言对于大型软件的跨模块调试支持非常弱。”

    本小节案例程序代码中的示例看起来很简单,是因为笔者把onBars

    这个函数单独分离出来了,否则一大堆on开头的函数没有先后顺序、没

    有入口函数,初学者很容易搞混,不知道如何下手,例如:

    def onEnterCanceled(self, position):

    def onExitOk(self, position):

    def onExitCanceled(self, position):

    def onBars(self, bars):

    目前,在线量化交易网站逐渐增多,每个网站应用环境都不同,站架构进行讲解,是因为以下几个原因:

    教学参考案例,而不是直接采用quantopian等目前国内外流行的量化网

    这里,我们再说几句题外话,笔者之所以选择PAT的案例程序作为

    度呈几何程度上升。

    模块、多个class类定义,还要考虑各个class类之间的关系,代码的复杂

    这个案例程序的代码是最简单的,只有一个class类定义;对于多个不可能一一讲到。

    量化交易的核心是量化分析,PAT是离线版本,而且有源码,国

    内的量化网站大部分都是闭源的。

    量化分析的核心就是onBars事件函数,各个量化网站差不多,只

    是函数名称、参数不同而已,其他的都是辅助功能。

    掌握了onBars这个量化的“准”主函数,其他各种应用平台、操作

    都是大同小异的,只是细节不同,读者参考相关网站的说明资料

    基本就能够掌握了。

    PAT量化软件是开源的,能够对相关代码进行修改、汉化,强化

    教学功能,案例2-1的代码就是笔者根据初学者的水平进行了二

    次修改、汉化,并且增加了绘图输出,以方便读者学习。

    2.1.2 量化程序结构

    下面介绍代码的其他部分,以案例2-1为例,其程序相对比较简

    单,可以分为以下几个部分:

    Import为模块库导入,注意相关的缩写;

    class SMACrossOver(strategy.BacktestingStrategy)为类定义,注意

    是源自BacktestingStrategy;

    main主流程代码,数据源设置、调用等;

    回报率计算,输出相关数据。

    Import为模块库导入部分,是Python语言的常规流程,读者需注意

    相关模块库的缩写。

    class SMACrossOver为类定义部分,比较复杂,现阶段读者只需把

    握好onBars函数就可以了。

    回报率计算和数据输出已经汉化,很简单。虽然输出数据量很多,但都是行业惯例,而且已经分成了以下几组:

    回报率概况;

    总的交易情况;

    盈利部分交易情况;

    亏损部分交易情况。

    2.1.3 main程序主入口

    案例2-1程序代码的重点还是main程序主入口的流程代码,相关程

    序代码如下,已经增加了中文注释:

    Load the yahoo feed from the CSV file

    初始化数据源变量feed

    feed = yahoofeed.Feed

    加载数据源文件给feed

    读者可以从zwDat的美股数据目录下复制其他数据文件进行测试

    因为PAT使用的是美股数据,因此直接加载zw版和cn中国A股数据会出错,需要修改columns名称

    feed.addBarsFromCSV(orcl, dat\\orcl-2000.csv)

    Evaluate the strategy with the feed's bars.

    定义所用的策略myStrategy,源自class类定义SMACrossOver

    定义时,已经导入了数据源feed,股票名称为orcl,SMA时长为20天

    myStrategy = SMACrossOver(feed, orcl, 20)

    Attach different analyzers to a strategy before executing it.

    策略运行前,绑定相关分析模块

    回报率分析

    retAnalyzer = returns.Returns

    myStrategy.attachAnalyzer(retAnalyzer)

    夏普指数分析

    sharpeRatioAnalyzer = sharpe.SharpeRatio

    myStrategy.attachAnalyzer(sharpeRatioAnalyzer)

    最大回撤率分析

    drawDownAnalyzer = drawdown.DrawDown

    myStrategy.attachAnalyzer(drawDownAnalyzer)

    交易分析

    tradesAnalyzer = trades.Trades

    myStrategy.attachAnalyzer(tradesAnalyzer)

    ---set.plot

    设置绘图参数

    plt = plotter.StrategyPlotter(myStrategy, True, False, True)

    设置绘图数据源,来自getSMA函数

    plt.getInstrumentSubplot('orcl').addDataSeries(sma, myStrategy.getSMA)

    Run the strategy.

    运行策略

    myStrategy.run

    绘制策略回溯图

    plt.plot

    这个案例程序对于初学者而言,即使汉化后难度也很大,毕竟这是

    一个完整的量化分析流程。

    目前,读者不需要完全理解,我们在后面有关的章节中也会讲到这

    个案例。现阶段,读者通过这个案例对量化整体流程有一个全面的印象

    就可以了。

    2.1.4 KISS法则

    “KISS”是英语“Keep It Simple, Stupid”的首字母缩写。KISS法则是

    指在设计中应当注重简约的原则。KISS法则广泛应用在商业书信、电脑

    软件、动画和工程上。

    “KISS”原文也有很多其他版本,包括“Keep It Sweet

    Simple”、“Keep It Short Simple”、“Keep it Simple, Sweetheart”和“Keep

    it Simple, Sherlock”。

    对于量化初学者而言,要掌握、理解案例2-1背后的整个量化流

    程,以及学会灵活利用其他策略取代案例程序中的SMA平均线策略。

    对于量化专业人员而言,要掌握相关的代码构成,以及背后的基本

    逻辑,独立完成相关的Backtest(回溯)测试模块编程。

    策略是量化交易的核心,无论是量化初学者,还是专业人员,都需

    要重点学习Backtest(回溯)测试模块部分。

    至于量化程序前端的数据API接口与数据采集模块、后端的

    Trade(下单交易)模块,可以通过有关金融数据网站的API接口或者

    CSV等数据文件格式,甚至通过第三方软件实现;量化交易中的部分环

    节,特别是非高频的下单环节,也可以采用人工模式。这个也是KISS法

    则在量化方面的体现。

    无独有偶,海龟交易法则的四大核心之一也是简单明了。

    海龟交易法则的四大核心如下:

    掌握优势,找到一个期望值为正的交易策略,因为从长期看,它

    能创造正的回报;

    管理风险、控制风险、守住阵地,否则你可能等不到创造成果的

    那一天;

    坚定不移,唯有坚定不移地执行你的策略,才能真正获得系统的

    成效;

    简单明了,从长久看,简单的系统比复杂的系统更有生命力。

    2.2 Python量化系统框架

    量化系统的划分有很多标准,最简单的方式是根据软件架构分为以

    下两大类:

    事件(消息)模式,如PyAlgoTrade等目前主流的交易一体化平

    台基本都是这种模式;

    循环模式(类似暴力破解:穷举模式、词典模式),包括

    zwQuant、PyBacktest和Zipline等。

    事件模式起步较早,不少大企业因为交易一体化的需要,目前依然

    很流行,但事件模式过于复杂、主次不分,对量化分析的核心即策略方

    面不够专业。

    目前,GitHub等开源项目网站新增的量化项目,大多都只有独立的

    回溯Bakctest模块,例如BT、trading-backtest、backtrader等。

    以上这种划分模式只是笔者的一家之言,读者也可以参考其他学者

    的划分方法。

    2.2.1 量化行业关键词

    量分析,许多量化交易软件的名称都包含Quant。

    Quant:宽客,Quant的音译,英文是定量的意思,源自化学的定

    词。

    在进一步介绍Python量化系统之前,先介绍几个常见的行业关键strategy:投资策略,前面介绍的SMA策略、“一月效应”、A股黄

    金周效应都可以看做简单的量化投资策略。

    drawdown:最大回撤率,是指金融产品在历史上一段时间的最

    大跌幅。最大回撤率用来描述买入产品后可能出现的最糟糕的情

    况。最大回撤率是一个重要的风险指标,对于对冲基金和量化策

    略交易来说,该指标比波动率还重要。

    Backtest:回溯测试,简单来说,就是用历史数据测试相关的投

    资策略。

    Slippage:滑点,是指下单的价格点位,和最后成交的价格点位

    有差距。

    CAPM:资本资产定价模型,是Capital Asset Pricing Model的缩

    写。它是在资产组合理论的基础上发展起来的,是现代金融市场

    价格理论的支柱。CAPM模型假设所有投资者对期望收益、方差

    和协方差等的估计完全相同,投资人可以自由借贷。基于这样的

    假设,CAPM模型研究的重点在于:探求风险资产收益与风险的

    数量关系,即为了补偿某一特定程度的风险,投资者应该获得更

    多的报酬率。

    ETF:交易型开放式指数基金,通常又被称为交易所交易基金

    (Exchange Traded Funds,简称ETF),是一种在交易所上市交

    易的、基金份额可变的开放式基金。

    FOF:基金中的基金,与开放式基金最大的区别在于,基金中的

    基金以基金为投资标的,而基金是以股票、债券等有价证券为投

    资标的。它通过专业机构对基金进行筛选,帮助投资者优化基金

    投资效果。

    OHLC:外汇交易术语,O(Open)代表开盘价,H(High)代

    表最高价,L(Low)代表最低价,C(Close)代表收盘价。

    2.2.2 国外主流Python量化网站

    目前,全球量化投资很流行,发展很快,以下三家是全球知名的大

    型量化网站。

    quantopian,网址是https:www.quantopian.com,网站首页如图2-

    3所示。目前为行业第一,Zipline就是该公司的产品,国内优矿

    等Web模式的量化平台基本上都是模仿Quantopian网站。

    图2-3 quantopian量化网站首页

    Wilmott,网址是http:www.wilmott.com,网站首页如图2-4所

    示,以策略研究为主。

    图2-4 Wilmott量化网站首页

    QuantPedia,网址是http:www.quantpedia.com,网站首页如图2-

    5所示,以策略研究为主,免费用户只能看前几页资料。

    图2-5 QuantPedia量化网站首页

    2.2.3 我国主流Python量化网站

    下面是我国出现较早、业内知名的量化网站。

    zw量化,网址是www.ziwang.com,网站首页如图2-6所示。2016

    年免费发布了业内首套开源Python量化分析平台zwQuant,以及

    zwDat股票数据包和大量免费开源的量化课件,也是本书的技术

    支持网站。

    图2-6 zw量化网站首页

    极宽量化,网址是www.zQuant.cn,是zwQuant量化软件的升级版

    本,zQuant极宽量化软件的官方网站也是本书的技术支持网站,未来www.ziwang.com网站的量化模块会逐渐向极宽量化网站迁

    移。

    掘金,网址是www.myquant.cn,网站首页如图2-7所示,老牌量

    化网站,有客户端软件,社区也不错。

    图2-7 掘金网站首页

    优矿,网址是www.uqer.io,网站首页如图2-8所示,老牌量化网

    站,是我国最大金融数据公司通联数据旗下的企业。

    图2-8 优矿网站首页

    聚宽,网址是www.joinquant.com,网站首页如图2-9所示,致力

    于打造最高效、易用的量化交易平台。基本上就是Quantopian网

    站的汉化版。

    图2-9 聚宽网站首页

    RiceQuant,网址是www.ricequant.com,网站首页如图2-10所

    示,与聚宽类似,也是模拟Quantopian网站,不过增加了不少本

    地化的东西。

    图2-10 RiceQuant网站首页

    2.2.4 主流Python量化框架

    目前,国内外比较成熟的Python量化框架可以分为三大类。

    Web在线网站模式,类似云计算网站,将数据采集、分析、交易

    一体化,如quantopian、优矿、聚宽、RichQuant等。

    客户端模式,如PyAlgoTrade、掘金、vnpy、QuantDigger。

    策略回溯模式,只做策略回溯部分,如zwQuant、pyQuanttest和

    Zipline。

    1. Web在线网站模式量化系统

    对于Web在线网站模式,目前全球quantopian量化网站一家独大,基本上可称之为quantopian模式。在全球最大的开源项目网站GitHub中

    使用关键词“quantopian”进行搜索,搜索结果中与quantopian相关的

    Python量化项目就有38个之多,如图2-11所示。

    图2-11 GitHub开源网站与quantopian关联的项目

    搜索结果的网址是https:github.comquantopian。

    单击第二个结果“quantopian-algos”左侧的“quantopian”链接,这个是

    项目开发商的链接(不一定是第二个结果,注意项目开发商的关键

    词“quantopian”),整理一下,有近56个项目。

    笔者把目前的量化项目分为quantopian类别和非quantopian类别,虽

    然方法简单,但还是有一定道理的。

    quantopian网站在GitHub上发布的开源项目大部分是Python版本,与数据分析、量化分析相关的项目虽然不少,但属于衍生项目,有名的

    项目也不少,量化领域最出名的就是Zipline和quantopian-algos。

    2. quantopian项目清单

    下面是quantopian在GitHub上发布的开源项目,如图2-12所示。

    图2-12 quantopian开源项目

    (1)DockORM,docker对象—关系映射。

    (2)MongoDBProxy,MongoDB数据库独立工具。

    (3)QuantSoftwareToolKit,QSTK量化工具包。

    (4)Zipline,优秀的Python交易算法库。

    (5)bcolz,数据列压缩工具。

    (6)blaze,NumPy、Pandas与大数据的接口。

    (7)cancan,ROR工具软件。

    (24)metautils,metaclasses工具包。

    (23)logbook,log工具。

    (22)letter_opener,浏览器邮件预览工具。

    (21)jupyterhub,Jupyter notebooks多用户服务。

    (20)jsonrpc.py,JSON-RPC序列化、反序列化工具。

    (19)ipython,专业的Python shell控制台。

    (18)ipykernel,用于Jupyter的IPython 内核。

    (17)gevent,gevent协同并发库工具。

    (16)fakeredis,redis-rb开发和测试环境。

    (15)dockerspawner,docker工具。

    (14)dd-agent,数据代理。

    (13)datashape,定义数据描述语言。

    (12)cytoolz,优化版本,高性能函数集。

    (11)conda-build,conda包管理工具箱。

    (10)coal-mine,监控任务的执行周期。

    (9)chest,简单的字典数据格式,支持外溢至磁盘。

    (8)cassandra_snapshotter,数据备份工具。(25)mobylette,ROR工具包。

    (26)mongo-python-driver,mongo驱动。

    (27)mongoid-encrypted-fields,mongo日期处理。

    (28)mongoid-slug,mongo工具。

    (29)mongoid_rails_migrations,mongo数据迁移工具。

    (30)nose-parameterized,nose参数测试。

    (31)nose_gevent_multiprocess,多进程gevent插件测试框架。

    (32)nose_xunit_gevent,Xunit多任务测试工具。

    (33)odo,数据处理,源自Blaze项目。

    (34)pagedown-bootstrap,Markdown编辑工具。

    (35)periodicbackup-plugin,备份工具。

    (36)pgcontents,IPython内容管理工具。

    (37)pyfolio,投资组合与风险分析。

    (38)qdb,QDB型远程调试器。

    (39)qgrid,IPython Notebook交互式的数据网格,支持数据排

    序、过滤。

    (40)quantopian-algos,quantopian量化交易算法脚本集。(41)quantopian-drafts,一些新的quantopian功能函数。

    (42)rack-mini-profiler,Ruby应用微型分析器。

    (43)research_public,quantopian公共研究项目。

    (44)schematics,人性化的数据结构。

    (45)sendgrid-python,SendGrid的Python模块库。

    (46)serializable-traitlets,可序列化的JSON。

    (47)sparklines,Ruby工具包。

    (48)sqlalchemy_fdw,基于psycopg2的SQL数据库工具。

    (49)stripe-ruby-mock,stripe-ruby-mock模拟库。

    (50)TA-Lib,专业的金融财经函数集。

    (51)tmpnb,Jupyter Notebook服务器,使用docker模式。

    (52)toolz,Python标准函数库。

    (53)tradingcalendar,交易所工具包。

    (54)traitlets,轻量级Traits类模块。

    (55)vanity,Ruby开发工具。

    (56)xlrd,Excel工具。

    3. 客户端模式量化系统

    backtrader量化软件类似掘金量化软件,是客户端模式的,其网页

    简介中也介绍了不少目前主流的Python量化软件包。我们先到Python官

    网的模块库中搜索一下“backtrader”。

    搜索结果的网址是https:pypi.python.orgpypibacktrader。

    网页下方的Alternatives(替代品)栏中介绍了多个流行的Python量

    化软件包,如图2-13所示。

    软件自身,着重于策略回溯模块。在目前Python量化的起步阶段,这种

    以上开源项目并不全是客户端量化系统,大部分如backtrader量化

    图2-13 Backtrade量化软件及关联项目举一反三的项目外延方式,读者可以多使用,尽量扩大自己的知识面。

    除了这些,国内的vnpy、QuantDigger和掘金都是客户端类的交易系

    统。

    如图2-14和图2-15所示分别为vnpy量化项目和QuantDigger量化项

    目。

    图2-14 vnpy量化项目

    图2-15 QuantDigger量化项目

    在GitHub开源项目网站上,中文量化项目发展迅速,大约占20%,如图2-16所示是关键词“量化”的搜索结果,读者可以用其他的金融类关

    键词再搜索看看。

    图2-16 GitHub开源网站中文量化项目

    4. 策略回溯模式

    策略回溯模式偏重于策略分析、回溯测试,虽然起步晚,但目前已

    经成为趋势。zwQuant、PyBacktest,backtrade、BT、Zipline等开源量化

    项目基本上都可以归为此类。

    如图2-17和图2-18所示分别为PyBacktest开源量化项目和Zipline开源

    量化项目。

    图2-17 PyBacktest开源量化项目

    的Python学习教材,也是国内金融机构、私募团队进行量化产品

    (www.ziwang.com)还提供了大量的中文文档,是初学者首选

    Windows、Linux、Mac等多种操作系统,其网站

    zwQuant,国内首个开源量化程序,纯Python源码,适用于

    相关的软件包有如下几个。

    本书重点讲解策略分析和金融行业的数据分析,整体而言,与量化

    2.3 常用量化软件包

    图2-18 Zipline开源量化项目

    QSTK,2012年的金融量化项目,框架有些旧。

    口。

    是在设计上还是会从实盘交易的角度考虑,将来也会接入交易接

    门通用语言的所有功能。QuantDigger目前定位于研究工具,但

    似MC、TB这些商业软件,但并不牺牲灵活性,保留了Python这

    QuantDigger,中文版本的Python算法系统,策略语法更简单,类

    化交易框架项目。

    vnpy,中文版本的Python算法系统,是一个基于Python的开源量

    略回测和实盘交易,提供全面的技术分析接口。

    PyAlgoTrade,简称PAT,是开源的Python量化交易框架,支持策

    数据分析和可视化。

    归;与现有Python生态圈能很好的融合;支持交易系统的开发、引擎。它使用简单,包括常用的统计方法,如移动平均和线性回

    进行投资算法的回溯检验。Zipline目前是quantopian的回溯检验

    Zipline,用于量化分析,它是一个交易算法库,可以对历史数据

    融市场的数据进行技术分析。

    Ta-Lib,金融函数包,目前已经被金融行业广泛使用,用来对金

    实现。

    方面极大地减轻工作量,使他们更加专注于策略和模型的研究与

    员提供快速、整洁和多样的便于分析的数据,为他们在数据获取

    融数据进行数据采集、清理加工和数据存储,能够为金融分析人

    Tushare,免费、开源的Python财经数据接口包。主要对股票等金

    法。它使Python成为强大而高效的数据分析环境。

    模型,提供了大量能使我们快速、便捷地处理数据的函数和方

    数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据

    Pandas,是基于NumPy的数据分析工具,该工具是为了解决金融

    开发很好的参考模板。以上量化行业相关的软件包中,最重要的还是Pandas数据分析模

    块、TuShare数据采集模块,以及TA-Lib、Zipline金融函数库。本书大

    量引用了PyAlgoTrade中的文档和代码,因此PyAlgoTrade读者也需重点

    关注。

    PyAlgoTrade和TA-Lib的中文资料很少,笔者在本书网盘资源中提

    供了部分简单汉化版本,读者可以并参考。至于zwQuant、vnpy、TuShare和QuantDigger等量化软件,本身就是中文版的,文档也

    做得很好,读者可以自己下载,查看相关的源码和文档。

    2.3.1 常用量化软件包简介

    如图2-19~图2-22所示为常用的量化软件包。

    图2-19 Pandas开源数据分析软件

    图2-20 TA-Lib金融软件包

    图2-21 PyAlgoTrade开源量化软件

    图2-22 TuShare开源金融数据抓取模块库

    2.3.2 案例2-2:模块库列表

    我们在使用Python时,经常需要安装大量的模块库,有时也需要整

    理Python平台现有的模块库。以下脚本很短,却可以很好地完成这些工

    作。

    脚本文件名是\zwpython\zw_k10\k202_piplst.py。

    代码如下:

    -- coding: utf-8 --

    import sys

    import os

    import pandas as pd

    import pip

    =============

    plst=pip.get_installed_distributions;

    print(plst[10])

    df=pd.DataFrame;

    df['']=plst;

    print(df.tail)

    fss=tmp\\m100.csv;print(\n+fss)

    df.to_csv(fss,index=Fals ......

您现在查看是摘要介绍页, 详见PDF附件(23954KB,617页)