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

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

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

放置一个简单的 DELIVERY 订单

此示例演示了如何通过经纪人在交易所下达 DELIVERY 订单。DELIVERY 订单将传递到用户的 Demat 账户,并存在直到用户明确平仓为止。在交易会话结束时由交货订单创建的仓位将转移到下一个交易会话。它们不会由经纪人明确平仓。尝试完这个示例后,通过登录经纪人的网站检查你的经纪账户;你会发现已经有一个订单被下达了。你可以将订单 ID 与此示例中最后显示的代码片段返回的订单 ID 进行匹配。

准备工作

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

操作方法…

我们执行以下步骤来完成此示例:

  1. 导入必要的模块:
>>> from pyalgotrading.constants import *
  1. 获取特定交易符号和交易所的金融工具:
>>> instrument = broker_connection.get_instrument(segment='NSE', 
                                        tradingsymbol='AXISBANK')
  1. 下达一个简单的 DELIVERY 订单 - 一个 SELLREGULARDELIVERYMARKET 订单:
>>> order_id = broker_connection.place_order(
                   instrument=instrument,
                   order_transaction_type= \
                       BrokerOrderTransactionTypeConstants.SELL,
                   order_type=BrokerOrderTypeConstants.REGULAR,
                   order_code=BrokerOrderCodeConstants.DELIVERY,
                   order_variety= \
                       BrokerOrderVarietyConstants.MARKET, 
                    quantity=1)
>>> order_id

我们将得到以下输出:

191212001268956

工作原理…

第 1 步 中,你从 pyalgotrading 导入常量。在 第 2 步 中,你使用 broker_connectionget_instrument() 方法,通过 segment = 'NSE'tradingsymbol = 'AXISBANK' 获取金融工具。在 第 3 步 中,你使用 broker_connectionplace_order() 方法下达 DELIVERY 订单。此方法接受以下参数:

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

如果订单下达成功,该方法会返回一个订单 ID,你随时可以使用它查询订单的状态。

关于不同类型参数的详细解释将在 第六章 在交易所上下达交易订单 中介绍。此示例旨在让你了解如何下达 DELIVERY 订单,这是各种可能订单中的一种。

下达一个简单的 INTRADAY 订单

此配方演示如何通过经纪人 API 下达 INTRADAY 订单。INTRADAY 订单不会传送到用户的 Demat 账户。由日内订单创建的头寸具有一天的生命周期。这些头寸在交易会话结束时由经纪人明确平仓,并不转入下一个交易会话。尝试完此配方后,通过登录经纪人网站查看您的经纪账户;您会发现已经有了一个订单。您可以将订单 ID 与此配方中显示的最后一个代码片段返回的订单 ID 进行匹配。

准备工作

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

如何操作…

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

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

我们将获得以下输出:

191212001269042

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

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

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

工作原理…

步骤 1 中,您从 pyalgotrading 导入常量。在 步骤 2 中,您使用 broker_connectionget_instrument() 方法通过 segment = 'NSE'tradingsymbol = 'HDFCBANK' 获取金融工具。在 步骤 3 中,您获取该工具的 LTP。(LTP 将在 第三章 的 金融工具的最近成交价 配方中详细解释。)在 步骤 4 中,您使用 broker_connectionplace_order() 方法下达 BRACKET 订单。place_order() 方法接受的参数描述如下:

  • instrument:必须下达订单的金融工具。应为 Instrument 类的实例。在这里传递 instrument
  • order_transaction_type:订单交易类型。应为 BrokerOrderTransactionTypeConstants 类型的枚举。在这里传递 BrokerOrderTransactionTypeConstants.SELL
  • 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,您随时可以在以后的任何时间使用它来查询订单的状态。

不同类型参数的详细解释将在第六章,在交易所下订单 中介绍。本示例旨在让您了解如何下达 INTRADAY 订单,这是各种可能订单类型之一。

