Python 算法交易秘籍(一)(4)

简介: Python 算法交易秘籍(一)

Python 算法交易秘籍(一)(3)https://developer.aliyun.com/article/1523085

将 DataFrame 转换为其他格式

本配方演示了将DataFrame对象转换为其他格式,如.csv文件、json对象和pickle对象。将其转换为.csv文件可以使进一步使用电子表格应用程序处理数据变得更加容易。json格式对于通过网络 API 传输DataFrame对象非常有用。pickle格式对于通过套接字将一个 Python 会话中创建的DataFrame对象传输到另一个 Python 会话中而无需重新创建它们非常有用。

准备工作

确保在您的 Python 命名空间中可用对象df。请参阅本章的创建 pandas.DataFrame 对象配方来设置此对象。

如何做…

执行此配方的以下步骤:

  1. df转换并保存为 CSV 文件:
>>> df.to_csv('dataframe.csv', index=False)
  1. df转换为 JSON 字符串:
>>> df.to_json()

我们得到以下输出:

'{
    "timestamp":{
        "0":"13-11-2019 09:00:00","1":"13-11-2019 09:15:00",
        "2":"13-11-2019 09:30:00","3":"13-11-2019 09:45:00",
        "4":"13-11-2019 10:00:00","5":"13-11-2019 10:15:00",
        "6":"13-11-2019 10:30:00","7":"13-11-2019 10:45:00",
        "8":"13-11-2019 11:00:00","9":"13-11-2019 11:15:00"},
    "open":{
        "0":71.8075,"1":71.7925,"2":71.7925, "3":71.76,         
        "4":71.7425,"5":71.775,"6":71.815, "7":71.775,
        "8":71.7525,"9":71.7625},
    "high"{
        "0":71.845,"1":71.8,"2":71.8125,"3":71.765,
        "4":71.78,"5":71.8225,"6":71.83,"7":71.7875,
        "8":71.7825,"9":71.7925},
    "low":{
        "0":71.7775,"1":71.78,"2":71.76,"3":71.735,
        "4":71.7425,"5":71.77,"6":71.7775,"7":71.7475,
        "8":71.7475,"9":71.76},
    "close":{
        "0":71.7925,"1":71.7925,"2":71.7625,"3":71.7425,
        "4":71.7775,"5":71.815,"6":71.78,"7":71.7525,
        "8":71.7625,"9":71.7875},
    "volume":{
        "0":219512,"1":59252,"2":57187,"3":43048,
        "4":45863,"5":42460,"6":62403,"7":34090,
        "8":39320,"9":20190}}'
  1. df保存为一个文件:
>>> df.to_pickle('df.pickle')

工作原理…

步骤 1 中,你使用 to_csv() 方法将 df 保存为 .csv 文件。你将 dataframe.csv,一个生成 .csv 文件的文件路径,作为第一个参数传递,将索引设置为 False 作为第二个参数。将索引设置为 False 可以防止索引被转储到 .csv 文件中。如果你想将 DataFrame 与其索引一起保存,可以将索引设置为 True 传递给 to_csv() 方法。

步骤 2 中,你使用 to_json() 方法将 df 转换为 JSON 字符串。你没有向 to_json() 方法传递任何额外的参数。

步骤 3 中,你使用 to_pickle() 方法对对象进行 pickle(序列化)。同样,你没有向 to_pickle() 方法传递任何额外的参数。

方法 to_csv()to_json()to_pickle() 可以接受比本示例中显示的更多可选参数。有关这些方法的完整信息,请参阅官方文档:

从其他格式创建 DataFrame

在这个示例中,你将从其他格式(如 .csv 文件、.json 字符串和 pickle 文件)创建 DataFrame 对象。使用电子表格应用程序创建的 .csv 文件、通过 web API 接收的有效 JSON 数据或通过套接字接收的有效 pickle 对象都可以通过将它们转换为 DataFrame 对象来进一步处理。

从不受信任的来源加载 pickled 数据可能是不安全的。请谨慎使用 read_pickle()。你可以在这里找到更多详细信息:docs.python.org/3/library/pickle.html。如果你在之前的示例中使用此函数的 pickle 文件,那么使用 read_pickle() 是完全安全的。

