python量化交易pdf书籍微盘,python量化交易编程自学

大家好,小编来为大家解答以下问题,python量化交易教程电子书,python量化交易pdf书籍微盘,今天让我们一起来看看吧!

Source code download: 本文相关源码

本书源于一个真实的故事,故事的主角是一位名叫小瓦的姑娘。 小瓦出生在一个普通的家庭,父母都是老实淳朴的普通人,靠着并不 丰厚的收入把小瓦养育成人python用turtle画固定樱花树。18岁那年,小瓦考上了一所不好不坏的 大学,所学专业是一个就业前景算不上理想的专业。再加上她本身也 谈不上出色,说她是一个现实版的“灰姑娘”也不为过。综上所述,小 瓦应该是一个有点危机感的孩子,实际上她也确实有改变现状的想 法。因此,我们的任务就是帮助小瓦实现她的愿望。当然,千里之 行,始于足下。在本章中,我们先要了解一些基础知识。

本章的主要内容如下:

  1. 简要回顾历史上的交易。
  2. 从自动化交易到因子投资。
  3. 机器学习技术的崛起。
  4. 环境配置及常用工具的基本使用。

1.1 何以解忧,“小富”也行

和其他女孩子一样,小瓦也有爱美的天性。她也想像其他女生一样 把自己打扮得漂漂亮亮,并且顺利完成学业,如果条件允许,她还想继 续深造。然而,其家庭的现实情况支撑不了她的梦想,所以平日里小瓦 的生活还是很简朴的。小瓦希望找到一个方法,能够让她的状况变得好 一些,至少可以通过自己的努力为父母减轻一些经济压力。在现实中, 能够通过自己的努力,先“小富”起来,这已经是很不错的了。

想要实现“小富”,其实途径还是蛮多的。如打打零工,或者做点小 生意,都是可以的。不过小瓦有自己的优势——她因为所学的专业担心 自己毕业以后不好找工作,于是自学了Python的入门课程,并掌握了一 些Python的基础语法和常用工具,如数据分析工具pandas和可视化工具 matplotlib等。基于这样的背景,我们可以尝试帮助小瓦利用她已经掌握 的知识来做点更有技术含量的事情——量化交易。这样的话,即便小瓦 最终没有成为一代“股神”,也可以掌握更多的知识和技能,为其日后找 工作增加一点儿优势。 考虑到小瓦所学专业既不是计算机相关专业,也不是金融相关专 业,我们就先让小瓦了解一些基础知识。

1.1.1 那些年,那些交易

相信大家对“交易”这个词并不陌生。早在古罗马时代,人类就开始 进行各种各样的交易了。对历史感兴趣的读者朋友可能会听说过古罗马 广场。在那里,人们除了进行实物商品的交易之外,还会进行交换货 币、债券及其他形式的投资。人们进行交易的目的就是获利,因此人们 在某种商品价格较低时买入商品,再等到价格较高时卖出商品,以此实 现盈利的目的。

1602年,世界上第一个股份制公司——荷兰东印度公司诞生,并在 1606年发行了世界上第一只股票。1609年,世界上第一个股票交易所在 阿姆斯特丹诞生,之后在这个股票交易所的基础上,世界上第一家现代 意义的银行——阿姆斯特丹银行成立。至于后来荷兰东印度公司借助资 本的力量,建立了怎样的霸业,可以留给读者朋友自行搜索。本书不展 开叙述。

中国的资本市场起步相对较晚。中华人民共和国成立以后的第一只 股票是上海飞乐音响股份有限公司发行的“飞乐音响”,于1984年发行。 中国在1989年才开始进行股票交易市场的试点。1990年,深圳证券交易 所和上海证券交易所开始试营业。

1.1.2 自动化交易和高频交易

时光荏苒,岁月变迁,曾经的历史我们一带而过,现在该把小瓦拉 回现代社会了。在过去的几十年间,投资行业可以说是发生了翻天覆地 的变化——那些股民们扯着嗓子喊单的日子一去不复返,取而代之的是 高速运转的计算机设备和各种各样的应用软件。尤其各大金融机构,为 了保持自己的竞争力,以便应对日益复杂的市场环境,一直都走在最新 科技前沿。

