适用于金融业的Python(算法交易)

本文概述

  • Python财务入门
  • 共同财务分析
  • 使用Python建立交易策略
  • 回测交易策略
  • 改善交易策略
  • 评估移动平均交叉策略
  • 现在怎么办?
技术已成为金融中的资产:金融机构现在正向技术公司发展, 而不是仅仅专注于财务方面:除了技术带来创新的事实之外, 它还可以加快速度并有助于获得竞争优势, 速度和频率金融交易的增长以及庞大的数据量, 使得金融机构多年来对技术的关注日益增加, 而技术确实已成为金融的主要推动力。
在最热门的金融编程语言中, 你会发现R和Python, 以及C ++, C#和Java等语言。在本教程中, 你将学习如何开始使用Python进行财务。本教程将涵盖以下内容:
  • 你需要入门的基础知识:对于金融新手来说, 你将首先了解有关股票和交易策略, 什么时间序列数据以及设置工作空间所需的知识。
  • 使用Python软件包Pandas对时间序列数据和一些最常见的财务分析进行了介绍, 例如移动窗口, 波动率计算。
  • 简单动量策略的制定:你将首先逐步完成开发过程, 然后首先制定并编写简单的算法交易策略。
  • 接下来, 你将使用Pandas, zipline和Quantopian对已制定的交易策略进行回测。
  • 然后, 你将看到如何优化策略以使其表现更好, 并最终评估策略的性能和稳健性。
在此处下载本教程的Jupyter笔记本。
适用于金融业的Python(算法交易)

文章图片
Python财务入门 在制定交易策略之前, 最好先掌握基本知识。本教程的第一部分将重点介绍入门所需的Python基础知识。但是, 这并不意味着你将完全从零开始:你至少应该完成srcmini的免费的Python数据科学入门课程, 在该课程中, 你学习了如何使用Python列表, 包和NumPy。此外, 希望已经了解了流行的Python数据操作包Pandas的基础知识, 但这不是必需的。
然后, 我建议你参加srcmini的Python金融入门课程, 以学习Python的金融基础。然后, 如果你要将新的” Python for Data Science” 技能应用于现实世界的财务数据, 请考虑参加” 以Python导入和管理财务数据” 课程。
股票与交易
当公司想要发展壮大并进行新项目或扩大规模时, 可以发行股票来筹集资金。股票代表公司所有权的一部分, 以换取金钱而发行。买卖股票:买卖双方买卖现有的, 先前发行的股票。出售股票的价格可以独立于公司的成功而变动:价格反而反映了供求关系。这意味着, 每当某只股票被认为是” 理想” 时, 由于成功, 受欢迎程度……股票价格就会上涨。
请注意, 股票与债券不同, 后者是公司通过借贷(从银行借贷或发行债务)筹集资金的时候。
正如你刚刚读到的, 谈论股票时买卖是必不可少的, 但当然不仅限于此:交易是买卖资产的行为, 可以是金融证券, 例如股票, 债券或有形产品, 例如黄金或石油。
股票交易就是将支付给股票的现金转换为公司所有权的一部分的过程, 可以通过出售将其转换回现金, 而这一切都有望带来利润。现在, 要获得有利可图的回报, 你要么做空, 要么做空:你要么以股票为由, 以为将来股价会上涨以更高的价格卖出, 要么卖出股票, 以期可以买入它以较低的价格返回并实现利润。当你遵循固定的计划去做多或做空市场时, 你就有了交易策略。
制定交易策略需要经历几个阶段, 就像你建立机器学习模型时一样:你制定策略并以可以在计算机上测试的形式指定它, 然后进行一些初步测试或回测, 你可以优化策略, 最后评估策略的性能和稳健性。
交易策略通常通过回测进行验证:你使用历史数据, 使用已开发的策略定义的规则, 使用历史数据重建过去发生的交易。这样, 你可以了解策略的有效性, 并且可以将其用作优化和改进策略的起点, 然后再将其应用于实际市场。当然, 所有这些都在很大程度上依赖于基本理论或信念, 即过去任何可行的策略将来也可能会奏效, 而过去表现不佳的任何策略也可能会有所作为。将来很糟糕。
时间序列数据
时间序列是在连续的等间隔时间点获取的一系列数字数据点。在投资中, 时间序列会在指定的时间段内跟踪选定数据点(例如股票价格)的移动, 并定期记录数据点。如果你仍然不确定究竟是什么样子, 请看以下示例:
适用于金融业的Python(算法交易)

