【TWS API 翻译系列】17、TWS API和IB中的财务顾问
作者:yunjinqi   类别:    日期:2022-01-03 22:21:00    阅读:1152 次   消耗积分:0 分    

财务顾问

分配方法和组

财务顾问和IBroker账户结构提供了许多方法和配置文件,以指定交易应如何分布在多个账户中。此功能允许在多个账户之间进行交易。该 API 具有与 TWS 相同的可用功能。

财务顾问账户的组和配置文件订单分配方法可以直接在TWS:分配和转移中创建,也可以通过API直接使用IBApi.EClient.replaceFA()方法。

根据以下方法名称的建议,一个集团将根据固有属性(例如账户的清算价值或净值)分配订单,而配置文件将提供根据明确比率或百分比在各个不同账户之间分配比例的可能性。
但请注意,在 TWS **v983+**中,有一个 API 设置,用于合并组和配置文件,其中两种分配方法都被视为组。请参阅组和配置文件的统一

按组分配

等量

*要求您指定订单大小。*此方法在组中的所有帐户之间平均分配共享。

示例:您发送了 400 股股票 ABC 的订单。如果您的帐户组包括四个帐户,则每个帐户将获得 100 个共享。如果您的账户组包括六个账户,则每个账户将获得 66 股,然后为每个账户分配 1 股,直到全部分配完毕。

NetLiq

*要求您指定订单大小。*这种方法根据每个账户的净清算价值分配股票。系统根据每个账户的净清算价值计算比率,并根据这些比率分配股份。

示例:您发送了 700 股股票 XYZ 的订单。账户组包括三个账户,A、B和C,净清算价值分别为25000美元、50000美元和100000美元。系统计算 1:2:4 的比率,并向客户 A 分配 100 股,向客户 B 分配 200 股,向客户 C 分配 400 股。

AvailableEquity

*要求您指定订单大小。*这种方法根据每个账户的可用净值金额分配股票。系统根据每个账户的可用净值计算比率,并根据这些比率分配份额。

示例:您发送了 700 股股票 XYZ 的订单。账户组包括三个账户,A、B和C,可用净值分别为25 000美元、50 000美元和100 000美元。系统计算 1:2:4 的比率,并向客户 A 分配 100 股,向客户 B 分配 200 股,向客户 C 分配 400 股。

PctChange

*不要指定订单大小。*由于数量是由系统计算的,因此在确认订单后,订单大小将显示在"数量"字段中。此方法增加或减少已存在的仓位。正百分比将增加头寸,负百分比将减少头寸。例如,要完全平仓,您只需将百分比指定为-100即可。

买入订单正百分比负百分比
多头仓位增加位置无效果
空头头寸无效果减少位置



卖出订单正百分比负百分比
多头仓位无效果减少位置
空头头寸增加位置无效果

按配置文件分配

百分比

此方法将根据您指定的百分比在列出的帐户之间拆分订单中的股票数。例如,使用具有四个帐户的配置文件(每个帐户的 25%)订购 1000 股,将为配置文件中列出的每个帐户分配 250 股。

财务比率

此方法根据您输入的比率计算股票分配。例如,使用四个账户设置为 4、2、1、1 的比率的配置文件订购 1000 股股票,将分别向列出的账户分配 500、250、125 和 125 股股票。

股票

此方法将您输入的绝对份额数分配给列出的每个帐户。如果使用此方法,则通过将分配给配置文件中每个帐户的份额数相加来计算订单大小。

分析方法类型编号
百分比类型 - 1
财务比率类型 - 2
股票类型 - 3

来自 API 的组和配置文件

IBApi.EClient.requestFA功能允许财务顾问从TWS手动请求当前分配配置数据。

请求帐户别名

self.requestFA(FaDataTypeEnum.ALIASES)

请求 FA 组

self.requestFA(FaDataTypeEnum.GROUPS)

请求 FA 配置文件

self.requestFA(FaDataTypeEnum.PROFILES)

生成的 FA 分配配置将通过IBApi.EWrapper.receiveFA提供。该事件包括一个 XML 字符串,其中包含所请求的信息。

class TestWrapper(wrapper.EWrapper):# ...
   def receiveFA(self, faData: FaDataType, cxml: str):
       super().receiveFA(faData, cxml)
       print("Receiving FA: ", faData)
       open('log/fa.xml', 'w').write(cxml)

可以通过传入包含所有分配信息的完整 XML 字符串来调用IBApi.EClient.replaceFA函数来替换 TWS 中以前的 FA 配置。