查询保证金和资金

在下单之前,重要的是要确保您的经纪账户中有足够的保证金和资金可用以成功下单。资金不足会导致经纪拒绝任何下单,这意味着其他人将永远不会在交易所下单。本示例向您展示了如何随时查找您的经纪账户中可用的保证金和资金。

准备就绪

确保 broker_connection 对象在您的 Python 命名空间中可用。请参考本章的第一个示例来学习如何设置它。

如何操作…

我们执行以下步骤完成此示例:

  1. 显示股票保证金:
>>> equity_margins = broker_connection.get_margins('equity')
>>> equity_margins

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

{'enabled': True,
 'net': 1623.67,
 'available': {'adhoc_margin': 0,
  'cash': 1623.67,
  'opening_balance': 1623.67,
  'live_balance': 1623.67,
  'collateral': 0,
  'intraday_payin': 0},
 'utilised': {'debits': 0,
  'exposure': 0,
  'm2m_realised': 0,
  'm2m_unrealised': 0,
  'option_premium': 0,
  'payout': 0,
  'span': 0,
  'holding_sales': 0,
  'turnover': 0,
  'liquid_collateral': 0,
  'stock_collateral': 0}}
  1. 显示股票资金:
>>> equity_funds = broker_connection.get_funds('equity')
>>> equity_funds

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

1623.67
  1. 显示商品保证金:
>>> commodity_margins = get_margins(commodity')
>>> commodity_margins

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

{'enabled': True,
 'net': 16215.26,
 'available': {'adhoc_margin': 0,
  'cash': 16215.26,
  'opening_balance': 16215.26,
  'live_balance': 16215.26,
  'collateral': 0,
  'intraday_payin': 0},
 'utilised': {'debits': 0,
  'exposure': 0,
  'm2m_realised': 0,
  'm2m_unrealised': 0,
  'option_premium': 0,
  'payout': 0,
  'span': 0,
  'holding_sales': 0,
  'turnover': 0,
  'liquid_collateral': 0,
  'stock_collateral': 0}}
  1. 显示商品资金:
>>> commodity_funds = broker_connection.get_funds('commodity')
>>> commodity_funds

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

0

工作原理…

broker_connection对象提供了用于获取经纪账户可用保证金和资金的方法:

  • get_margins()
  • get_funds()

经纪公司 Zerodha 分别跟踪 equitycommodity 产品的保证金和资金。如果您使用的是 pyalgotrading 支持的其他经纪公司,则可能会将资金和保证金分别跟踪 equitycommodity

步骤 1 展示了如何使用broker_connection对象的get_margins()方法查询equity产品的保证金,参数为equity步骤 2 展示了如何使用broker_connection对象的get_funds()方法查询equity产品的资金,参数为equity字符串。

步骤 34 展示了如何查询以commodity字符串为参数的commodity产品的保证金和资金情况。

计算收取的佣金

每次成功完成的订单,经纪人可能会收取一定的费用,这通常是买卖工具价格的一小部分。虽然金额看似不大,但重要的是要跟踪佣金,因为它最终可能会吃掉你一天结束时的可观利润的一大部分。

收取的佣金因经纪人而异,也因交易段而异。针对这个方案,我们将考虑佣金为 0.01%。

如何做…

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

  1. 计算每笔交易收取的佣金:
>>> entry_price = 1245
>>> brokerage = (0.01 * 1245)/100
>>> print(f'Brokerage charged per trade: {brokerage:.4f}')

我们将获得以下输出:

Brokerage charged per trade: 0.1245
  1. 计算 10 笔交易的总佣金:
>>> total_brokerage = 10 * (0.01 * 1245) / 100
>>> print(f'Total Brokerage charged for 10 trades: \
            {total_brokerage:.4f}')

我们将获得以下输出:

Total Brokerage charged for 10 trades: 1.2450

工作原理…

第 1 步 中,我们从交易买入或卖出的价格entry_price开始。对于这个方案,我们使用了1245。接下来,我们计算价格的 0.01%,即0.1245。然后,我们计算 10 笔这样的交易的总佣金,结果为10 * 0.1245 = 1.245

每个订单,佣金都会收取两次。第一次是当订单进入持仓时,而第二次是当订单退出持仓时。要获取所收取的佣金的确切细节,请参考您的经纪人提供的费用清单。

计算收取的政府税费

对于每个成功完成的订单,政府可能会收取一定的费用,这是买卖工具价格的一小部分。虽然金额看似不大,但重要的是要跟踪政府税费,因为它最终可能会吃掉你一天结束时的可观利润的一大部分。

政府的收费取决于交易所的位置,并且从一个交易段到另一个交易段都有所不同。针对这个方案,我们将考虑政府税费的费率为 0.1%。

如何做…

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

  1. 计算每笔交易收取的政府税费:
>>> entry_price = 1245
>>> brokerage = (0.1 * 1245)/100
>>> print(f'Government taxes charged per trade: {brokerage:.4f}')

我们将获得以下输出:

Government taxes charged per trade: 1.2450
  1. 计算 10 笔交易收取的总政府税费:
>>> total_brokerage = 10 * (0.1 * 1245) / 100
>>> print(f'Total Government taxes charged for 10 trades: \
            {total_brokerage:.4f}')

我们将获得以下输出:

Total Government taxes charged for 10 trades: 12.4500

工作原理…

第 1 步 中,我们从交易买入或卖出的价格entry_price开始。对于这个方案,我们使用了1245。接下来,我们计算价格的 0.1%,即1.245。然后,我们计算 10 笔这样的交易的总佣金,结果为10 * 1.245 = 12.245

对于每个订单,政府税费会收取两次。第一次是当订单进入持仓时,而第二次是当订单退出持仓时。要获取所收取的政府税费的确切细节,请参考交易所提供的政府税费清单。

相关文章
|
1天前
|
存储 机器学习/深度学习 算法
【数据结构与算法】:手搓顺序表(Python篇)
【数据结构与算法】:手搓顺序表(Python篇)
|
2天前
|
存储 算法 调度
力扣中级算法(Python)
力扣中级算法(Python)
|
2天前
|
算法 Python
力扣初级算法(Python)(二)
力扣初级算法(Python)(二)
|
2天前
|
算法 Python
力扣初级算法(Python)(一)
力扣初级算法(Python)(一)
|
3天前
|
机器学习/深度学习 传感器 算法
基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
|
3天前
|
算法 数据可视化 Python
【KMeans】Python实现KMeans算法及其可视化
【KMeans】Python实现KMeans算法及其可视化
|
3天前
|
搜索推荐 算法 UED
基于Python的推荐系统算法实现与评估
本文介绍了推荐系统的基本概念和主流算法,包括基于内容的推荐、协同过滤以及混合推荐。通过Python代码示例展示了如何实现基于内容的推荐和简化版用户-用户协同过滤,并讨论了推荐系统性能评估指标,如预测精度和覆盖率。文章强调推荐系统设计的迭代优化过程,指出实际应用中需考虑数据稀疏性、冷启动等问题。【6月更文挑战第11天】
35 3
|
4天前
|
存储 算法 数据可视化
算法金 | D3blocks,一个超酷的 Python 库
D3Blocks是一个基于d3.js的Python图形库,用于创建吸引人的数据可视化图表,如D3graph、Elasticgraph和Sankey图。拥有超过470个Star,其特点包括简易性、功能丰富、易用性、可定制性和及时更新。通过pip安装后,用户能轻松创建粒子图和其他图表。文中展示了实战应用,如能源数据集的网络图,通过调整节点和边的属性实现个性化展示。关注作者,享受智能乐趣。
42 8
算法金 | D3blocks,一个超酷的 Python 库