准备工作

在开始此示例之前,请确保你已经按照上一个示例的步骤进行了操作。

如何操作…

执行以下步骤来完成这个示例:

  1. 通过读取 CSV 文件创建一个 DataFrame 对象:
>>> pandas.read_csv('dataframe.csv')

我们得到以下输出:

timestamp    open    high     low   close volume
0 2019-11-13 09:00:00 71.8075 71.8450 71.7775 71.7925 219512
1 2019-11-13 09:15:00 71.7925 71.8000 71.7800 71.7925  59252
2 2019-11-13 09:30:00 71.7925 71.8125 71.7600 71.7625  57187
3 2019-11-13 09:45:00 71.7600 71.7650 71.7350 71.7425  43048
4 2019-11-13 10:00:00 71.7425 71.7800 71.7425 71.7775  45863
5 2019-11-13 10:15:00 71.7750 71.8225 71.7700 71.8150  42460
6 2019-11-13 10:30:00 71.8150 71.8300 71.7775 71.7800  62403
7 2019-11-13 10:45:00 71.7750 71.7875 71.7475 71.7525  34090
8 2019-11-13 11:00:00 71.7525 71.7825 71.7475 71.7625  39320
9 2019-11-13 11:15:00 71.7625 71.7925 71.7600 71.7875  20190
  1. 通过读取 JSON 字符串创建一个 DataFrame 对象:
>>> pandas.read_json("""{
        "timestamp": {
            "0":"13-11-2019 09:00:00", "1":"13-11-2019 09:15:00", 
            "2":"13-11-2019 09:30:00","3":"13-11-2019 09:45:00", 
            "4":"13-11-2019 10:00:00","5":"13-11-2019 10:15:00",
            "6":"13-11-2019 10:30:00","7":"13-11-2019 10:45:00",
            "8":"13-11-2019 11:00:00","9":"13-11-2019 11:15:00"},
        "open":{
            "0":71.8075,"1":71.7925,"2":71.7925,"3":71.76,
            "4":71.7425,"5":71.775,"6":71.815,"7":71.775,
            "8":71.7525,"9":71.7625},
        "high":{
            "0":71.845,"1":71.8,"2":71.8125,"3":71.765,"4":71.78,
            "5":71.8225,"6":71.83,"7":71.7875,"8":71.7825,
            "9":71.7925},
        "low":{
            "0":71.7775,"1":71.78,"2":71.76,"3":71.735,"4":71.7425,
            "5":71.77,"6":71.7775,"7":71.7475,"8":71.7475,
            "9":71.76},
        "close":{
            "0":71.7925,"1":71.7925,"2":71.7625,"3":71.7425,
            "4":71.7775,"5":71.815,"6":71.78,"7":71.7525,
            "8":71.7625,"9":71.7875},
        "volume":{
            "0":219512,"1":59252,"2":57187,"3":43048,"4":45863,
            "5":42460,"6":62403,"7":34090,"8":39320,"9":20190}}
            """)

我们得到以下输出:

timestamp    open    high     low   close volume
0 2019-11-13 09:00:00 71.8075 71.8450 71.7775 71.7925 219512
1 2019-11-13 09:15:00 71.7925 71.8000 71.7800 71.7925  59252
2 2019-11-13 09:30:00 71.7925 71.8125 71.7600 71.7625  57187
3 2019-11-13 09:45:00 71.7600 71.7650 71.7350 71.7425  43048
4 2019-11-13 10:00:00 71.7425 71.7800 71.7425 71.7775  45863
5 2019-11-13 10:15:00 71.7750 71.8225 71.7700 71.8150  42460
6 2019-11-13 10:30:00 71.8150 71.8300 71.7775 71.7800  62403
7 2019-11-13 10:45:00 71.7750 71.7875 71.7475 71.7525  34090
8 2019-11-13 11:00:00 71.7525 71.7825 71.7475 71.7625  39320
9 2019-11-13 11:15:00 71.7625 71.7925 71.7600 71.7875  20190
  1. 通过取消反序列化 df.pickle 文件来创建一个 DataFrame 对象:
>>> pandas.read_pickle('df.pickle')