替换账户组配置

  FaOneGroup = "".join(("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
          , "<ListOfGroups>"                                                   
                    , "<Group>"                                              
                             , "<name>Equal_Quantity</name>"                  
                             , "<ListOfAccts varName=\"list\">"               
                                     #Replace with your own accountIds
                                     , "<String>DU119915</String>"            
                                     , "<String>DU119916</String>"            
                             , "</ListOfAccts>"                               
                             , "<defaultMethod>EqualQuantity</defaultMethod>" 
                     , "</Group>"                                             
             , "</ListOfGroups>"))
self.replaceFA(1000, FaDataTypeEnum.GROUPS, FaAllocationSamples.FaOneGroup)

***注意:*上述命令将 TWS 中以前的任何 FA 组配置替换为一个"Group_Equal_Quantity"组分配。

FaTwoGroups = "".join(("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"               
                 ,"<ListOfGroups>"                                            
                     , "<Group>"                                              
                             , "<name>Equal_Quantity</name>"                  
                             , "<ListOfAccts varName=\"list\">"               
                                     #Replace with your own accountIds                            
                                     , "<String>DU119915</String>"                                
                                     , "<String>DU119916</String>"            
                             , "</ListOfAccts>"                               
                             , "<defaultMethod>EqualQuantity</defaultMethod>" 
                     , "</Group>"                                             
                     , "<Group>"                                              
                             , "<name>Pct_Change</name>"                      
                             , "<ListOfAccts varName=\"list\">"               
                 #Replace with your own accountIds                            
                 , "<String>DU119915</String>"                                
                                     , "<String>DU119916</String>"            
                            , "</ListOfAccts>"                               
                             , "<defaultMethod>PctChange</defaultMethod>"     
                     , "</Group>"                                             
             , "</ListOfGroups>"))
self.replaceFA(1001, FaDataTypeEnum.GROUPS, FaAllocationSamples.FaTwoGroups)

***注意:*上述命令会将另一个"Group_Pct_Change"组分配添加到以前的 FA 配置中。

替换帐户配置文件配置

您可以在上面的"配置文件方法匹配"表中找到配置文件分配的相应类型编号。

FaOneProfile = "".join(("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"              
                 , "<ListOfAllocationProfiles>"                               
                     , "<AllocationProfile>"                                  
                             , "<name>Percent_60_40</name>"                   
                             , "<type>1</type>"                               
                             , "<ListOfAllocations varName=\"listOfAllocations\">"
                                     , "<Allocation>"                         
                                             #Replace with your own accountIds                        
                                             , "<acct>DU119915</acct>"                                
                                             , "<amount>60.0</amount>"        
                                     , "</Allocation>"                        
                                     , "<Allocation>"                         
                                             #Replace with your own accountIds                        
                                             , "<acct>DU119916</acct>"                                
                                             , "<amount>40.0</amount>"        
                                     , "</Allocation>"                        
                             , "</ListOfAllocations>"                         
                     , "</AllocationProfile>"                                 
             , "</ListOfAllocationProfiles>"))
 self.replaceFA(1002, FaDataTypeEnum.PROFILES, FaAllocationSamples.FaOneProfile)

***注意:*上述命令将用一个"Percent_60_40"配置式分配替换TWS中任何以前的FA配置文件配置

FaTwoProfiles = "".join(("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"             
                 , "<ListOfAllocationProfiles>"                               
                     , "<AllocationProfile>"                                  
                             , "<name>Percent_60_40</name>"                   
                             , "<type>1</type>"                               
                             , "<ListOfAllocations varName=\"listOfAllocations\">" 
                                     , "<Allocation>"                         
                                             #Replace with your own accountIds                        
                                             , "<acct>DU119915</acct>"                                
                                             , "<amount>60.0</amount>"        
                                     , "</Allocation>"                        
                                     , "<Allocation>"                         
                                             #Replace with your own accountIds                        
                                             , "<acct>DU119916</acct>"                                
                                             , "<amount>40.0</amount>"        
                                     , "</Allocation>"                        
                             , "</ListOfAllocations>"                         
                     , "</AllocationProfile>"                                 
                     , "<AllocationProfile>"                                  
                             , "<name>Ratios_2_1</name>"                      
                             , "<type>2</type>"                               
                             , "<ListOfAllocations varName=\"listOfAllocations\">"
                                     , "<Allocation>"                         
                                             #Replace with your own accountIds                        
                                             , "<acct>DU119915</acct>"                                
                                             , "<amount>2.0</amount>"         
                                     , "</Allocation>"                        
                                     , "<Allocation>"                         
                                             #Replace with your own accountIds                        
                                             , "<acct>DU119916</acct>"                                
                                             , "<amount>1.0</amount>"         
                                     , "</Allocation>"                        
                             , "</ListOfAllocations>"                         
                     , "</AllocationProfile>"                                 
             , "</ListOfAllocationProfiles>"))