说到最新技术,就要回顾一下电子交易的概念——毕竟这是现代交 易的根基。自20世纪60年代以来,计算机和互联网的诞生使交易不再受 物理空间的限制,交易的品种增加,交易量也得到了极大的提升。随着 电子交易的兴起,自动化交易也得到了迅速发展。到了2000年左右,自 动化交易作为一种卖方工具出现,其目的是实现一种低成本、高收益的 交易。在自动化交易中,订单被分散,以避免订单过大而影响市场。后 来这些工具扩展到买方,并在交易中,加入对成本和流动性的考虑,以 及期望预测短期价格和成交量,这使得这个领域涉及的技术越来越复 杂。

读者朋友也听说过高频交易(High-Frequency Trading,HFT)这个 术语。高频交易也是建立在电子交易的基础之上的。高频交易是指在微 秒范围内以极低延迟执行的金融工具的自动交易。在过去的十余年中, 使用高频交易的成交量大幅增长。据估计,2010年前后,高频交易成交 量约占美国股市交易量的55%,占欧洲股市交易量的40%。在外汇期货 市场中,通过高频交易实现的成交量更是达到了惊人的80%左右!

1.1.3 因子投资悄然兴起

对于小瓦来说,“因子投资”这个词可能就有一点陌生了。不过没有 关系,要理解因子投资的概念并不难。首先我们了解一下资本资产定价 模型(Capital Asset Pricing Model,CAPM)。这个概念早在20世纪60年 代就已经被提出,其非常重要的一个组成部分就是贝塔系数(beta)。 贝塔系数用于表示某项资产的系统性风险。资本资产定价模型理论的先 进性在于,它认识到一项资产的风险并非孤立地取决于该资产,而是该 资产相对于其他资产及整个市场的走势。然而,它的局限性也非常明显 ——由于只使用贝塔系数这一个因子(factor),该模型对资产回报率 的预测并不准确。于是,人们开始发掘更多额外的风险因子,以便可以 更准确地预测资产能够带来的回报率。基于这种理念所进行的投资称为 因子投资(factor investment)。

在因子投资中,因子的定义就是那些可以量化的信号、特征或其他 变量。这些因子与资产回报率呈现明显的相关性,并且在未来还要保持 这种相关性。

与CAPM模型相比,多因子模型要考虑的因素要多得多。例如, 1972年,史蒂芬·罗斯提出的套利定价理论(Arbitrage Pricing Theory, APT)就认为证券的回报率与一组因子线性相关。到了1992年,著名经 济学家尤金·法马和金融学家肯尼思·弗伦奇提出了举世闻名的Fama- French三因子模型,指出证券回报率可以用市场资产组合、市值及账面 市值比这三个因子来进行解释。不久,卡哈特改进了三因子模型,添加 了市场动量因子,提出了Carhart四因子模型。

经过若干年的发展,因子投资已经从一种方法论演变成了一种产品 ——智能贝塔基金,并且飞速增长。有资料显示,早在2019年,智能贝 塔基金的资产管理规模就达到了8800亿美元。这种基于多因子模型进行 投资的成功推动了机器学习技术在金融行业的飞速发展。

1.2 机器学习崛起

说起当今全球知名的几家使用机器学习算法进行交易的基金公司, 不得不提到诸如文艺复兴科技公司、德邵基金公司、堡垒投资集团和 Two Sigma公司等。其中,文艺复兴科技公司是由数学家詹姆斯·西蒙斯 在1982年创建的,现在已经成为全球较大的量化投资公司。它的奖章基 金自成立以来,年均收益率较稳定。另外三家基金公司也因为使用基于 算法的交易策略之后,业绩表现亮眼,从而跻身全球前列。

与此同时,越来越多的基金公司转向机器学习技术。人工智能系统 可以从大量数据中学习,并且持续进化。从对冲基金到共同基金,越来 越多的机构使用算法制定交易策略。这也催生出了一个新的物种——量 化基金(Quant funds)。

1.2.1 量化投资风生水起