文章图片
分布看起来非常对称且呈正态分布:每日变化集中在垃圾箱0.00周围。但是, 请注意, 如何并且应该使用对Daily_pct_c应用的describe()函数的结果正确解释直方图的结果。你将看到平均值也非常接近0.00 bin, 标准偏差为0.02。另外, 请查看百分位数, 以了解有多少数据点低于-0.010672、0.001677和0.014306。
每日累积累积收益率可用于确定定期投资的价值。你可以通过使用每日百分比变化值, 将它们相加1并使用结果值计算累积乘积来计算每日累积收益率:
注意, 可以再次使用Matplotlib来快速绘制cum_daily_return;只需向其添加plot()函数, 然后可选地确定figsize或图形的大小:
适用于金融业的Python(算法交易)

文章图片
另一个有用的图是散点矩阵。你可以使用pandas库轻松完成此操作。不要忘记在代码中添加scatter_matrix()函数, 以便实际上创建一个散点矩阵:)作为参数, 你传递daily_pct_change, 并作为对角线, 设置要具有内核密度估计(KDE)情节。另外, 你可以使用alpha参数设置透明度, 并使用figsize设置图形大小。
适用于金融业的Python(算法交易)

文章图片
请注意, 在本地工作时, 你可能需要使用绘图模块制作散点图矩阵(即pd.plotting.scatter_matrix())。另外, 很高兴知道内核密度估计图可估计随机变量的概率密度函数。
恭喜你!你已经通过首次财务分析成功地做到了这一点, 在这里你探索了收益!现在是时候进入第二个窗口了。
移动窗户 【适用于金融业的Python(算法交易)】当你在由特定时间段表示的数据窗口上计算统计信息, 然后以指定的时间间隔在数据上滑动窗口时, 会出现移动窗口。这样, 只要窗口首先落在时间序列的日期之内, 就可以连续计算统计量。
熊猫中有很多函数可以计算移动窗口, 例如rolling_mean(), rolling_std()等。
但是, 请注意, 它们中的大多数都将很快被弃用, 因此最好结合使用rolling()和mean()或std()函数, ………当然取决于要精确计算的移动窗口类型。
但是, 移动窗口对你到底意味着什么?
当然, 确切的含义取决于你应用于数据的统计信息。例如, 滚动平均值可以消除短期波动并突出显示数据的长期趋势。
提示:在IPython控制台中尝试使用Pandas软件包随附的一些其他标准移动窗口功能, 例如rolling_max(), rolling_var()或rolling_median()。请注意, 你也可以结合使用rolling()和max(), var()或中位数()来达到相同的结果!请记住, 如果单击此srcmini Light块顶部的文本中提供的链接, 则可以找到更多功能。
当然, 你可能并不真正了解所有这些内容。也许在Matplotlib的帮助下, 一个简单的图可以帮助你理解滚动平均值及其实际含义:
适用于金融业的Python(算法交易)

文章图片
让我们开始简单并制定一个新算法, 但仍然遵循我们的移动平均交叉的简单示例, 这是你在zipline快速入门指南中找到的标准示例。
碰巧这个示例与你在上一节中实现的简单交易策略非常相似。但是, 你会看到下面的代码块和上面的屏幕快照中的结构与你在本教程中到目前为止看到的结构有些不同, 即, 你有两个开始使用的定义, 即initialize()和handle_data():
def initialize(context): context.sym = symbol('AAPL') context.i = 0def handle_data(context, data): # Skip first 300 days to get full windows context.i += 1 if context.i < 300: return# Compute averages # history() has to be called with the same params # from above and returns a pandas dataframe. short_mavg = data.history(context.sym, 'price', 100, '1d').mean() long_mavg = data.history(context.sym, 'price', 300, '1d').mean()# Trading logic if short_mavg > long_mavg: # order_target orders as many shares as needed to # achieve the desired number of shares. order_target(context.sym, 100) elif short_mavg < long_mavg: order_target(context.sym, 0)# Save values for later inspection record(AAPL=data.current(context.sym, "price"), short_mavg=short_mavg, long_mavg=long_mavg)

