Python 算法交易秘籍(五)(2)https://developer.aliyun.com/article/1523020
MACD-Bracket-Order 策略 – 获取回测报告 – 盈亏表
在 AlgoBulls 平台上提交回测作业后,AlgoBulls 回测引擎开始执行策略。在其执行过程中,除了日志外,AlgoBulls 回测引擎还实时生成 P&L 表。该表包含了策略输入的每一笔交易的信息。它还包含了入口和出口订单之间的映射、交易 P&L 和累积 P&L 的详细信息,按时间顺序排序,最新的订单排在最前面。
这个表格通过个人和累积 P&L 数字帮助我们了解策略的整体表现。入口-出口订单映射也有助于验证策略的行为。
在这个食谱中,你将获取你的策略的 P&L 表报告。在提交回测作业后,只要你的策略打出第一笔交易,这个报告就可以获得。AlgoBulls 平台允许你实时获取 P&L 表,即使回测作业仍在进行中。在作业运行时间较长时,这对于获取策略表现的洞察力是有帮助的。pyalgotrading
包提供了一个简单的方法,你可以用它来获取给定策略的 P&L 表。
确保你已经浏览了上一章的最后六个食谱,以完整地了解我们将使用的策略类的情况;也就是说,StrategyMACDBracketOrder
。
准备就绪
确保你的 Python 命名空间中有algobulls_connection
和strategy_code2
对象可用。请参考本章的 MACD-Bracket-Order 策略 – 获取策略 食谱设置algobulls_connection
和strategy_code2
对象。
如何操作…
获取strategy_code2
的回测 P&L 报告:
>>> algobulls_connection.get_backtesting_report_pnl_table(strategy_code2)
我们得到了以下输出。你的输出可能会有所不同(注意以下输出已经分成多个表格以便表示。你在 Jupyter Notebook 中将看到一个宽表):
运作原理…
在本示例中,您可以使用algobulls_connection
对象的get_backtesting_report_pnl_table()
方法实时获取回测 P&L 表。 此方法接受策略代码作为参数。 在此处传递strategy_code2
。 返回数据是一个带有多列的pandas.DataFrame
对象,描述如下:
instrument
:输入的金融工具。entry_timestamp
:放置进入订单的时间戳。(请注意,它可能在进入'COMPLETE'
状态之前保持一段时间处于'OPEN'
状态。可以通过订单历史表找到此状态转换的时间,如本章的最后一个示例所述。)entry_transaction_type
:进入订单交易类型(BUY
或SELL
)。entry_quantity
:进入订单数量。进入价格
:进入订单执行并进入'COMPLETE'
状态的价格。退出时间戳
:放置退出订单的时间戳。(请注意,它可能在进入'COMPLETE'
状态之前保持一段时间处于'OPEN'
状态。)exit_transaction_type
:退出订单交易类型(BUY
或SELL
)。exit_quantity
:退出订单数量。退出价格
:退出订单执行并进入'COMPLETE'
状态的价格。pnl_absolute
:退出订单执行价格与进入订单执行价格之间的差值。 在数学上,这可以表示为(退出价格 - 进入价格)*退出数量(对于多头交易),以及(进入价格 - 退出价格)*退出数量(对于空头交易)。 正值意味着交易是盈利交易。 负值意味着交易是亏损交易。pnl_percentage
:相对于进入价格的利润或损失的百分比。 在数学上,这是 pnl_absolute / *entry_price / exit_quantity *× 100。pnl_cumulative_absolute
:累积利润或损失。 在数学上,这是以前交易的所有pnl_absolute
值的总和。 这个数字直接反映了策略相对于模拟时间的表现。pnl_cumulative_percentage
:相对于进入价格的累积利润或损失的百分比。 在数学上,这是 pnl_cumulative / entry_price / exit_quantity ×* 100*。
还有更多…
一旦回测作业转移到'STOPPED'
状态,P&L 表报告将不再更新。 您可以在提交下一个相同策略的回测作业之前随时获取完整的 P&L 报告。 如果提交了新的回测作业(针对相同的策略),则将无法通过get_backtesting_report_pnl_table()
方法再访问此报告。 如果您希望稍后参考,可以将获取的报告保存为.csv
文件。
MACD-Bracket-Order 策略 - 获取回测报告 - 统计表
在 AlgoBulls 平台上提交回测任务后,AlgoBulls 回测引擎开始执行策略。在执行过程中,除了日志和 P&L 表之外,AlgoBulls 回测引擎还实时从 P&L 表生成摘要。这个摘要是一个包含各种统计数字的统计表,比如净利润
(绝对值和百分比)、最大回撤
(绝对值和百分比)、总交易次数、盈利交易、亏损交易、多头交易和空头交易的计数、最大盈利和最小盈利(或最大亏损)、以及每笔盈利和亏损交易的平均利润。这张表可以让我们快速了解策略的整体表现。
在这个配方中,您将为您的策略获取统计表报告。此报告在您提交回测任务后,您的策略打入第一笔交易后即可获取。AlgoBulls 平台允许您实时获取统计表,即使回测任务仍在进行中。您可以在等待回测任务完成时获得对策略性能的见解,这在任务运行时间较长时非常有用。pyalgotrading
包提供了一个简单的方法,我们可以使用它来获取给定策略的统计表。
确保您已经阅读了上一章的最后六个配方,以完全了解我们将使用的策略类别;即StrategyMACDBracketOrder
。
准备工作
确保您的 Python 命名空间中有 algobulls_connection
和 strategy_code2
对象可用。请参考本章的 MACD-Bracket-Order 策略 - 获取策略 配方来设置 algobulls_connection
和 strategy_code2
对象。
如何操作…
获取 strategy_code2
的回测统计报告:
>>> algobulls_connection.get_backtesting_report_statistics(strategy_code2)
我们得到以下输出(您的输出可能会有所不同):
工作原理…
在这个配方中,您可以使用 algobulls_connection
对象的 get_backtesting_report_statistics()
方法实时获取回测统计表。此方法接受策略代码作为参数。您在这里传递了 strategy_code2
。返回的数据是一个 pandas.DataFrame
对象,有两列 - Highlight
和 Value
- 以及多行。行的描述如下:
净利润
:累积回测净利润。这也是 P&L 表中第一个条目的pnl_cumulative_absolute
值。净利润 %
:累积回测利润百分比。这也是 P&L 表中第一个条目的pnl_cumulative_percentage
值。最大回撤
:P&L 表中pnl_cumulative
列中的最低值。这表示您的策略在执行过程中遇到的最大损失。最大回撤 %
:在数学上,这是 (最大回撤) / (相应的 entry_price) / exit_quantity × 100。交易次数
:会话期间的总交易次数(入场和出场计算为一次)。盈利次数
:交易 P&L 为非负数的交易计数。亏损次数
:交易 P&L 为负数的交易计数。买入交易数
:以'BUY'
为入场交易类型的交易计数。卖出交易数
:以'SELL'
为入场交易类型的交易计数。最大利润
:所有交易中 P&L 值最大的交易的 P&L。最小利润
:所有交易中 P&L 值最小的交易的 P&L。每次盈利交易的平均利润
:从数学上讲,这是 (盈利交易的总 P&L) / (盈利交易的计数)。每次亏损交易的平均利润
:从数学上讲,这是 (亏损交易的总 P&L) / (亏损交易的计数)。
还有更多…
如果在回测作业仍在运行时获取统计表,则上述数字将是中间数字,基于直到该时刻已完成的交易。随着更多交易的输入,这些数字可能会发生变化,直到回测作业完成。
一旦回测作业转移到 'STOPPED'
状态,统计表将不再更改。您可以在提交下一个相同策略的回测作业之前的任何时间获取完整的统计表。如果提交了新的回测作业(针对相同策略),则无法通过 get_backtesting_report_statistics()
方法访问此表。如果您希望稍后参考,可以将获取的报告保存为 .csv
文件。
MACD-Bracket-Order 策略 - 获取回测报告 - 订单历史
在 AlgoBulls 平台上提交回测作业后,AlgoBulls 回测引擎开始执行策略。在执行过程中,除了日志、P&L 表和统计表之外,AlgoBulls 回测引擎还实时生成订单历史记录。此日志包含每个订单的状态转换,以及每个订单状态的时间戳和附加信息(如果有)。订单历史记录对于了解交易从 'OPEN'
到 'COMPLETE'
或 'CANCELLED'
状态所需的时间非常重要。例如,MARKET
订单将立即从 'OPEN'
转移到 'COMPLETE'
,但是 LIMIT
订单可能需要一段时间,根据市场条件,从 'OPEN'
转移到 'COMPLETE'
- 甚至可能会被 'CANCELLED'
。所有这些信息都在订单历史记录中提供。(有关订单状态转换的更多信息,请参阅第六章的状态机图,在交易所上下单。)
在这个配方中,您将获取您的策略的订单历史记录。只要您提交了回测作业后,您的策略就 punched in 第一笔交易,这个日志就可用了。AlgoBulls 平台允许您实时获取订单历史记录,即使回测作业仍在进行中。这样我们就可以获得处于最终状态的订单的详细信息,而不必等待回测作业完成。pyalgotrading
软件包提供了一种简单的方法,我们可以用它来获取给定策略的订单历史记录。
确保您已经阅读了前一章节的最后几个配方,以完全了解我们将使用的策略类StrategyMACDBracketOrder
。
准备就绪
确保algobulls_connection
和strategy_code2
对象在您的 Python 命名空间中可用。请参考本章的MACD-Bracket-Order strategy – fetching the strategy配方设置algobulls_connection
和strategy_code2
对象。
怎么做…
获取strategy_code2
的回测订单历史报告:
>>> order_history = algobulls_connection.get_backtesting_report_order_history(strategy_code2) >>> print(order_history)
我们得到以下输出(您的输出可能不同):
... +------------------+---------------------+----------------------------------+------+ | INST | TIME | ID | TT | |------------------+---------------------+----------------------------------+------| | NSE_EQ:TATASTEEL | 2020-07-03 10:00:00 | 03436b72ad8a47a8b29bb727876b0b95 | BUY | +------------------+---------------------+----------------------------------+------+ +----+---------------------+------------------------+-------+ | | TIME | STATE | MSG | |----+---------------------+------------------------+-------| | 0 | 2020-07-03 10:00:00 | PUT ORDER REQ RECEIVED | | | 1 | 2020-07-03 10:00:00 | VALIDATION PENDING | | | 2 | 2020-07-03 10:00:00 | OPEN PENDING | | | 3 | 2020-07-03 10:00:00 | TRIGGER PENDING | | | 4 | 2020-07-03 12:30:00 | OPEN | | | 5 | 2020-07-03 12:30:00 | COMPLETE | | +----+---------------------+------------------------+-------+ +------------------+---------------------+----------------------------------+------+ | INST | TIME | ID | TT | |------------------+---------------------+----------------------------------+------| | NSE_EQ:TATASTEEL | 2020-07-03 10:00:00 | 62458cf47d5f4a12b6c31c490451fdb0 | BUY | +------------------+---------------------+----------------------------------+----- + +----+---------------------+------------------------+-------+ | | TIME | STATE | MSG | |----+---------------------+------------------------+-------| | 0 | 2020-07-03 10:00:00 | PUT ORDER REQ RECEIVED | | | 1 | 2020-07-03 10:00:00 | VALIDATION PENDING | | | 2 | 2020-07-03 10:00:00 | OPEN PENDING | | | 3 | 2020-07-03 10:00:00 | OPEN | | | 4 | 2020-07-03 12:30:00 | CANCEL PENDING | | | 5 | 2020-07-03 12:30:00 | CANCELLED | | +----+---------------------+------------------------+-------+ ...
这里没有显示完整的输出。请访问以下链接以阅读完整的输出:github.com/algobulls/pyalgostrategypool/blob/master/pyalgostrategypool/sample/backtesting/strategy_macd_bracket_order/oms_order_history.log
。
工作原理…
在这个配方中,您使用algobulls_connection
对象的get_backtesting_report_order_history()
方法来实时获取订单历史记录。此方法接受策略代码作为参数。您在这里传递了strategy_code2
。返回的数据是一个字符串,描述如下:
对于每个订单,日志包含以下信息:
- 订单的描述性表,包括以下列:
INST
:订单的金融工具TIME
:订单被放置的时间ID
:订单的唯一标识符TT
:订单交易类型(BUY
或SELL
)
表的示例如下所示:
+------------------+---------------------+----------------------------------+------+ | INST | TIME | ID | TT | |------------------+---------------------+----------------------------------+------| | NSE_EQ:TATASTEEL | 2020-07-03 10:00:00 | 03436b72ad8a47a8b29bb727876b0b95 | BUY | +------------------+---------------------+----------------------------------+------+
这些信息将帮助您在策略执行日志中找到这个确切的订单。
- 一个订单状态转换表,具有以下列:
TIME
:订单进入由'STATE'
列表示的状态的时间戳。STATE
:订单在'STATE'
列中的状态进入时间戳所述的时间。MSG
:OMS 对于任何意外状态转换的额外消息;例如,进入REJECTED
状态的订单具有来自 OMS 的说明其被拒绝原因的消息。此列通常为空。
表的示例如下所示:
+----+---------------------+------------------------+-------+ | | TIME | STATE | MSG | |----+---------------------+------------------------+-------| | 0 | 2020-07-03 10:00:00 | PUT ORDER REQ RECEIVED | | | 1 | 2020-07-03 10:00:00 | VALIDATION PENDING | | | 2 | 2020-07-03 10:00:00 | OPEN PENDING | | | 3 | 2020-07-03 10:00:00 | TRIGGER PENDING | | | 4 | 2020-07-03 12:30:00 | OPEN | | | 5 | 2020-07-03 12:30:00 | COMPLETE | | +----+---------------------+------------------------+-------+
从这个表格可以看出,在上午 10:00 下单后,订单转移到'OPEN PENDING'
状态。在停留了 2.5 小时后,订单转移到'COMPLETE'
状态。这是预期的,因为该订单是一个区间限价订单。
还有更多…
一旦回测任务转移到'STOPPED'
状态,将不再生成新的订单历史日志。在提交下一个相同策略的回测任务之前,您可以随时获取完整的订单历史日志。如果提交了新的回测任务(针对相同的策略),则无法再通过get_backtesting_report_order_history()
方法访问这些日志。如果您希望在以后参考这些日志,可以将获取的日志保存到文件中。
第十章:算法交易 - 模拟交易
在第八章 算法交易策略 - 编码 - 逐步 中构建算法交易策略,并在上一章成功进行了令人满意的回测后,下一步是在实时市场中模拟交易这些策略。
模拟交易 是在实时市场小时内执行交易策略的方法,仅通过实时记录来自策略执行的交易。这些交易不通过经纪人使用真实资金执行。之前,这些交易记录是在纸上完成的,因此称为 纸上交易。这些虚拟交易可用于分析风险和回报指标。典型的模拟交易指标包括 盈亏(P&L)、最大回撤、总交易次数、盈利交易、亏损交易、多头交易和空头交易、每个盈利和亏损交易的平均利润等。应至少进行几个交易日的模拟交易,并在这些指标满足必要要求之前,整个过程应重复进行,包括更新策略参数和/或策略实施,然后进行回测和模拟交易。
模拟交易背后的基本思想是,交易策略可以在实时市场中执行,几乎与实际交易相似,但不冒真实资金的风险。模拟交易有助于确保过去的市场情景,用于回测的情景仍然有效。如果过去的市场情景当前不再存在,即使回测结果盈利,模拟交易结果可能会相反。这表明在将策略用于真实资金之前,策略参数和/或策略实施需要更多工作。
对于模拟交易,需要一个策略配置。其中包含多个参数,其中一些如下:
- 开始和结束时间:在当前一天内进行模拟交易的时间段。
- 金融工具:应进行模拟交易的一个或多个金融工具。
- 蜡烛间隔:各种可能的蜡烛间隔之一 - 例如,
1 分钟
、15 分钟
、小时
或日
。 - 策略特定参数:策略中定义的自定义参数的值。
- 策略模式:即日内或交割。日内策略进行日内订单,这些订单在一天结束时平仓。交割策略进行交割订单,这些订单不会在一天结束时平仓,并会延续到下一个交易日。
执行模拟交易需要一个模拟交易引擎。在本章中,您将使用 AlgoBulls 提供的模拟交易引擎(algobulls.com
),这是一个通过其开发者选项提供服务的算法交易平台。它提供了一个名为 pyalgotrading
的 Python 包(github.com/algobulls/pyalgotrading
)来使用这些服务。
您已经在第八章,算法交易策略 - 逐步编码,中编写了两种算法交易策略。请回想策略描述如下:
- EMA-Regular-Order 策略:基于 EMA 技术指标和常规订单的策略。(第八章的前六个配方,算法交易策略 - 逐步编码。)
- MACD-Bracket-Order 策略:基于 MACD 技术指标和括号订单的策略。(第八章的后六个配方,算法交易策略 - 逐步编码。)
这些策略也作为 Python 包的一部分提供,pyalgostrategypool
。您可以使用 pip
安装它,如下所示:$ pip install pyalgostrategypool
。
您还可以在 GitHub 上查看它们(github.com/algobulls/pyalgostrategypool
)。
由于您已经按照第八章,算法交易策略 - 逐步编码,将这两种策略上传到您的 AlgoBulls 账户。在本章中,您将从您的 AlgoBulls 账户中获取这些策略并对其进行模拟交易。在模拟交易后,您将获得策略执行日志和各种报告 - 即损益报告、统计报告和订单历史。这些日志和报告有助于验证策略的性能,并为实际交易做准备。通过使用 pyalgotrading
,您可以确保在模拟交易中专注于开发和验证策略,而不必担心策略执行所需的生态系统。
本章包括了逐步配方,涵盖了之前提到的两种策略,从与 AlgoBulls 平台建立连接、获取策略、运行模拟交易任务到获取执行日志和各种类型的报告。
本章将涵盖以下内容:
- EMA-Regular-Order 策略 – 获取该策略
- EMA-Regular-Order 策略 – 模拟交易该策略
- EMA-Regular-Order 策略 – 实时获取模拟交易日志
- EMA-Regular-Order 策略 – 获取模拟交易报告 – 损益表
- EMA-Regular-Order 策略 – 获取模拟交易报告 – 统计表
- EMA-Regular-Order 策略 – 获取模拟交易报告 – 订单历史
- MACD-Bracket-Order 策略 – 获取策略
- MACD-Bracket-Order 策略 – 模拟交易策略
- MACD-Bracket-Order 策略 – 获取实时模拟交易日志
- MACD-Bracket-Order 策略 – 获取模拟交易报告 – P&L 表
- MACD-Bracket-Order 策略 – 获取模拟交易报告 – 统计表
- MACD-Bracket-Order 策略 – 获取模拟交易报告 - 订单历史
只有在实时市场小时内运行的模拟交易才有意义,与可以在任何时间运行的回测不同。请确保您在实时市场小时内尝试本章的配方。
技术要求
要成功执行本章的配方,您需要以下内容:
- Python 3.7+
- Python 软件包:
pyalgotrading
($ pip install pyalgotrading
)
本章的最新 Jupyter 笔记本可在 GitHub 上找到,网址为github.com/PacktPublishing/Python-Algorithmic-Trading-Cookbook/tree/master/Chapter10
。
EMA-Regular-Order 策略 – 获取策略
在这个步骤中,您将从您在 AlgoBulls 平台上的帐户中获取策略类StrategyEMARegularOrder
,这是您在第八章中通过EMA-Regular-Order 策略 – 在 AlgoBulls 交易平台上上传策略步骤中上传的。这个步骤首先建立到 AlgoBulls 平台的连接,查询您帐户中所有可用的策略,并获取所需策略类StrategyEMARegularOrder
的详细信息。
确保您已经完成第八章中的前六个配方,Algorithmic Trading Strategies – Coding Step by Step,以获取使用的策略类StrategyEMARegularOrder
的完整图片。
如何操作…
我们为本配方执行以下步骤:
- 导入必要的模块:
>>> from pyalgotrading.algobulls import AlgoBullsConnection
- 创建一个新的 AlgoBulls 连接对象:
>>> algobulls_connection = AlgoBullsConnection()
- 获取授权 URL:
>>> algobulls_connection.get_authorization_url()
我们得到以下输出:
Please login to this URL with your AlgoBulls credentials and get your developer access token: https://app.algobulls.com/user/login 'https://app.algobulls.com/user/login'
- 使用您的 AlgoBulls 凭据登录到上述链接,获取您的令牌,并在此处设置它(有关更多详情,请参阅附录 II):
>>> algobulls_connection.set_access_token( '80b7a69b168c5b3f15d56688841a8f2da5e2ab2c')
- 获取并显示到目前为止您创建和上传的所有策略:
>>> all_strategies = algobulls_connection.get_all_strategies() >>> all_strategies
我们得到以下输出。您的输出可能不同(确保您已经按照第八章中的配方,Algorithmic Trading Strategies – Coding Step by Step,来获得类似的输出):
- 获取并显示第一个策略的策略代码:
>>> strategy_code1 = all_strategies.iloc[0]['strategyCode'] >>> strategy_code1
我们得到以下输出(您的输出可能不同):
'49287246f9704bbcbad76ade9e2091d9'
- 在模拟交易您的策略之前,您可以检查它以确保您有正确的策略:
>>> strategy_details1 = \ algobulls_connection.get_strategy_details(strategy_code1) >>> print(strategy_details1)
我们得到以下输出:
class StrategyEMARegularOrder(StrategyBase): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.timeperiod1 = self.strategy_parameters['timeperiod1'] self.timeperiod2 = self.strategy_parameters['timeperiod2'] self.main_order = None def initialize(self): self.main_order = {} @staticmethod def name(): return 'EMA Regular Order Strategy' …. def strategy_exit_position(self, candle, instrument, sideband_info): if sideband_info['action'] == 'EXIT': self.main_order[instrument].exit_position() self.main_order[instrument] = None return True return False
这里没有显示完整的输出。请访问以下链接以阅读完整的输出:github.com/algobulls/pyalgostrategypool/blob/master/pyalgostrategypool/strategy_ema_regular_order.py
如何运作…
您在第 1 步中导入了必要的模块。在第 2 步中,创建了 AlgoBullsConnection
类的一个实例,命名为 algobulls_connection
。在第 3 步中,您使用 algobulls_connection
对象的 get_authorization_url()
方法获取授权 URL。这将打印授权 URL。您应该从您的 Web 浏览器中访问此 URL,以登录 AlgoBulls 平台并获取您的开发者访问令牌。(您可以在 附录 II 中找到有关从 AlgoBulls 平台获取开发者访问令牌的更多详细信息和截图。)您复制访问令牌,并在第 4 步中使用 algobulls_connection
的 set_access_token()
方法设置它。如果令牌被接受,则会建立与 AlgoBulls 平台的成功连接。
在第 5 步,您获取到目前已经在 AlgoBulls 平台上创建并上传的所有策略。您可以使用 get_all_strategies()
方法来完成这一步,并将其赋值给一个新变量 all_strategies
。这个变量是一个 pandas.DataFrame
对象,具有 strategyCode
和 strategyName
两列。该表格保存了您之前上传的策略代码和策略名称的信息。如果您按照 第八章 中的 EMA-Regular-Order 策略——将策略上传至 AlgoBulls 交易平台 这一步骤,您会找到一个名为 EMA-Regular-Order 策略
的策略。在第 6 步,您将 EMA-Regular-Order 策略
策略的策略代码赋值给一个新变量 strategy_code1
。该策略代码将显示在此步骤的输出中。这个策略代码对于 AlgoBulls 平台上的每个策略都是唯一的。
最后,在第 7 步,您确保由 strategy_code1
引用的策略确实是您之前上传的策略(在 第八章 中的 EMA-Regular-Order 策略——将策略上传至 AlgoBulls 交易平台 步骤中,在 Algorithmic Trading Strategies – Coding Step by Step)。您使用 algobulls_connection
对象的 get_strategy_details()
方法来检查策略。此方法以策略代码作为参数。您在这里传递 strategy_code1
。此方法将整个类代码作为字符串返回。您将其分配给一个新变量 strategy_details1
,并显示它。
如果您想要更改strategy_code1
所引用的类代码,如步骤 7所示,请参考第八章中EMA-Regular-Order 策略 - 在 AlgoBulls 交易平台上上传策略配方的*There’s more…*部分,算法交易策略 - 逐步编码。
EMA-Regular-Order 策略 - 对策略进行纸张交易
在这个配方中,您将在EMA-Regular-Order
策略上进行纸张交易。您必须在上一个配方中从 AlgoBulls 平台上的账户中获取此策略。您将利用pyalgotrading
提供的纸张交易功能进行此配方,该功能反过来在 AlgoBulls 平台上提交了一份纸张交易作业。
提交后,AlgoBulls 纸张交易引擎将运行纸张交易。您可以随时查询状态,以了解纸张交易作业的状态。作业按照以下给定顺序经历以下状态:
'STARTING'
(中间状态)'STARTED'
(稳定状态)'STOPPING'
(中间状态)'STOPPED'
(稳定状态)
提交作业后,它将以中间状态'STARTING'
开始。在此状态下,AlgoBulls 纸张交易引擎将获取策略并准备执行环境,这可能需要几分钟的时间。一旦完成,作业将转移到'STARTED'
状态。纸张交易策略在此阶段发生。在此阶段,它保持不变,直到纸张交易完成。完成后,作业将移动到中间状态'STOPPING'
。在此状态下,AlgoBulls 纸张交易引擎将清理为此作业分配的资源,这通常需要不到一分钟的时间。最后,作业将移动到'STOPPED'
状态。
如果您已经提交了策略纸张交易作业,则在第一个作业完成之前,不能提交另一个相同策略的作业。这意味着您必须等待第一个作业进入'STOPPED'
状态。如果第一个作业运行时间较长,并且您希望立即停止它,则可以通过pyalgotrading
提交停止作业请求。在提交请求之前,您需要确保作业处于'STARTED'
状态。
以下状态机图演示了在 AlgoBulls 平台上进行纸张交易作业期间的各种状态和转换:
提交纸张交易作业后,您可以实时获取策略执行的日志和报告。日志和报告有助于验证策略的性能并调试任何潜在问题。
确保您已经阅读了第八章的前六个配方,算法交易策略 - 逐步编码,以完全了解所使用的策略类StrategyEMARegularORder
的完整情况。
准备就绪
确保algobulls_connection
和strategy_code1
对象在您的 Python 命名空间中可用。请参阅本章第一个配方以设置algobulls_connection
和strategy_code1
对象。
如何做…
对于这个配方,我们执行以下步骤:
- 导入必要的模块:
>>> from datetime import time >>> from pyalgotrading.constants import *
- 使用其交易符号作为关键字搜索工具。将返回的对象赋值给
instruments
:
>>> instruments = algobulls_connection.search_instrument('SBIN') >>> instruments
我们得到以下输出(你的输出可能不同):
[{'id': 7, 'value': 'NSE:SBIN'}]
- 从
instruments
中获取所选工具的value
:
>>> instrument = instruments[0]['value'] >>> instrument
我们得到以下输出:
'NSE:SBIN'
- 提交一个
strategy_code1
的纸上交易任务:
>>> algobulls_connection.papertrade(strategy_code=strategy_code1, start_time=time(hour=9, minute=15), end_time=time(hour=15, minute=30), instrument=instrument, lots=1, strategy_parameters={ 'timeperiod1': 5, 'timeperiod2': 12 }, candle_interval=CandleInterval.MINUTES_15)
我们得到以下输出:
Setting Strategy Config... Success. Submitting PAPERTRADING job... Success.
- 检查已提交的纸上交易任务的状态:
>>> algobulls_connection.get_papertrading_job_status( strategy_code1)
Python 算法交易秘籍(五)(4)https://developer.aliyun.com/article/1523037