self.replaceFA(1003, FaDataTypeEnum.PROFILES, FaAllocationSamples.FaTwoProfiles)

***注意:*上述命令会将另一个"Group_Pct_Change"组分配添加到以前的 FA 配置中

确认替换FA配置更新

为了确认您的 FA 更改已保存,您可以等待如下所示的 IBApi::EWrapper::replaceFAEnd 回调,它提供了相应的 reqId。

class TestWrapper(wrapper.EWrapper):...
     def replaceFAEnd(self, reqId: int, text: str):
         super().replaceFAEnd(reqId, text)
         print("ReplaceFAEnd.", "ReqId:", reqId, "Text:", text)

此外,保存更改后,建议通过 IBApi::EClient::requestFA.验证新的 FA 设置。如果在完全保存更改之前调用它,则可能会收到错误。请参 阅消息代码

组和配置文件的统一

使用TWS/IBGW build 983+时,API 设置将具有新的标志/复选框**,“使用具有分配方法的帐户组”(**默认情况下为新用户启用)。如果未启用,组和配置文件的行为将与以前相同。如果选中,组和配置文件功能将被合并,API 客户端将看到以下更改:

模型投资组合和 API

顾问可以使用模型投资组合轻松地将客户的部分或全部资产投资于一个或多个定制的投资组合,而不是繁琐地管理单个工具中的单个投资。

更多关于模型投资组合的信息

TWS API 可以访问具有此功能且之前已在TWS中设置特定模型的账户中的模型投资组合。API 功能允许客户端应用程序请求模型位置更新订阅、请求模型帐户更新订阅或向特定模型下订单。

TWS API 中不可用的模型组合功能:

  • 项目组合模型创建

  • 投资组合模型再平衡

  • 投资组合模型头寸或现金转移

要从特定模型请求仓位更新,可以使用函数 IBApi::EClient::reqPositionsMulti ,Position Update Subscription by Model

要请求模型帐户更新,有一个函数 IBApi::EClient::reqAccountUpdatesMulti, 参阅: Account Value Update Subscriptions by Model

要向模型下订单,必须相应地设置IBApi.Order.ModelCode字段,例如:

modelOrder = OrderSamples.LimitOrder("BUY", 200, 100)modelOrder.account = "DF12345"modelOrder.modelCode = "Technology" # model for tech stocks first created in TWSself.placeOrder(self.nextOrderId(), ContractSamples.USStock(), modelOrder)

向 FA 账户下单

账户分配

财务顾问用户可以调用IBApi.EClient.placeOrder函数,同时在IBApi.Order对象中指定相应的财务顾问字段。重要提示:与TWS不同,API没有默认帐户分配 - 必须在下每个订单时指定它。
另请注意,在 TWS v983+ 中,有一个用于合并组和配置文件功能的设置。有关详细信息,请参阅组和配置文件的统一

为单个客户帐号下订单

特别是在关联账户(不是财务顾问账户)中,有必要在 IBApi::Order::account字段中指定一个帐号,并下达每个订单。

faOrderOneAccount = OrderSamples.MarketOrder("BUY", 100)# Specify the Account Number directlyfaOrderOneAccount.account = "DU119915"self.placeOrder(self.nextOrderId(), ContractSamples.USStock(), faOrderOneAccount)

为账户组下订单

对于EqualQuantityNetLiq 和 AvailableEquity 分配方法,您需要指定IBApi.Order.FaGroupIBApi.Order.FaMethod参数。

faOrderGroupEQ = OrderSamples.LimitOrder("SELL", 200, 2000)faOrderGroupEQ.faGroup = "Group_Equal_Quantity"faOrderGroupEQ.faMethod = "EqualQuantity"self.placeOrder(self.nextOrderId(), ContractSamples.SimpleFuture(), faOrderGroupEQ)

对于PctChange分配方法,您不应指定订单大小,但需要指定IBApi.Order.FaPercentage参数。

faOrderGroupPC = OrderSamples.MarketOrder("BUY", 0)# You should not specify any order quantity for PctChange allocation methodfaOrderGroupPC.faGroup = "Pct_Change"faOrderGroupPC.faMethod = "PctChange"faOrderGroupPC.faPercentage = "100"self.placeOrder(self.nextOrderId(), ContractSamples.EurGbpFx(), faOrderGroupPC)