当程序启动并执行一次性启动逻辑时, 将调用第一个函数。作为参数, initialize()函数采用一个上下文, 该上下文用于在回测或实时交易期间存储状态, 并且可以在算法的不同部分中进行引用, 如下面的代码所示;你会看到上下文在第一个移动平均窗口的定义中返回。你将看到通过证券(在这种情况下为APL)的符号(在这种情况下为APL)将证券的搜索结果分配给context.security。
在模拟或实时交易期间, 每分钟调用一次handle_data()函数, 以决定每分钟应下达的订单(如果有)。该函数需要上下文和数据作为输入:上下文与你刚刚阅读的上下文相同, 而数据是一个对象, 该对象存储多个API函数, 例如current()以检索给定的最新值给定资产或历史记录的字段, 以获取历史价格或交易量数据的尾随窗口。这些API函数不会出现在下面的代码中, 也不属于本教程的范围。
请注意, 例如, 你在Quantopian控制台中键入的代码只能在平台本身上运行, 而不能在本地Jupyter Notebook中使用!
你会看到该数据对象使你可以检索价格(如果有的话, 该价格是向前填充的, 并返回最近的已知价格)。如果没有, 将返回一个NaN值。
你在上面的代码块中看到的另一个对象是投资组合, 它存储有关……的重要信息。你的投资组合。如你在代码片段context.portfolio.positions中所看到的, 此对象存储在上下文中, 然后在上下文必须作为用户提供给你的核心功能中也可以访问。请注意, 你刚刚阅读的头寸将存储Position对象, 并包括诸如股票数量和作为价格支付的价格之类的信息。此外, 你还看到投资组合还具有现金属性以检索投资组合中的当前现金量, 并且头寸对象还具有金额属性以探索特定头寸中的全部股份数量。
order_target()下订单以将头寸调整为目标股份数。如果资产中没有现有头寸, 则会下达完整目标编号的订单。如果资产中有头寸, 则将下达目标股份或合约数量与当前持有数量之差的订单。下达负目标定单将导致空头头寸等于指定的负数。
提示:如果对功能或对象还有其他疑问, 请确保检查” Quantopian帮助” 页面, 该页面包含有关本教程中简要介绍的所有(以及更多)信息。
使用initialize()和handle_data()函数(或将上面的代码复制粘贴)创建策略到界面左侧的控制台后, 只需按” Build Algorithm” 按钮即可构建代码并进行回测。如果你按下” 运行全面回溯测试” 按钮, 则会运行全面回溯测试, 该流程与构建算法时所执行的完全相同, 但是你将能够看到更多详细信息。无论是” 简单” 测试还是完整测试, 回测都可能需要一段时间。确保注意页面顶部的进度条!
适用于金融业的Python(算法交易)

