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

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

相关文章
|
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代码)