随着新技术的普及,以往靠基本面分析进行投资的公司也在引入机 器学习技术,并开展量化交易。例如,管理资产规模较大的Point72公司 就已经有相当比例的投资组合是使用人与算法结合的方法来进行管理 的。据摩根士丹利公司所进行的调查来看,截至2020年,在他们从事投 资的客户中,有意愿或者已经在使用机器学习技术进行量化投资的客户 数量,在短短两年间提高了20%。

黑石集团为了能够立于不败之地,大举投资量化交易企业SAE,希 望借这场豪赌击败竞争对手。无独有偶,富兰克林·邓普顿基金集团也 收购了一家名为“随机森林资本”的公司(一家以算法和数据为导向的技 术型企业)。

在中国,很多金融机构也已经觉醒。相信在未来几年,我们也能看 到优秀的本土量化投资公司。

1.2.2 没有数据是不行的

所谓机器学习,其实就是通过若干算法,使用数据训练模型并做出 预测的过程。那么数据的重要性就不言而喻了。假如模型是马路上跑的 汽车,那么数据就是让汽车正常运转的燃料。常规的数据包括经济统计 数据、市场交易数据和上市公司财报。如今,人们使用的数据范围更 广,甚至包括卫星图像、信用卡销售、股民情绪分析、手机地理位置定 位和爬虫抓取等来源。理论上来讲,我们这里说的数据包括任何可以使 用机器学习提取交易信号的信息。

举一个例子,如果在某家上市公司公布财报数据之前,我们可以获 取该公司在招聘网站上发布的招聘岗位数量,就可以先于财报数据发布 了解到该公司的运营状况。假如该公司的招聘人数在上升,则可能说明 该公司业绩良好,自然其股票的价格也可能上涨;反之,假如该公司的 招聘人数锐减,则说明该公司的经营可能有困难,则可能会导致该公司 股价下跌。

当然,最直接有效的数据还是那些能够直接体现用户消费的数据, 如支付数据。在后面的章节,我们会具体来讨论如何使用外部数据,并 将其添加到模型的训练当中。

1.2.3 交易策略和阿尔法因子

说完了算法和数据,下面我们就要讲讲如何将二者结合起来并应用 到投资中。我们先通过各种数据源提取出有效信息,并且通过特征工程 (feature engineering)将数据转换为阿尔法因子(alpha factor),再将 这些因子拿来训练模型,使模型可以对交易品未来的趋势或价格变动做 出预测,并触发买单或者卖单。例如,模型预测次日股价大涨,则下单 买入,反之则卖出。

在这个过程中,阿尔法因子(以下统称为alpha因子)的确定是一个 复杂的工程。在这一步中,我们需要探索输入的数据与目标收益之间的 关系,并进行复杂的特征工程,还要不断测试及对模型进行调优,以此 来优化模型的预测能力。

当然,经过数十年的学术研究,金融学家已经帮我们总结好alpha因 子。如果要给小瓦完全解释明白这背后的理论,我们就要花很大的篇幅 去讲解市场金融理论和投资者行为学等。不过这些不是主线“剧情”,因 此本书不展开介绍了。

1.3 要想富,先配库

我们在前面小节中唠叨了很多内容,相信很多读者朋友也有和小瓦 有一样的想法:说了这么多,我们到底怎么开始呢?下面就给小瓦安排 一些动手的环节。过去人们常说“要想富,先修路”。也就是说,只有搞 好基础设施建设,才能带动经济发展。在量化交易这个环节,基础设施 就是我们使用的工具了。下面咱们就带小瓦一起,把需要的软件环境配 置好。

1.3.1 Anaconda的下载和安装

鉴于小瓦唯一会使用的编程语言是Python,我们选择可以支持 Python的工具。目前比较主流的编辑器包括PyCharm、Jupyter Notebook 等。考虑到小瓦现在主要使用的操作系统是Windows,所以强烈建议小 瓦直接安装Anaconda。原因很简单,Anaconda内置了Python解释器和 Jupyter Notebook,而且习惯使用PyCharm的读者朋友也可以直接调用 Anaconda中的Python解释器,非常方便;更重要的是,Anaconda内置了 很多常用的数据科学库,免去了我们手动安装这些库的过程(要知道如 果自己在Windows系统中手动安装这些库是非常痛苦的)!

