Python 中的自动化交易

2025年3月17日 | 阅读 10 分钟

由于 Python 加速了交易过程,因此这种方法被称为自动化交易或量化交易。Python 的流行归功于其强大的库,如 Pyplot、TA-Lib、Scipy、NumPy、Zipline、Matplotlib、Pandas 等。

什么是自动化交易?

自动化交易通过计算机程序执行预设程序来接受和退出交易,从而参与资本市场。作为交易员,您将深入的统计分析与头寸特征(如开仓、止损和追踪止损)的创建相结合。

自动交易使我们能够在短时间内进行大量交易,同时还能消除投资决策中的情绪因素。这是因为我们的约束条件已经包含了所有交易规则。我们甚至可以使用预先确定的技术来监控趋势并根据某些算法进行交易。

自动化交易如何运作?

我们将首先选择一个平台并定义交易计划的特征。我们将根据我们的交易经验构建一组条款和规则,我们的定制算法将使用这些信息来执行我们账户上的交易。交易的安排、必须开仓或平仓的价格以及数量通常是决定性因素。例如,“当 100 天移动平均线穿过 250 天移动平均线时,买入 100 股谷歌股票。”

建立的自动化交易系统将持续监控金融市场汇率,并在达到预定义条件时自动完成交易。目标是以更快、更有效的方式进行交易,并从技术性市场波动中获利。

自动化系统的优势

让计算机监控市场交易活动并执行交易有很多好处,包括:

情绪控制

在买卖过程中,自动化交易系统可以减少情绪的影响。通过控制情绪,交易员通常能更好地遵守交易计划。当交易规则满足时,交易指令会自动执行,因此交易员无法暂停或质疑交易。

回测

回测通过将交易规则应用于之前的市场数据来确定概念的可行性。在构建自动化交易框架时,所有规则都必须精确,不留任何歧义。机器无法进行有根据的猜测,必须给出明确的指示。交易员可以在冒着资本风险进行交易之前,利用历史数据来评估这些特定规则。

保持纪律

即使在波动时期,纪律也能得到维持,因为市场规则已经形成,并且交易操作会自动执行。诸如害怕亏损或想从交易中榨取更多利润之类的情绪考虑会导致注意力丢失。由于计算机将完全按照设定的方式执行交易策略,因此自动化交易有助于保持纪律。

提高订单输入速度

由于计算机系统对波动的市场情况做出快速响应,因此自动化系统可以在交易条件满足时尽快生成订单。

交易多元化

自动化交易系统可以同时交易多个投资组合或策略。这可以在多个工具之间分散风险,同时为亏损交易提供缓冲。

自动化交易的必要要素

  1. Anaconda:安装 Python 的第一步是安装 Anaconda。Anaconda 是一个可靠的 Python 平台,包含运行 Python 编程所需的所有实用工具和模块。
  2. Spyder IDE:IDE 是集成开发环境的缩写。它提供了一个用于编写、调试、编译和运行 Python 程序的图形用户界面。
  3. Jupyter Notebook:Jupyter Notebook 提供了一个交互式环境用于调试程序。Jupyter Notebook 主要使用“markdown”单元格进行代码解释,使用“code”单元格执行代码。对于试图弄清楚代码片段如何工作的学生来说,它非常有帮助。

Python 中用于自动化交易的有用软件包/库

Python 拥有大量的库,我们可以将其用于编码、机器学习、可视化等各种目的。我们将需要导入金融信息、进行数值分析、创建交易策略、绘制图表以及回测数据。以下是必需的库:

  • NumPy(NumericalPy 的缩写)是一个用于数值数据处理的 Python 包。
  • 在处理表格格式(即行和列)的数据集(如电子表格)时,Pandas 被广泛使用。我们可以在 Python 编程中使用它来加载 Excel 和 CSV 文件。
  • Matplotlib 库包含一种绘制二维图形的方法。
  • TA-Lib 是一个用于对布林带、RSI、VWAP 和 MA(移动平均线)等数据进行技术分析的流行工具。
  • 一个支持回测和实时交易功能的事件驱动平台。

设置工作环境

安装 Anaconda 是开始自动化交易最快的方法。Python 包 Anaconda 包含各种 IDE,包括 Spyder、Jupyter、__、___、分析库等。

安装 Yahoo-Finance 模块

