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 对象配方来设置此对象。
如何做…
执行此配方的以下步骤:
- 将
df
转换并保存为 CSV 文件:
>>> df.to_csv('dataframe.csv', index=False)
- 将
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}}'
- 将
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()
可以接受比本示例中显示的更多可选参数。有关这些方法的完整信息,请参阅官方文档:
to_csv()
:pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html
to_json()
:pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_json.html
to_pickle()
:pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_pickle.html
从其他格式创建 DataFrame
在这个示例中,你将从其他格式(如 .csv
文件、.json
字符串和 pickle
文件)创建 DataFrame
对象。使用电子表格应用程序创建的 .csv
文件、通过 web API 接收的有效 JSON 数据或通过套接字接收的有效 pickle 对象都可以通过将它们转换为 DataFrame
对象来进一步处理。
从不受信任的来源加载 pickled 数据可能是不安全的。请谨慎使用 read_pickle()
。你可以在这里找到更多详细信息:docs.python.org/3/library/pickle.html
。如果你在之前的示例中使用此函数的 pickle 文件,那么使用 read_pickle()
是完全安全的。
准备工作
在开始此示例之前,请确保你已经按照上一个示例的步骤进行了操作。
如何操作…
执行以下步骤来完成这个示例:
- 通过读取 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
- 通过读取 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
- 通过取消反序列化
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()
可以接受比本示例中显示的更多的可选参数。请参考官方文档以获取有关这些方法的完整信息。
read_csv()
:pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html#pandas.read_csv
read_json()
:pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html#pandas.read_json
read_pickle()
:pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_pickle.html#pandas.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-key
和api-secret
密钥对。这些 API 密钥通常是收费的,通常按月订阅。在开始本配方之前,您需要从经纪人的网站获取api-key
和api-secret
的副本。有关更多详细信息,请参阅附录 I。
怎么做…
我们执行以下步骤来完成此配方:
- 导入必要的模块:
>>> from pyalgotrading.broker.broker_connection_zerodha import BrokerConnectionZerodha
- 从经纪人那里获取
api_key
和api_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
- 从上述网址获取请求令牌:
>>> request_token = "<your-request-token>" >>> broker_connection.set_access_token(request_token)
工作原理…
在 第一步 中,你从 pyalgotrading
导入 BrokerConnectionZerodha
类。BrokerConnectionZerodha
类提供了围绕特定经纪人 API 的抽象。对于 第二步,你需要经纪人的 API 密钥和 API 秘密。如果你没有它们,请参考 附录 I 获取详细的说明和带有截图的指导。在 第二步 中,你将你的 API 密钥和 API 秘密分配给新的 api_key
和 api_secret
变量,并使用它们创建 broker_connection
,BrokerConnectionZerodha
类的一个实例。如果你是第一次运行这个程序并且没有安装 kiteconnect
,pyalgotrading
将自动为你安装它。(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 命名空间中可用。请参考本章中前一个配方设置此对象。
如何做…
我们执行以下步骤来完成这个配方:
- 显示所有工具:
>>> 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
- 打印工具总数:
>>> print(f'Total instruments: {len(instruments)}')
我们得到以下输出(你的输出可能会有所不同):
Total instruments: 64743
工作原理…
第一步使用 broker_connection
的 get_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
,用于获取任何金融工具。在返回工具之前,它以 segment
和 tradingsymbol
为属性。返回对象是 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
包提供的经纪人特定常量查询经纪人支持的每个属性的值。
如何做…
我们执行以下步骤来完成此配方:
- 从
pyalgotrading
模块中导入必要的类:
>>> from pyalgotrading.broker.broker_connection_zerodha import BrokerConnectionZerodha
- 列出订单交易类型:
>>> list(BrokerConnectionZerodha.ORDER_TRANSACTION_TYPE_MAP.keys())
我们将得到以下输出:
[<BrokerOrderTransactionTypeConstants.BUY: 'BUY'>, <BrokerOrderTransactionTypeConstants.SELL: 'SELL'>]
- 列出订单品种:
>>> 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'>]
- 列出订单类型:
>>> 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'>]
- 列出订单代码:
>>> list(BrokerConnectionZerodha.ORDER_CODE_MAP.keys())
我们将得到以下输出:
[<BrokerOrderCodeConstants.INTRADAY: 'ORDER_CODE_INTRADAY'>, <BrokerOrderCodeConstants.DELIVERY: 'ORDER_CODE_DELIVERY_T0'>]
它是如何工作的…
在步骤 1 中,我们从pyalgotrading
导入BrokerConnectionZerodha
类。此类保存了pyalgotrading
和特定经纪人常量之间的订单属性映射,作为字典对象。接下来的步骤获取并打印这些映射。步骤 2 显示您的经纪人支持BUY
和SELL
订单交易类型。
步骤 3 显示您的经纪人支持MARKET
、LIMIT
、STOPLOSS_LIMIT
和STOPLOSS_MARKET
订单品种。步骤 4 显示您的经纪人支持REGULAR
、BRACKET
、COVER
和AFTER_MARKET
订单类型。步骤 5 显示您的经纪人支持INTRADAY
和DELIVERY
订单代码。
输出可能因经纪人而异,因此如果您使用不同的经纪人,请查阅您的经纪人文档。所有这些类型参数的详细解释将在第六章 在交易所下订单 中涵盖。本配方仅概述这些参数,因为它们在本章后续配方中需要。
放置一个简单的常规订单
本配方演示了如何通过经纪人在交易所上放置REGULAR
订单。REGULAR
订单是最简单的订单类型。尝试完此配方后,通过登录经纪人网站检查您的经纪人账户;您会发现一个订单已经被放置在那里。您可以将订单 ID 与本配方中显示的最后一个代码片段中返回的订单 ID 匹配。
准备就绪
确保broker_connection
对象在你的 Python 命名空间中可用。参考本章第一个配方,了解如何设置此对象。
如何做…
我们执行以下步骤来完成此配方:
- 从
pyalgotrading
中导入必要的常量:
>>> from pyalgotrading.constants import *
- 获取特定交易符号和交易所的金融工具:
>>> instrument = broker_connection.get_instrument(segment='NSE', tradingsymbol='TATASTEEL')
- 放置一个简单的常规订单 - 一个
BUY
、REGULAR
、INTRADAY
、MARKET
订单:
>>> 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_connection
的get_instrument()
方法以segment = 'NSE'
和tradingsymbol = 'TATASTEEL'
获取金融工具。在步骤 3 中,您使用broker_connection
的place_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 命名空间中可用。参考本章的第一个配方,学习如何设置此对象。
如何操作…
我们执行以下步骤完成此配方:
- 导入必要的模块:
>>> from pyalgotrading.constants import *
- 获取特定交易符号和交易所的工具:
>>> instrument = broker_connection.get_instrument(segment='NSE', tradingsymbol='ICICIBANK')
- 获取工具的最新交易价格:
>>> ltp = broker_connection.get_ltp(instrument)
- 下达一个简单的
BRACKET
订单 – 一个BUY
,BRACKET
,INTRADAY
,LIMIT
订单:
>>> 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_connection
的get_instrument()
方法获取segment = 'NSE'
和tradingsymbol = 'ICICBANK'
的金融工具。在步骤 3中,您获取工具的最后交易价格或LTP。(LTP 将在第三章的分析金融数据中更详细地解释。)在步骤 4中,您使用broker_connection
的place_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