我们得到以下输出:

timestamp    open    high     low   close volume
0 2019-11-13 09:00:00 71.8075 71.8450 71.7775 71.7925 219512
1 2019-11-13 09:15:00 71.7925 71.8000 71.7800 71.7925  59252
2 2019-11-13 09:30:00 71.7925 71.8125 71.7600 71.7625  57187
3 2019-11-13 09:45:00 71.7600 71.7650 71.7350 71.7425  43048
4 2019-11-13 10:00:00 71.7425 71.7800 71.7425 71.7775  45863
5 2019-11-13 10:15:00 71.7750 71.8225 71.7700 71.8150  42460
6 2019-11-13 10:30:00 71.8150 71.8300 71.7775 71.7800  62403
7 2019-11-13 10:45:00 71.7750 71.7875 71.7475 71.7525  34090
8 2019-11-13 11:00:00 71.7525 71.7825 71.7475 71.7625  39320
9 2019-11-13 11:15:00 71.7625 71.7925 71.7600 71.7875  20190

工作原理如下…

步骤 1 中,你使用 pandas.read_csv() 函数从 .csv 文件创建一个 DataFrame 对象。你将 dataframe.csv,即 .csv 文件应该读取的文件路径,作为参数传递。回想一下,在前一个示例的 步骤 1 中创建了 dataframe.csv

第 2 步中,你使用pandas.read_json()函数从有效的 JSON 字符串创建一个DataFrame对象。你将前一个示例中第 2 步的输出的 JSON 字符串作为此函数的参数传递。

第 3 步中,你使用pandas.read_pickle()方法从pickle文件创建一个DataFrame对象。你将df.pickle,即 pickle 文件应该读取的文件路径,作为此函数的参数传递。回忆一下,你在前一个示例的第 3 步中创建了df.pickle

如果你遵循了前一个示例,那么所有三个步骤的输出都将是相同的DataFrame对象。这与前一个示例中的df完全相同。

方法read_csv()read_json()read_pickle()可以接受比本示例中显示的更多的可选参数。请参考官方文档以获取有关这些方法的完整信息。

第二章:股票市场-交易入门

在构建算法交易系统时,有必要与提供用于程序化下单和查询交易的 API 的现代经纪人开设账户。这样我们就可以通过我们的 Python 脚本控制经纪账户,而传统上是通过经纪人的网站手动操作经纪账户,这个 Python 脚本将成为我们更大型算法交易系统的一部分。本章演示了一些基本的配方,介绍了开发完整的算法交易系统所需的基本经纪 API 调用。

本章涵盖以下配方:

  • 设置 Python 与经纪人的连接
  • 查询工具列表
  • 获取工具
  • 查询交易所列表
  • 查询段列表
  • 了解经纪人支持的其他属性
  • 下单普通订单
  • 下单布林订单
  • 下单交割订单
  • 下单当日订单
  • 查询保证金和资金
  • 计算经纪费
  • 计算政府征收的税费

让我们开始吧!

技术要求