我们可以借助 Yahoo Finance 模块检索股票的历史数据。在终端中键入以下命令行并按 Enter 键来安装 Yahoo Finance:

代码

导入所需包

安装 yfinance 后的下一步是在我们的程序中导入包以运行交易算法。由于回测需要大量数据修改,在本课程中我们将严格使用 Pandas。

代码

获取股票财务信息

yfinance 中的财务数据检索也非常简单。只需将公司的股票代码作为 ticker 函数的参数。下面的代码以特斯拉股票为例:

代码

输出

{'zip': '78725', 'sector': 'Consumer Cyclical', 'fullTimeEmployees': 99290, 'longBusinessSummary': 'Tesla, Inc. designs, develops, manufactures, leases, and sells electric vehicles, and energy generation and storage systems in the United States, China, and internationally? The company was formerly known as Tesla Motors, Inc. and changed its name to Tesla, Inc. in February 2017. Tesla, Inc. was incorporated in 2003 and is headquartered in Austin, Texas.', 'city': 'Austin', 'phone': '(512) 516-8177', 'state': 'TX', 'country': 'United States', 'companyOfficers': [], 'website': 'https://www.tesla.com', 'maxAge': 1, 'address1': '13101 Tesla Road', 'industry': 'Auto Manufacturers', 'ebitdaMargins': 0.20424, 'profitMargins': 0.13505, 'grossMargins': 0.27096, 'operatingCashflow': 13850999808, 'revenueGrowth': 0.805, 'operatingMargins': 0.1549, 'ebitda': 12702000128, 'targetLowPrice': 67, 'recommendationKey': 'buy', 'grossProfits': 13606000000, 'freeCashflow': 7054624768,...}

print 语句会生成一个 Python 字典,我们可以从中获取所需的特定财务数据,然后在分析中使用它。让我们以几个关键的财务指标为例。

info 字典包含所有公司信息。因此,我们可以通过解析字典来提取所需的元素。

代码

输出

0.85
759.19
728613322752

info 字典中还有大量其他内容。通过打印 info 的键,我们可以查看所有内容:

代码

输出