下面我们就来教会小瓦如何下载和安装Anaconda,对这部分已经有 了解的读者朋友可以跳过本小节

省略..........

1.3.2 Jupyter Notebook的基本使用方法

省略..........

1.3.3 用真实股票数据练练手

在这一小节中,小瓦就开始使用真实数据集来进行练习了。这里需 要用到一个获取金融数据的库——tushare。需要注意的是, 编写本书时,Anaconda并没有内置这个库,因此小瓦需要单独安装这个 库。这个库的安装非常简单,只要在Jupyter Notebook的单元格中输入下 面这行代码就可以了:

pip3 install tushare –-upgrade

运行这行代码,程序会自动下载这个库并完成安装。

tushare官方网址:https://tushare.pro/

如果想检查tushare 是否安装成功,则可以输入下面的代码:

#导入tushare并重命名为ts
import tushare as ts
#查看datareader的版本信息
ts.__version__

1). 下载股票数据

接下来我们使用tushare获取股票的数据,输入代码如下:

import pandas as pd
import tushare as ts

pd.set_option('expand_frame_repr', False)  # True就是可以换行显示。设置成False的时候不允许换行
pd.set_option('display.max_columns', None)  # 显示所有列
pd.set_option('display.max_rows', None)  # 显示所有行
pd.set_option('colheader_justify', 'centre')  # 显示居中
# 设置token
ts.set_token('你的token')
# 初始化pro接口
pro = ts.pro_api()
#查询当前所有正常上市交易的股票列表
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
# data = pro.query('stock_basic', exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
data.sort_values('symbol', inplace=True)
# 显示行数,列数等:df.info()
# 获取行数:len(df)
# 获取列数:len(df.columns)
# 获取行数和列数:df.shape
# 获取元素总数(大小):df.size
print(data.info())
data.head()

 输出结果:

备注:

#设置token
s.set_token('你的token')

需要去tushare官网注册账户,就有了你的token,登录后个人主页中找

# 股票代码
ts_code="002624.SZ"
# 开始查询的日期
start = "20230101"
# 结束查询的日期
end = "20230209"

# # 周线行情
# df = pro.monthly(ts_code=ts_code, start_date=start, end_date=end)

# # 月线行情
# df = pro.weekly(ts_code=ts_code, start_date=start, end_date=end)

# # 日线行情
df = pro.daily(ts_code=ts_code, start_date=start, end_date=end)

# 按trade_date排序
df.sort_values('trade_date', inplace=True)

# # 提取002624全部复权因子
# df = pro.adj_factor(ts_code='002624.SZ', trade_date='')

# # 提取002624的前复权行情
# df = ts.pro_bar(ts_code='002624.SZ', adj='qfq', start_date='20190101', end_date='20230209')
print(df.info())
df.tail()

 输出结果:

2). 最简单的数据处理

下面我们来做一点简单的处理工作。大家知道,股票每日的涨跌是 用当日的收盘价减去前一个交易日的收盘价来计算的。例如,2023年2 月7日的收盘价约为14.83元,3月6日的收盘价约为14.62元,则2月7日当 天,该股票较前一个工作日上涨了0.21元钱。这样的话,可以在数据表中 添加一个字段,用来表示当日股价较前一日的变化。输入代码如下:

#将新的字段命名为diff,代表difference
#用.diff()方法来计算每日股价变化情况
df['diff'] = df['close'].diff()
#检查一下前5行
df.head()

 输出结果:

3). 设计最简单的交易策略

到这里,小瓦提出了一个问题。我们可以设置一个最简单的交易策 略:如果当日股价下跌,我们就在下一个交易日开盘前挂单买入;反 之,如果当日股价上涨,我们就在下一个交易日开盘前挂单卖出。循环 进行这个步骤,我们不就可以赚钱了吗?

说实话,这个策略听起来还挺不错。我们先不论其是否可行,就单 纯地用代码来试试。要实现这个策略,首先我们来创建一个新的字段 ——Signal(交易信号)。如果diff字段大于0,则Signal标记为1;如果 diff字段小于或等于0,则Signal标记为0。输入代码如下:

#此处会用到numpy,故导入
import numpy as np
#创建交易信号字段,命名为Signal
#如果diff值大于0,则Signal为1,否则为0
df['signal'] = np.where(df['diff'] > 0, 1, 0)
#检查是否成功
df.head()

 输出结果:

使用np.where()可以让程序判 断每日股价是上涨还是下跌:如果上涨,则交易信号为1,代表卖出; 否则交易信号为0,代表买入。这样我们就得到了最简单的交易信号。

4). 交易信号可视化

在得到了交易信号之后,我们可以再来实现最简单的可视化,这样 我们就可以在图像中直观地看到什么时候买入,什么时候卖出了。可视 化的代码部分如下:

import matplotlib.pyplot as plt
import numpy as np

# 设置字体 显示汉字
plt.rcParams["font.sans-serif"] = "SimHei"

# 设置画布的尺寸为10*5
plt.figure(figsize=(10, 5))

# 使用折线图绘制出每天的收盘价
df['close'].plot(linewidth=2, color='k', grid=True)

""" 
    # Matplotlib 散点图
    # scatter() 方法语法格式如下:
    # matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
    # 参数说明:
    # x,y:长度相同的数组,也就是我们即将绘制散点图的数据点,输入数据。
    # s:点的大小,默认 20,也可以是个数组,数组每个参数为对应点的大小。
    # c:点的颜色,默认蓝色 'b',也可以是个 RGB 或 RGBA 二维行数组。
    # marker:点的样式,默认小圆圈 'o'。
    # cmap:Colormap,默认 None,标量或者是一个 colormap 的名字,只有 c 是一个浮点数数组的时才使用。如果没有申明就是 image.cmap。
    # norm:Normalize,默认 None,数据亮度在 0-1 之间,只有 c 是一个浮点数的数组的时才使用。
    # vmin,vmax::亮度设置,在 norm 参数存在时会忽略。
    # alpha::透明度设置,0-1 之间,默认 None,即不透明。
    # linewidths::标记点的长度。
    # edgecolors::颜色或颜色序列,默认为 'face',可选值有 'face', 'none', None。
    # plotnonfinite::布尔值,设置是否使用非限定的 c ( inf, -inf 或 nan) 绘制点。
    # **kwargs::其他参数。
"""
plt.scatter(
            df['close'].loc[df.signal == 1].index,
            df['close'][df.signal == 1],
            marker='v', s=80, c='g')
plt.scatter(df['close'].loc[df.signal == 0].index,
            df['close'][df.signal == 0],
            marker='^', s=80, c='r')
# 将图像进行展示
plt.show()

输出结果:

【结果分析】从折线图中可以看到,倒三角所处的位置是股票收盘 价较上一个交易日上涨的时刻,代表卖出;正三角所处的位置是股票收 盘价较上一个交易日下跌的时刻,代表买入。直观来看,在这个时间范 围内,股价整体呈现出下跌天数大于上涨天数的情况。假设小瓦使用这 个交易策略,且每次买入和卖出的股票数量相同的话,那么她持有这只 股票的仓位会越来越高。

当然,我们不会真的让小瓦使用这个简单的策略去进行实盘交易, 只是通过这些步骤帮助她熟悉一下使用Python进行一些简单的交易数据 处理与可视化的方法。至于某种策略会带来怎样的回报,还要通过回测 (backtesting)来进行评估。关于回测的具体方法,我们会在后面的章 节进行介绍。

1.4 小结

作为本书的第一章,我们简要介绍了主人公小瓦姑娘的情况。面对 有比较强烈的学习动机,且有一点Python语言基础,但对算法和金融知 识所知较少的小瓦,我们首先简单介绍了交易的历史,也稍微阐述了现 代交易的发展现状,目的是让小瓦先对这个领域有一定的认知,并产生 兴趣;最后带着小瓦在Anaconda中,使用Jupyter Notebook做了一点简单 的练习,让她稍微感受一下写代码的乐趣。当然,笔者鼓励读者朋友们 跟小瓦一起进行操作,在动手的过程中掌握更多的知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值