要成功执行本章中的示例,您将需要以下内容:

  • Python 3.7+
  • Python 的pyalgotrading包($ pip install pyalgotrading

本章的最新 Jupyter 笔记本可以在 GitHub 上找到:github.com/PacktPublishing/Python-Algorithmic-Trading-Cookbook/tree/master/Chapter02

本章演示了现代经纪人ZERODHA的 API,它受到pyalgotrading的支持。您也可以选择其他由pyalgotrading支持的经纪人。本章中的配方对于任何其他经纪人应该大致相同。pyalgotrading包将经纪 API 抽象为统一的接口,因此您不需要担心底层经纪 API 调用。

要设置与ZERODHA的经纪账户,请参阅附录 I中提供的详细步骤。

设置 Python 与经纪人的连接

设置与经纪人的连接的第一步是获取 API 密钥。经纪人通常为每个客户提供唯一的密钥,通常是作为api-keyapi-secret密钥对。这些 API 密钥通常是收费的,通常按月订阅。在开始本配方之前,您需要从经纪人的网站获取api-keyapi-secret的副本。有关更多详细信息,请参阅附录 I

怎么做…

我们执行以下步骤来完成此配方:

  1. 导入必要的模块:
>>> from pyalgotrading.broker.broker_connection_zerodha import BrokerConnectionZerodha
  1. 从经纪人那里获取api_keyapi_secret密钥。这些对您是唯一的,并将由经纪人用于识别您的 Demat 账户:
>>> api_key = "<your-api-key>"
>>> api_secret = "<your-api-secret>"
>>> broker_connection = BrokerConnectionZerodha(api_key, api_secret)

您将获得以下结果:

Installing package kiteconnect via pip...
Please login to this link to generate your request token: https://kite.trade/connect/login?api_key=<your-api-key>&v=3
  1. 从上述网址获取请求令牌:
>>> request_token = "<your-request-token>"
>>> broker_connection.set_access_token(request_token)

工作原理…

第一步 中,你从 pyalgotrading 导入 BrokerConnectionZerodha 类。BrokerConnectionZerodha 类提供了围绕特定经纪人 API 的抽象。对于 第二步,你需要经纪人的 API 密钥和 API 秘密。如果你没有它们,请参考 附录 I 获取详细的说明和带有截图的指导。在 第二步 中,你将你的 API 密钥和 API 秘密分配给新的 api_keyapi_secret 变量,并使用它们创建 broker_connectionBrokerConnectionZerodha 类的一个实例。如果你是第一次运行这个程序并且没有安装 kiteconnectpyalgotrading 将自动为你安装它。(kiteconnect 是官方的 Python 包,用于与 Zerodha 后端通信;BrokerConnectionZerodha 是在 kiteconnect 之上的一个封装。)第二步 生成一个登录链接。在这里,你需要点击链接并使用你的 Zerodha 凭据登录。如果认证过程成功,你将在浏览器地址栏中看到一个类似以下的链接:

https://127.0.0.1/?request_token=&action=login&status=success

例如,完整的链接将如下所示:

https://127.0.0.1/?request_token=H06I6Ydv95y23D2Dp7NbigFjKweGwRP7&action=login&status=success

复制字母数字令牌,H06I6Ydv95y23D2Dp7NbigFjKweGwRP7,并将其粘贴到 第三步request_token 中。broker_connection 实例现在已准备好执行 API 调用。

查询一组工具

一旦 broker_connection 句柄准备好,它就可以用来查询包含经纪人提供的所有金融工具的列表。

准备工作

确保 broker_connection 对象在你的 Python 命名空间中可用。请参考本章中前一个配方设置此对象。

如何做…

我们执行以下步骤来完成这个配方:

  1. 显示所有工具:
>>> instruments = broker_connection.get_all_instruments()
>>> instruments

你将会得到类似以下的输出。对你来说,确切的输出可能会有所不同:

instrument_token exchange_token tradingsymbol name last_price expiry strike tick_size lot_size instrument_type segment exchange
0 267556358 1045142 EURINR20AUGFUT EURINR 0.0 2020-08-27 0.0 0.0025 1 FUT BCD-FUT BCD
1 268660998 1049457 EURINR20DECFUT EURINR 0.0 2020-12-29 0.0 0.0025 1 FUT BCD-FUT BCD
2 266440966 1040785 EURINR20JULFUT EURINR 0.0 2020-07-29 0.0 0.0025 1 FUT BCD-FUT BCD
3 266073606 1039350 EURINR20JUNFUT EURINR 0.0 2020-06-26 0.0 0.0025 1 FUT BCD-FUT BCD
4 265780742 1038206 EURINR20MAYFUT EURINR 0.0 2020-05-27 0.0 0.0025 1 FUT BCD-FUT BCD
... ... ... ... ... ... ... ... ... ... ... ... ...
64738 978945 3824 ZODJRDMKJ ZODIAC JRD-MKJ 0.0 0.0 0.0500 1 EQ NSE NSE
64739 2916865 11394 ZOTA ZOTA HEALTH CARE 0.0 0.0 0.0500 1 EQ NSE NSE
64740 7437825 29054 ZUARI-BE ZUARI AGRO CHEMICALS 0.0 0.0 0.0500 1 EQ NSE NSE
64741 979713 3827 ZUARIGLOB ZUARI GLOBAL 0.0 0.0 0.0500 1 EQ NSE NSE
64742 4514561 17635 ZYDUSWELL ZYDUS WELLNESS 0.0 0.0 0.0500 1 EQ NSE NSE
64743 rows × 12 columns
  1. 打印工具总数:
>>> print(f'Total instruments: {len(instruments)}')

我们得到以下输出(你的输出可能会有所不同):

Total instruments: 64743

工作原理…

第一步使用 broker_connectionget_all_instruments() 方法获取所有可用的金融工具。此方法返回一个 pandas.DataFrame 对象。此对象分配给一个新变量 instruments,显示在 第一步 的输出中。由于经常添加新的金融工具并定期过期现有的工具,这个输出可能对你来说有所不同。最后一步显示了经纪人提供的工具总数。

关于前面的 API 调用返回的数据的解释将在第三章中深入讨论,分析金融数据。对于这个配方,知道如何获取工具列表的方法就足够了。

获取一个工具

工具,也称为金融工具证券,是可以在交易所交易的资产。在交易所中,可以有数万种工具。本示例演示了如何根据其交易所交易符号获取工具。

准备就绪

确保 broker_connection 对象在你的 Python 命名空间中可用。请参考本章第一个示例设置此对象。

怎么做…

获取特定交易符号和交易所的工具:

>>> broker_connection.get_instrument(segment='NSE', tradingsymbol='TATASTEEL')

你将得到以下输出:

segment: NSE
exchange: NSE
tradingsymbol: TATASTEEL
broker_token: 895745
tick_size: 0.05
lot_size: 1
expiry: 
strike_price: 0.0

工作原理…

broker_connection 对象提供了一个方便的方法,get_instrument,用于获取任何金融工具。在返回工具之前,它以 segmenttradingsymbol 为属性。返回对象是 Instrument 类的一个实例。

查询交易所列表

交易所 是一个交易工具交易的市场。交易所确保交易过程公平且始终按规则进行。通常,经纪人支持多个交易所。本示例演示了如何查找经纪人支持的交易所列表。

准备就绪

确保 instruments 对象在你的 Python 命名空间中可用。请参考本章第二个示例以了解如何设置此对象。

怎么做…

显示经纪人支持的交易所:

>>> exchanges = instruments.exchange.unique()
>>> print(exchanges)

你将得到以下输出:

['BCD' 'BSE' 'NSE' 'CDS' 'MCX' 'NFO']

工作原理…

instruments.exchange 返回一个 pandas.Series 对象。其 unique() 方法返回一个由经纪人支持的唯一交易所组成的 numpy.ndarray 对象。

查询分段列表

一个分段实质上是根据其类型对工具进行分类。在交易所中常见的各种分段类型包括现金/股票、期货、期权、大宗商品和货币。每个分段可能有不同的运营时间。通常,经纪人支持多个交易所内的多个分段。本示例演示了如何查找经纪人支持的分段列表。

准备就绪

确保 instruments 对象在你的 Python 命名空间中可用。请参考本章第二个示例以了解如何设置此对象。

怎么做…

显示经纪人支持的分段:

>>> segments = instruments.segment.unique()
>>> print(segments)

你将得到以下输出:

['BCD-FUT' 'BCD' 'BCD-OPT' 'BSE' 'INDICES' 'CDS-FUT' 'CDS-OPT' 'MCX-FUT' 'MCX-OPT' 'NFO-OPT' 'NFO-FUT' 'NSE']

工作原理…

instruments.segment 返回一个 pandas.Series 对象。它的 unique 方法返回一个由经纪人支持的唯一分段组成的 numpy.ndarray 对象。

了解经纪人支持的其他属性

为了下订单,需要以下属性:订单交易类型、订单种类、订单类型和订单代码。不同的经纪人可能支持不同类型的订单属性。例如,一些经纪人可能仅支持普通订单,而其他经纪人可能支持普通订单和止损订单。可以使用 pyalgotrading 包提供的经纪人特定常量查询经纪人支持的每个属性的值。

如何做…

我们执行以下步骤来完成此配方:

  1. pyalgotrading模块中导入必要的类:
>>> from pyalgotrading.broker.broker_connection_zerodha import BrokerConnectionZerodha
  1. 列出订单交易类型:
>>> list(BrokerConnectionZerodha.ORDER_TRANSACTION_TYPE_MAP.keys())

我们将得到以下输出:

[<BrokerOrderTransactionTypeConstants.BUY: 'BUY'>,
 <BrokerOrderTransactionTypeConstants.SELL: 'SELL'>]
  1. 列出订单品种:
>>> list(BrokerConnectionZerodha.ORDER_VARIETY_MAP.keys())

我们将得到以下输出:

[<BrokerOrderVarietyConstants.MARKET: 'ORDER_VARIETY_MARKET'>,
 <BrokerOrderVarietyConstants.LIMIT: 'ORDER_VARIETY_LIMIT'>,
 <BrokerOrderVarietyConstants.STOPLOSS_LIMIT: 'ORDER_VARIETY_STOPLOSS_LIMIT'>,
 <BrokerOrderVarietyConstants.STOPLOSS_MARKET: 'ORDER_VARIETY_STOPLOSS_MARKET'>]
  1. 列出订单类型:
>>> list(BrokerConnectionZerodha.ORDER_TYPE_MAP.keys())

我们将得到以下输出:

[<BrokerOrderTypeConstants.REGULAR: 'ORDER_TYPE_REGULAR'>,
 <BrokerOrderTypeConstants.BRACKET: 'ORDER_TYPE_BRACKET'>,
 <BrokerOrderTypeConstants.COVER: 'ORDER_TYPE_COVER'>,
 <BrokerOrderTypeConstants.AMO: 'ORDER_TYPE_AFTER_MARKET_ORDER'>]
  1. 列出订单代码:
>>> list(BrokerConnectionZerodha.ORDER_CODE_MAP.keys())

我们将得到以下输出:

[<BrokerOrderCodeConstants.INTRADAY: 'ORDER_CODE_INTRADAY'>,
 <BrokerOrderCodeConstants.DELIVERY: 'ORDER_CODE_DELIVERY_T0'>]

它是如何工作的…

步骤 1 中,我们从pyalgotrading导入BrokerConnectionZerodha类。此类保存了pyalgotrading和特定经纪人常量之间的订单属性映射,作为字典对象。接下来的步骤获取并打印这些映射。步骤 2 显示您的经纪人支持BUYSELL订单交易类型。

步骤 3 显示您的经纪人支持MARKETLIMITSTOPLOSS_LIMITSTOPLOSS_MARKET订单品种。步骤 4 显示您的经纪人支持REGULARBRACKETCOVERAFTER_MARKET订单类型。步骤 5 显示您的经纪人支持INTRADAYDELIVERY订单代码。

输出可能因经纪人而异,因此如果您使用不同的经纪人,请查阅您的经纪人文档。所有这些类型参数的详细解释将在第六章 在交易所下订单 中涵盖。本配方仅概述这些参数,因为它们在本章后续配方中需要。

放置一个简单的常规订单

本配方演示了如何通过经纪人在交易所上放置REGULAR订单。REGULAR订单是最简单的订单类型。尝试完此配方后,通过登录经纪人网站检查您的经纪人账户;您会发现一个订单已经被放置在那里。您可以将订单 ID 与本配方中显示的最后一个代码片段中返回的订单 ID 匹配。

准备就绪

确保broker_connection对象在你的 Python 命名空间中可用。参考本章第一个配方,了解如何设置此对象。

如何做…

我们执行以下步骤来完成此配方:

  1. pyalgotrading中导入必要的常量:
>>> from pyalgotrading.constants import *
  1. 获取特定交易符号和交易所的金融工具:
>>> instrument = broker_connection.get_instrument(segment='NSE', 
                                        tradingsymbol='TATASTEEL')
  1. 放置一个简单的常规订单 - 一个BUYREGULARINTRADAYMARKET订单:
>>> order_id = broker_connection.place_order(
                   instrument=instrument, 
                   order_transaction_type= \
                       BrokerOrderTransactionTypeConstants.BUY,
                   order_type=BrokerOrderTypeConstants.REGULAR, 
                   order_code=BrokerOrderCodeConstants.INTRADAY,
                   order_variety= \
                       BrokerOrderVarietyConstants.MARKET, 
                   quantity=1)
>>> order_id

我们将得到以下输出:

191209000001676

它是如何工作的…

步骤 1 中,您从pyalgotrading导入常量。在步骤 2 中,您使用broker_connectionget_instrument()方法以segment = 'NSE'tradingsymbol = 'TATASTEEL'获取金融工具。在步骤 3 中,您使用broker_connectionplace_order()方法放置一个REGULAR订单。place_order()方法接受的参数描述如下:

  • instrument:必须放置订单的金融工具。应该是Instrument类的实例。您在这里传递instrument
  • order_transaction_type: 订单交易类型。应为BrokerOrderTransactionTypeConstants类型的枚举。在这里,你传递了BrokerOrderTransactionTypeConstants.BUY
  • order_type: 订单类型。应为BrokerOrderTypeConstants类型的枚举。在这里,你传递了BrokerOrderTypeConstants.REGULAR
  • order_code: 订单代码。应为BrokerOrderCodeConstants类型的枚举。在这里,你传递了BrokerOrderCodeConstants.INTRADAY
  • order_variety: 订单种类。应为BrokerOrderVarietyConstants类型的枚举。在这里,你传递了BrokerOrderVarietyConstants.MARKET
  • quantity: 要交易的股票数量。应为正整数。我们在这里传递了1

如果订单放置成功,该方法将返回一个订单 ID,您可以随时以后用于查询订单状态。

不同类型参数的详细解释将在第六章中介绍,在交易所上下订单。这个配方旨在让你了解如何下达REGULAR订单,这是各种可能订单类型之一的想法。

下达一个简单的 BRACKET 订单

这个配方演示了如何通过经纪人在交易所上下达一个BRACKET订单。BRACKET订单是两腿订单。一旦第一个订单执行完毕,经纪人会自动下达两个新订单 – 一个STOPLOSS订单和一个TARGET订单。在任何时候只有一个订单被执行;当第一个订单完成时,另一个订单将被取消。在尝试了此配方后,通过登录经纪人的网站,您可以在您的经纪账户中找到已下达的订单。您可以将订单 ID 与本配方中显示的最后一个代码片段中返回的订单 ID 进行匹配。

准备就绪

确保broker_connection对象在你的 Python 命名空间中可用。参考本章的第一个配方,学习如何设置此对象。

如何操作…

我们执行以下步骤完成此配方:

  1. 导入必要的模块:
>>> from pyalgotrading.constants import *
  1. 获取特定交易符号和交易所的工具:
>>> instrument = broker_connection.get_instrument(segment='NSE', 
                                        tradingsymbol='ICICIBANK')
  1. 获取工具的最新交易价格:
>>> ltp = broker_connection.get_ltp(instrument)
  1. 下达一个简单的BRACKET订单 – 一个BUYBRACKETINTRADAYLIMIT订单:
>>> order_id = broker_connection.place_order(
                   instrument=instrument,
                   order_transaction_type= \
                       BrokerOrderTransactionTypeConstants.BUY,
                   order_type=BrokerOrderTypeConstants.BRACKET, 
                   order_code=BrokerOrderCodeConstants.INTRADAY, 
                   order_variety=BrokerOrderVarietyConstants.LIMIT,
                   quantity=1, price=ltp-1, 
                   stoploss=2, target=2)
>>> order_id

我们将得到以下输出:

191212001268839

如果在执行此代码时收到以下错误,则意味着由于市场波动性较高,经纪人阻止了 Bracket 订单:

InputException: 由于市场预期波动性较高,Bracket 订单暂时被阻止。

当经纪人开始允许 Bracket 订单时,你应该稍后尝试该配方。你可以不时地查看经纪人网站以了解 Bracket 订单何时被允许。

工作原理…

步骤 1中,您从pyalgotrading导入常量。在步骤 2中,您使用broker_connectionget_instrument()方法获取segment = 'NSE'tradingsymbol = 'ICICBANK'的金融工具。在步骤 3中,您获取工具的最后交易价格LTP。(LTP 将在第三章的分析金融数据中更详细地解释。)在步骤 4中,您使用broker_connectionplace_order()方法放置一个BRACKET订单。place_order()方法接受的参数的描述如下:

  • instrument: 必须放置订单的金融工具。应该是Instrument类的实例。你在这里传递instrument
  • order_transaction_type: 订单交易类型。应该是BrokerOrderTransactionTypeConstants类型的枚举。你在这里传递BrokerOrderTransactionTypeConstants.BUY
  • order_type: 订单类型。应该是BrokerOrderTypeConstants类型的枚举。你在这里传递BrokerOrderTypeConstants.BRACKET
  • order_code: 订单代码。应该是BrokerOrderCodeConstants类型的枚举。你在这里传递BrokerOrderCodeConstants.INTRADAY
  • order_variety: 订单种类。应该是BrokerOrderVarietyConstants类型的枚举。你在这里传递BrokerOrderVarietyConstants.LIMIT
  • quantity: 给定工具要交易的股份数量。应为正整数。你在这里传递1
  • price: 应该放置订单的限价。你在这里传递ltp-1,这意味着低于ltp值的 1 个单位价格。
  • stoploss: 初始订单价格的价格差,应该放置止损订单的价格。应为正整数或浮点值。你在这里传递2
  • target: 初始价格的价格差,应该放置目标订单的价格。应为正整数或浮点值。你在这里传递2

如果订单放置成功,该方法会返回一个订单 ID,您可以随时稍后用于查询订单的状态。

对不同类型参数的详细解释将在第六章中进行,在交易所上放置交易订单。本示例旨在向您展示如何放置BRACKET订单,这是各种可能订单类型之一。

Python 算法交易秘籍(一)(5)https://developer.aliyun.com/article/1523098

相关文章
|
6天前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
39 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
|
2天前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
15 9
|
3天前
|
存储 算法 测试技术
预见未来?Python线性回归算法:数据中的秘密预言家
【9月更文挑战第11天】在数据的海洋中,线性回归算法犹如智慧的预言家,助我们揭示未知。本案例通过收集房屋面积、距市中心距离等数据,利用Python的pandas和scikit-learn库构建房价预测模型。经过训练与测试,模型展现出较好的预测能力,均方根误差(RMSE)低,帮助房地产投资者做出更明智决策。尽管现实关系复杂多变,线性回归仍提供了有效工具,引领我们在数据世界中自信前行。
17 5
|
16天前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
84 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
18天前
|
算法 数据处理 数据安全/隐私保护
|
8天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能股票交易策略
使用Python实现智能股票交易策略
19 0
|
1月前
|
编解码 算法 Linux
Linux平台下RTSP|RTMP播放器如何跟python交互投递RGB数据供视觉算法分析
在对接Linux平台的RTSP播放模块时,需将播放数据同时提供给Python进行视觉算法分析。技术实现上,可在播放时通过回调函数获取视频帧数据,并以RGB32格式输出。利用`SetVideoFrameCallBackV2`接口设定缩放后的视频帧回调,以满足算法所需的分辨率。回调函数中,每收到一帧数据即保存为bitmap文件。Python端只需读取指定文件夹中的bitmap文件,即可进行视频数据的分析处理。此方案简单有效,但应注意控制输出的bitmap文件数量以避免内存占用过高。
|
1月前
|
JSON 算法 API
京东以图搜图功能API接口调用算法源码python
京东图搜接口是一款强大工具,通过上传图片即可搜索京东平台上的商品。适合电商平台、比价应用及需商品识别服务的场景。使用前需了解接口功能并注册开发者账号获取Key和Secret;准备好图片的Base64编码和AppKey;生成安全签名后,利用HTTP客户端发送POST请求至接口URL;最后解析JSON响应数据以获取商品信息。
|
1月前
|
算法 Python
python多继承的3C算法是什么?怎么用?
有很多地方都说python多继承的继承顺序,是按照深度遍历的方式,其实python多继承顺序的算法,不是严格意义上的深度遍历,而是基于深度遍历基础上优化出一种叫3C算法
|
17天前
|
人工智能 算法 数据可视化
DBSCAN密度聚类算法(理论+图解+python代码)
DBSCAN密度聚类算法(理论+图解+python代码)