文章图片
你可以在此处找到有关如何开始使用Quantopian的更多信息。
请注意, Quantopian是使用zipline入门的简便方法, 但是你始终可以继续在本地使用库, 例如??Jupyter笔记本。
改善交易策略 你已经成功制作了一个简单的交易算法, 并通过Pandas, Zipline和Quantopian执行了回测。可以说你已经开始使用Python进行交易了。但是, 当你制定了交易策略并对其进行了回测后, 你的工作还没有停止;你可能需要改善策略。可以使用一种或多种算法在连续基础上改进模型, 例如KMeans, k最近邻(KNN), 分类树或回归树和遗传算法。这将是将来的srcmini教程的主题。
除了可以使用的其他算法之外, 你还看到可以通过使用多符号组合来改善策略。仅将一个公司或符号纳入你的策略通常并不能说太多。你还会在评估移动平均交叉策略时看到这一点。你可以添加或以其他方式执行的其他操作是使用风险管理框架或使用事件驱动的回测, 以帮助减轻你先前了解的前瞻性偏见。你还有许多其他方法可以改善策略, 但是现在, 这是一个良好的起点!
评估移动平均交叉策略 改善策略并不意味着你就算完成了!你可以轻松地使用Pandas来计算一些指标, 以进一步判断你的简单交易策略。首先, 你可以使用Sharpe比率来了解你投资组合的回报是你决定进行明智投资还是承担大量风险的结果。
当然, 理想的情况是回报是可观的, 但投资的额外风险则应尽可能小。这就是为什么投资组合的夏普比率越大越好:回报与所产生的额外风险之间的比率是可以接受的。通常, 投资者可以接受大于1的比率, 2的比率非常好, 3的比率很好。
让我们看看你的算法是如何做的!
请注意, 本教程的Sharpe比率的定义中未包含无风险利率, 并且通常不将Sharpe比率视为独立的比率:通常将其与其他股票进行比较。因此, 解决此问题的最佳方法是通过使用更多数据(来自其他公司)扩展你的原始交易策略!
接下来, 你还可以计算最大跌幅, 该跌幅用于衡量投资组合价值从峰值到谷底的最大单次下跌, 以便在达到新峰值之前。换句话说, 分数表示基于某种策略选择的投资组合的风险。
适用于金融业的Python(算法交易) 请注意, 将min_periods设置为1是因为你希望让前252天的数据具有扩展窗口。
接下来是复合年增长率(CAGR), 它将为你提供一段时间内的恒定回报率。换句话说, 利率告诉你在投资期结束时你真正拥有什么。你可以通过先将投资的最终价值(EV)除以投资的初始价值(BV)来计算此汇率。你将结果提高到1 / n的幂, 其中n是周期数。你从结果中减去1, 就可以看到CAGR!
也许公式更清晰:\ [((EV / BV)^ {1 / n}-1 \]
请注意, 在下面的代码块中, 你会看到考虑了天数, 因此将1调整为365天(等于1年)。
除了这两个指标, 你还可以考虑其他许多指标, 例如收益分配, 贸易水平指标, …
现在怎么办? 做得好, 你已经通过此Python Finance入门教程实现了!你已经涉足了很多领域, 但是还有更多的发现要探索!首先参加srcmini的Python金融入门课程, 以了解更多基础知识。
你还应该阅读Yves Hilpisch的《 Python for Finance》一书, 对于那些已经拥有一定金融背景但对Python不太了解的人来说, 这是一本不错的书。对于那些想开始使用Python进行金融学习的人, 也推荐Michael Heydt撰写的” 掌握数据科学的熊猫” !另外, 请务必查看Quantstart的文章, 以获取有关算法交易的指导性教程以及有关金融金融Python编程的完整系列文章。
如果你对使用R继续从事金融之旅更感兴趣, 请考虑参加srcmini的R定量分析师。同时, 请继续发布我们的第二篇有关使用Python启动财务的文章, 并查看本教程的Jupyter笔记本。
本网站提供的信息不是财务建议, 所有作者都不是财务专业人员。本网站上提供的材料应仅用于提供信息, 绝不应该作为财务建议。我们对任何信息的准确性, 完整性, 适用性或有效性不做任何陈述。对于因其显示或使用而引起的任何错误, 遗漏或任何损失, 伤害或损坏, 我们概不负责。所有信息均按原样提供, 不提供任何担保, 也不授予任何权利。另外, 请注意, 此类材料不会定期更新, 因此某些信息可能不是最新信息。在做出有关财务管理的决定时, 请务必咨询你自己的财务顾问。在未首先评估你自己的个人和财务状况或未咨询财务专家的情况下, 切勿使用此博客中提到的思想和策略。

    推荐阅读