dict_keys(['zip', 'sector', 'fullTimeEmployees', 'longBusinessSummary', 'city', 'phone', 'state', 'country', 'companyOfficers', 'website', 'maxAge', 'address1', 'industry', 'ebitdaMargins', 'profitMargins', 'grossMargins', 'operatingCashflow', 'revenueGrowth', 'operatingMargins', 'ebitda', 'targetLowPrice', 'recommendationKey', 'grossProfits', 'freeCashflow', 'targetMedianPrice', 'currentPrice', 'earningsGrowth', 'currentRatio', 'returnOnAssets',?)

检索历史市场价格

继续介绍 yf 库提供的其他资源。此外,我们还可以利用它来获取历年的市场数据。

我们将在下面的示例中使用特斯拉过去几年的历史股票价格。完成这项任务相对容易,如下所示:

代码

输出

             Open   High    Low  Close    Volume  Dividends  Stock Splits
Date                                                                     
2010-06-29  3.800  5.000  3.508  4.778  93831500          0           0.0
2010-06-30  5.158  6.084  4.660  4.766  85935500          0           0.0
2010-07-01  5.000  5.184  4.054  4.392  41094000          0           0.0
2010-07-02  4.600  4.620  3.742  3.840  25699000          0           0.0
2010-07-06  4.000  4.000  3.166  3.222  34334500          0           0.0

由于我们将 period 设置为 max,因此我们获得了特斯拉目前可用的最大数量的日价格。较短的范围也是可以接受的,例如 1d = 1 天,5d = 5 天,1mo = 1 个月,2y = 2 年都是可接受的选项。

或者,我们可以指定开始和结束日期:

代码

输出

                  Open        High         Low       Close    Volume  \
Date                                                                   
2010-06-29    3.800000    5.000000    3.508000    4.778000  93831500   
2010-06-30    5.158000    6.084000    4.660000    4.766000  85935500   
2010-07-01    5.000000    5.184000    4.054000    4.392000  41094000   
2010-07-02    4.600000    4.620000    3.742000    3.840000  25699000   
2010-07-06    4.000000    4.000000    3.166000    3.222000  34334500   
...                ...         ...         ...         ...       ...   
2020-12-23  632.200012  651.500000  622.570007  645.979980  33173000   
2020-12-24  642.989990  666.090027  641.000000  661.770020  22865600   
2020-12-28  674.510010  681.400024  660.799988  663.690002  32278600   
2020-12-29  661.000000  669.900024  655.000000  665.989990  22910800   
2020-12-30  672.000000  696.599976  668.359985  694.780029  42846000   

此外,我们还可以同时下载多只股票的历史价格:

代码

输出

Date                                                                     
2010-02-01    6.159000    6.243000    5.691000    5.943500    5.943500   
2010-02-02    5.939500    5.949000    5.720000    5.906000    5.906000   
2010-02-03    5.856000    5.980500    5.828000    5.955000    5.955000   
2010-02-04    5.932000    6.016500    5.787000    5.797000    5.797000   
2010-02-05    5.794000    5.882500    5.705000    5.869500    5.869500   
...                ...         ...         ...         ...         ...   
2020-12-23  160.250000  160.506500  159.208496  159.263504  159.263504   
2020-12-24  159.695007  160.100006  158.449997  158.634506  158.634506   
2020-12-28  159.699997  165.199997  158.634506  164.197998  164.197998   
2020-12-29  165.496994  167.532501  164.061005  166.100006  166.100006   
2020-12-30  167.050003  167.104996  164.123505  164.292496  164.292496   

上面的程序会生成一个 Pandas DataFrame,其中包含指定股票的各种价格信息。

然后,我们可以通过打印 DataFrame 的间隔价格来选择一只特定的股票。

亚马逊的 AMZN 股票的历史市场数据将可用。

重要词汇和短语

理解数据意味着什么以及它显示了什么非常重要。

  • “开盘/收盘”是指股票的开盘价和收盘价。
  • 高/低是指股票当天的最高价和最低价。
  • 经调整的最高价/经调整的收盘价反映了近期股票拆分、股息支付或各种公司行为对底层历史数据的影响。

计算每日回报率

回报率是指交易员或投资者在建立多头或空头头寸后股票产生的收益或损失。我们只需使用 pct_change() 函数。

代码

输出

[*********************100%***********************]  1 of 1 completed
                  Open        High         Low       Close   Adj Close  \
Date                                                                     
2010-06-29    3.800000    5.000000    3.508000    4.778000    4.778000   
2010-06-30    5.158000    6.084000    4.660000    4.766000    4.766000   
2010-07-01    5.000000    5.184000    4.054000    4.392000    4.392000   
2010-07-02    4.600000    4.620000    3.742000    3.840000    3.840000   
2010-07-06    4.000000    4.000000    3.166000    3.222000    3.222000   
...                ...         ...         ...         ...         ...   
2020-12-23  632.200012  651.500000  622.570007  645.979980  645.979980   
2020-12-24  642.989990  666.090027  641.000000  661.770020  661.770020   
2020-12-28  674.510010  681.400024  660.799988  663.690002  663.690002   
2020-12-29  661.000000  669.900024  655.000000  665.989990  665.989990   
2020-12-30  672.000000  696.599976  668.359985  694.780029  694.780029   

Date
2010-06-29    0.000000
2010-06-30   -0.002512
2010-07-01   -0.078472
2010-07-02   -0.125683
2010-07-06   -0.160938
                ...   
2020-12-23    0.008808
2020-12-24    0.024444
2020-12-28    0.002901
2020-12-29    0.003465
2020-12-30    0.043229
Name: Adj Close, Length: 2646, dtype: float64

移动平均线

基于动量的交易策略建立在移动平均线的概念之上。金融领域的分析师使用移动周期估计值在可滑动的周期内持续评估统计量。让我们将窗口移动 1 天,以说明我们如何计算 55 天周期的滚动平均值。

代码

输出

Date
2020-12-16    482.089091
2020-12-17    486.214364
2020-12-18    490.702364
2020-12-21    494.970909
2020-12-22    498.873819
2020-12-23    503.092000
2020-12-24    507.391455
2020-12-28    511.714546
2020-12-29    515.932546
2020-12-30    520.523092
Name: Adj Close, dtype: float64

移动平均线通过消除任何数据异常值或不一致之处,为我们提供了更平滑的公司业绩概况。

绘图以查看差异

为了更清晰地显示,我们将绘制移动平均线和经调整的收盘价。

代码

输出

Automated Trading in Python

将它们一起绘制

代码

输出

Automated Trading in Python