为帐户配置文件下订单

faOrderProfile = OrderSamples.LimitOrder("BUY", 200, 100)faOrderProfile.faProfile = "Percent_60_40"self.placeOrder(self.nextOrderId(), ContractSamples.EuropeanStock(), faOrderProfile)

模型分配

modelOrder = OrderSamples.LimitOrder("BUY", 200, 100)modelOrder.account = "DF12345"modelOrder.modelCode = "Technology" # model for tech stocks first created in TWSself.placeOrder(self.nextOrderId(), ContractSamples.USStock(), modelOrder)

软美元等级

从 API 版本 9.72.18 或更高版本和 TWS Build 959 或更高版本开始,财务顾问、对冲基金和共同基金能够通过 API 利用软美元等级功能。

申请软美元等级

可以调用IBApi.EClient.reqSoftDollarTiers函数来手动请求 TWS 的当前软美元层级结构。

self.reqSoftDollarTiers(14001)

获得软美元等级

IBApi.EWrapper.softDollarTiers回调函数用于返回软美元层值、名称和显示名称。

class TestWrapper(wrapper.EWrapper):# ...
     def softDollarTiers(self, reqId: int, tiers: list):
         super().softDollarTiers(reqId, tiers)
         print("SoftDollarTiers. ReqId:", reqId)
         for tier in tiers:
             print("SoftDollarTier.", tier)

基本面数据

从*TWS v985+开始,在API v985+*之后,Wall Street Events Horizon Calendar可以通过TWS API通过IBApi.EClient.reqWshMetaDataIBApi.EClient.reqWshEventData功能访问。有必要首先在帐户管理中激活华尔街Horizon Enchilada Pro research的订阅。
WSH为IBKR提供企业活动数据集,包括收益日期、股息日期、期权到期日、分拆、分拆和各种与投资者相关的会议。

函数IBApi.EClient.reqWshMetaData用于请求描述日历事件的元数据。

self.reqWshMetaData(1100);

然后通过回调IBApi.EWrapper.wshMetaData接收元数据

def wshMetaData(self, reqId: int, dataJson: str):
    super().wshMetaData(reqId, dataJson)
    print("WshMetaData.", "ReqId:", reqId, "Data JSON:", dataJson)

可以使用IBApi.EClient.cancelWshMetaData函数取消挂起的元数据请求

函数IBApi.EClient.reqWshEventData用于请求日历事件。*注意:*在发送此消息之前,API 客户端应通过IBApi.EClient.reqWshMetaData请求元数据,否则可能会报告错误。

self.reqWshEventData(1101, 8314);

如上所示,目前事件数据只能按 conId 进行筛选。稍后,可以为帐户、日期周期、整个月事件等添加筛选器参数。

然后通过回调IBApi.EWrapper.wshEventData接收事件数据

def wshEventData(self, reqId: int, dataJson: str):
    super().wshEventData(reqId, dataJson)
    print("WshEventData.", "ReqId:", reqId, "Data JSON:", dataJson)

可以使用IBApi.EClient.cancelWshEventData函数取消挂起的事件数据请求

另请注意,TWS 将不支持多个并发请求。上一个请求应成功、失败或被客户端在下一个请求之前取消。TWS将拒绝此类请求,并显示文本"重复的WSH元数据请求"或"重复的WSH事件请求"。


TWS API相关的教程

【TWS API使用教程1】—如何在自己创建的client和TWS之间创建一个连接,并请求当前的时间
【TWS API使用教程2】—如何使用 TWS API在ubuntu和windows上分别设置contract、获取contract详细信息、设置order、下单、获取持仓信息、获取账户信息
【TWS API使用教程3】—如何使用TWS API从盈透证券中设置contract及获取contract的信息?
【TWS API使用教程4】—如何使用TWS API在盈透证券中设置order?
【TWS API使用教程5】—如何使用TWS API在盈透证券中下单(place order)、获取订单信息、获取持仓、获取账户汇总信息?
【TWS API使用教程6】—如何使用TWS API在盈透证券中获取数据?
【TWS API 使用教程7】如何使用TWS API 从盈透证券中筛选满足一定条件的contract?
【TWS API 使用教程8】一个基于TWS API的简单的程序化策略


版权所有,转载本站文章请注明出处:云子量化, http://www.woniunote.com/article/83
上一篇:【TWS API 翻译系列】16、TWS API和IB中关于数字货币的操作
下一篇:【TWS API 翻译系列】18、TWS和IB中的错误处理信息