hikyuu交易管理

基础数据结构

交易业务类型

hikyuu.trade_manage.get_business_name(business)
参数:	business (BUSINESS) – 交易业务类型
返回:	交易业务类型名称(“INIT”|”BUY”|”SELL”|”GIFT”|”BONUS”|”CHECKIN”|”CHECKOUT”|”UNKNOWN”
返回类型:	string
hikyuu.trade_manage.get_business_name(business)
class hikyuu.trade_manage.BUSINESS
BUSINESS.INIT - 建立初始账户
BUSINESS.BUY - 买入
BUSINESS.SELL - 卖出
BUSINESS.GIFT - 送股
BUSINESS.BONUS - 分红
BUSINESS.CHECKIN - 存入现金
BUSINESS.CHECKOUT - 取出现金
BUSINESS.INVALID - 无效类型
class hikyuu.trade_manage.BUSINESS

 

交易成本记录

交易成本计算的返回结果

class hikyuu.trade_manage.CostRecord
交易成本记录

commission 佣金(float)
stamptax 印花税(float)
transferfee 过户费(float)
others 其它费用(float)
total 总成本(float),= 佣金 + 印花税 + 过户费 + 其它费用
class hikyuu.trade_manage.CostRecord

 

交易记录

class hikyuu.trade_manage.TradeRecordList
交易记录列表,C++ std::vector<TradeRecord>包装

to_np()
仅在安装了numpy模块时生效,转换为numpy.array

to_df()
仅在安装了pandas模块时生效,转换为pandas.DataFrame
class hikyuu.trade_manage.TradeRecordList
class hikyuu.trade_manage.TradeRecord([stock, datetime, business, planPrice, realPrice, goalPrice, number, cost, stoploss, cash, part])
交易记录

stock 股票(Stock)
datetime 交易时间(Datetime)
business 交易类型
plan_price 计划交易价格(float)
real_price 实际交易价格(float)
goal_price 目标价格(float),如果为0表示未限定目标
number 成交数量(float)
cost 交易成本
类型:CostRecord

stoploss 止损价(float)
cash 现金余额(float)
part
交易指示来源,区别是交易系统哪个部件发出的指示,参见: System.Part
class hikyuu.trade_manage.TradeRecord([stock, datetime, business, planPrice, realPrice, goalPrice, number, cost, stoploss, cash, part])

 

持仓记录

class hikyuu.trade_manage.PositionRecordList
持仓记录列表,C++ std::vector<PositionRecord>包装

to_np()
仅在安装了numpy模块时生效,转换为numpy.array

to_df()
仅在安装了pandas模块时生效,转换为pandas.DataFrame
class hikyuu.trade_manage.PositionRecordList
class hikyuu.trade_manage.PositionRecord([stock, take_datetime, clean_datetime, number, stoploss, goal_price, total_number, buy_money, total_cost, total_risk, sell_money])
持仓记录

stock 交易对象(Stock)
take_datetime 初次建仓时刻(Datetime)
clean_datetime 平仓日期,当前持仓记录中为 constant.null_datetime
number 当前持仓数量(float)
stoploss 当前止损价(float)
goal_price 当前的目标价格(float)
total_number 累计持仓数量(float)
buy_money 累计买入资金(float)
total_cost 累计交易总成本(float)
total_risk 累计交易风险(float) = 各次 (买入价格-止损)*买入数量, 不包含交易成本
sell_money 累计卖出资金(float)
class hikyuu.trade_manage.PositionRecord([stock, take_datetime, clean_datetime, number, stoploss, goal_price, total_number, buy_money, total_cost, total_risk, sell_money])

 

资产情况记录

由TradeManager::getFunds返回

class hikyuu.trade_manage.FundsRecord([cash, market_value, short_market_value, base_cash, base_asset, borrow_cash, borrow_asset])
当前资产情况记录,由 TradeManager.getFunds() 返回

cash 当前现金(float)
market_value 当前多头市值(float)
short_market_value 当前空头仓位市值(float)
base_cash 当前投入本金(float)
base_asset 当前投入的资产价值(float)
borrow_cash 当前借入的资金(float),即负债
borrow_asset 当前借入证券资产价值(float)
class hikyuu.trade_manage.FundsRecord([cash, market_value, short_market_value, base_cash, base_asset, borrow_cash, borrow_asset])

 

交易成本算法

内建交易成本算法

零交易成本算法

hikyuu.trade_manage.TC_Zero()
返回:	TradeCostBase 子类实例
hikyuu.trade_manage.TC_Zero()

沪深A股交易成本算法

  • 2015年8月1日之前,上证过户费为交易数量的千分之一,不足1元,按1元计。
  • 2015年8月1日之后,上证过户费为成交金额的千分之0.02

计算规则如下:: python

1)上证交易所
买入:佣金+过户费 卖出:佣金+过户费+印花税
2)深证交易所:
买入:佣金 卖出:佣金+印花税

其中,佣金最低5元

hikyuu.trade_manage.TC_FixedA2015([commission=0.0018, lowestCommission=5.0, stamptax=0.001, transferfee=0.00002])
2015年8月1日及之后的A股交易成本算法,上证过户费改为成交金额的千分之0.02

参数:	
commission (float) – 佣金比例
lowestCommission (float) – 最低佣金值
stamptax (float) – 印花税
transferfee (float) – 过户费
返回:	
TradeCostBase 子类实例
hikyuu.trade_manage.TC_FixedA2015([commission=0.0018, lowestCommission=5.0, stamptax=0.001, transferfee=0.00002])
hikyuu.trade_manage.TC_FixedA([commission=0.0018, lowestCommission=5.0, stamptax=0.001, transferfee=0.001, lowestTransferfee=1.0])
2015年8月1日之前的A股交易成本算法

参数:	
commission (float) – 佣金比例
lowestCommission (float) – 最低佣金值
stamptax (float) – 印花税
transferfee (float) – 过户费
lowestTransferfee (float) – 最低过户费
返回:	
TradeCostBase 子类实例
hikyuu.trade_manage.TC_FixedA([commission=0.0018, lowestCommission=5.0, stamptax=0.001, transferfee=0.001, lowestTransferfee=1.0])

自定义交易成本算法

自定义交易成本算法接口:

  • TradeCostBase.getBuyCost() - 【必须】获取买入成本
  • TradeCostBase.getSellCost() - 【必须】获取卖出成本
  • TradeCostBase._clone() - 【必须】子类克隆接口

交易成本算法基类

class hikyuu.trade_manage.TradeCostBase(name)
交易成本算法基类

name 名称
get_param(self, name)
获取指定的参数

参数:	name (str) – 参数名称
返回:	参数值
引发:	out_of_range – 无此参数
set_param(self, name, value)
设置参数

参数:	
name (str) – 参数名称
value (int | bool | float | string) – 参数值
引发:	
logic_error – Unsupported type! 不支持的参数类型

clone(self)
克隆操作

get_buy_cost(self, datetime, stock, price, num)
【重载接口】获取买入成本

参数:	
datetime (Datetime) – 买入时刻
stock (Stock) – 买入对象
price (float) – 买入价格
num (int) – 买入数量
返回:	
交易成本记录

返回类型:	
CostRecord

get_sell_cost(self, datetime, stock, price, num)
【重载接口】获取卖出成本

参数:	
datetime (Datetime) – 卖出时刻
stock (Stock) – 卖出对象
price (float) – 卖出价格
num (int) – 卖出数量
返回:	
交易成本记录

返回类型:	
CostRecord

_clone(self)
【重载接口】子类克隆接口
class hikyuu.trade_manage.TradeCostBase(name)

 

交易管理

交易管理可理解为一个模拟账户进行模拟交易。一般使用 crtTM 创建交易管理实例。

公共参数:

  • reinvest=False (bool) : 红利是否再投资
  • precision=2 (int) : 价格计算精度
  • support_borrow_cash=False (bool) : 是否自动融资
  • support_borrow_stock=False (bool) : 是否自动融券
  • save_action=True (bool) : 是否保存Python命令序列
hikyuu.trade_manage.crtTM([date = Datetime(199001010000), init_cash = 100000, cost_func = TC_Zero(), name = "SYS"])
创建交易管理模块,管理帐户的交易记录及资金使用情况

参数:	
date (Datetime) – 账户建立日期
init_cash (float) – 初始资金
cost_func (TradeCost) – 交易成本算法
name (string) – 账户名称
返回类型:	
TradeManager
hikyuu.trade_manage.crtTM([date = Datetime(199001010000), init_cash = 100000, cost_func = TC_Zero(), name = "SYS"])
class hikyuu.trade_manage.TradeManager
交易管理类,可理解为一个模拟账户进行模拟交易。一般使用 crtTM 创建交易管理实例。

name
名称

cost_func
交易成本算法

init_cash
(只读)初始资金

current_cash
(只读)当前资金

init_datetime
(只读)账户建立日期

first_datetime
(只读)第一笔买入交易发生日期,如未发生交易返回 Datetime()

last_datetime
(只读)最后一笔交易日期,注意和交易类型无关,如未发生交易返回账户建立日期

reinvest
(只读)红利/股息/送股再投资标志,同公共参数“reinvest”

precision
(只读)价格精度,同公共参数“precision”

broker_last_datetime
实际开始订单代理操作的时刻。

默认情况下,TradeManager会在执行买入/卖出操作时,调用订单代理执行代理的买入/卖出动作,但这样在实盘操作时会存在问题。因为系统在计算信号指示时,需要回溯历史数据才能得到最新的信号,这样TradeManager会在历史时刻就执行买入/卖出操作,此时如果订单代理本身没有对发出买入/卖出指令的时刻进行控制,会导致代理发送错误的指令。此时,需要指定在某一个时刻之后,才允许指定订单代理的买入/卖出操作。属性 brokeLastDatetime 即用于指定该时刻。

__init__(self, datetime, initcash, costfunc, name)
初始化构造函数

参数:	
datetime (Datetime) – 账户建立日期
initCash (float) – 初始资金
costFunc (TradeCostBase) – 成本算法
name (str) – 账户名称
get_param(self, name)
获取指定的参数

参数:	name (str) – 参数名称
返回:	参数值
引发:	out_of_range – 无此参数
set_param(self, name, value)
设置参数

参数:	
name (str) – 参数名称
value (int | bool | float | string) – 参数值
引发:	
logic_error – Unsupported type! 不支持的参数类型

reset(self)
复位,清空交易、持仓记录

clone(self)
克隆(深复制)实例

返回类型:	TradeManager
checkin(self, datetime, cash)
向账户内存入现金

参数:	
datetime (Datetime) – 交易时间
cash (float) – 存入的现金量
返回类型:	
TradeRecord

checkout(self, datetime, cash)
从账户内取出现金

参数:	
datetime (Datetime) – 交易时间
cash (float) – 取出的资金量
返回类型:	
TradeRecord

buy(self, datetime, stock, real_price, number[, stoploss=0.0, goal_price=0.0, plan_price=0.0, part=System.INVALID])
买入操作

参数:	
datetime (Datetime) – 买入时间
stock (Stock) – 买入的证券
real_price (float) – 实际买入价格
num (float) – 买入数量
stoploss (float) – 止损价
goal_price (float) – 目标价格
plan_price (float) – 计划买入价格
part (SystemPart) – 交易指示来源
返回类型:	
TradeRecord

sell(self, datetime, stock, real_price[, number=constant.max_double, stoploss=0.0, goal_price=0.0, plan_price=0.0, part=System.INVALID])
卖出操作

参数:	
datetime (Datetime) – 卖出时间
stock (Stock) – 卖出的证券
real_price (float) – 实际卖出价格
num (float) – 卖出数量,如果等于constant.max_double, 表示全部卖出
stoploss (float) – 新的止损价
goal_price (float) – 新的目标价格
plan_price (float) – 原计划卖出价格
part (SystemPart) – 交易指示来源
返回类型:	
TradeRecord

have(self, stock)
当前是否持有指定的证券

参数:	stock (Stock) – 指定证券
返回类型:	bool
cash(self, datetime[, ktype=Query.KType.DAY])
获取指定日期的现金。(注:如果不带日期参数,无法根据权息信息调整持仓。)

参数:	
datetime (Datetime) – 指定时刻
ktype – K线类型
返回类型:	
float

get_stock_num(self)
当前持有的证券种类数量,即当前持有几只股票(非各个股票的持仓数)

返回类型:	int
get_hold_num(self, datetime, stock)
获取指定时刻指定证券的持有数量

参数:	
datetime (Datetime) – 指定时刻
stock (Stock) – 指定的证券
返回类型:	
int

get_position(self, stock)
获取指定证券的当前持仓记录,如当前未持有该票,返回PositionRecord()

参数:	stock (Stock) – 指定的证券
返回类型:	PositionRecord
get_trade_list(self[, start, end])
获取交易记录,未指定参数时,获取全部交易记录

参数:	
start (Datetime) – 起始日期
end (Datetime) – 结束日期
返回类型:	
TradeRecordList

get_position_list(self)
获取当前全部持仓记录

返回类型:	PositionRecordList
get_history_position_list(self)
获取全部历史持仓记录,即已平仓记录

返回类型:	PositionRecordList
get_buy_cost(self, datetime, stock, price, num)
计算买入成本

参数:	
datetime (Datetime) – 交易时间
stock (Stock) – 交易的证券
price (float) – 买入价格
num (float) – 买入数量
返回类型:	
CostRecord

get_sell_cost(self, datetime, stock, price, num)
计算卖出成本

参数:	
datetime (Datetime) – 交易时间
stock (Stock) – 交易的证券
price (float) – 卖出价格
num (float) – 卖出数量
返回类型:	
CostRecord

get_funds(self[, ktype = Query.DAY])
获取账户当前时刻的资产详情

参数:	ktype (Query.KType) – K线类型
返回类型:	FundsRecord
get_funds(self, datetime, [ktype = Query.DAY])

获取指定时刻的资产市值详情

参数:	
datetime (Datetime) – 指定时刻
ktype (Query.KType) – K线类型
返回类型:	
FundsRecord

get_funds_curve(self, dates[, ktype = Query.DAY])
获取资产净值曲线

参数:	
dates (DatetimeList) – 日期列表,根据该日期列表获取其对应的资产净值曲线
ktype (Query.KType) – K线类型,必须与日期列表匹配
返回:	
资产净值列表

返回类型:	
PriceList

get_profit_curve(self, dates[, ktype = Query.DAY])
获取收益曲线,即扣除历次存入资金后的资产净值曲线

参数:	
dates (DatetimeList) – 日期列表,根据该日期列表获取其对应的收益曲线,应为递增顺序
ktype (Query.KType) – K线类型,必须与日期列表匹配
返回:	
收益曲线

返回类型:	
PriceList

add_trade_record(self, tr)
直接加入交易记录,如果加入初始化账户记录,将清除全部已有交易及持仓记录。

参数:	tr (TradeRecord) – 交易记录
返回:	True(成功) | False(失败)
返回类型:	bool
tocsv(self, path)
以csv格式输出交易记录、未平仓记录、已平仓记录、资产净值曲线

参数:	path (str) – 输出文件所在目录
reg_broker(self, broker)
注册订单代理。可执行多次该命令注册多个订单代理。

参数:	broker (OrderBrokerBase) – 订单代理实例
clear_broker(self)
清空所有已注册订单代理
class hikyuu.trade_manage.TradeManager

 

订单管理

可通过向 TradeManager.regBroker() 向 TradeManager 注册多个订单代理实例。这些订单代理可执行额外的买入/卖出动作,如邮件订单代理,在 TradeManager 发出买入/卖出指令时,邮件订单代理可以发送邮件。

默认情况下,TradeManager会在执行买入/卖出操作时,调用订单代理执行代理的买入/卖出动作,但这样在实盘操作时会存在问题。因为系统在计算信号指示时,需要回溯历史数据才能得到最新的信号,这样TradeManager会在历史时刻就执行买入/卖出操作, 此时如果订单代理本身没有对发出买入/卖出指令的时刻进行控制,会导致代理发送错误的指令 。因此,需要指定在某一个时刻之后,才允许执行订单代理的买入/卖出操作。TradeManager的属性 TradeManager.brokeLastDatetime即用于指定该时刻。

Python订单代理包装

由于通过从 OrderBrokerBase 继承实现自定义的订单代理,需要实现 _buy、_sell 两个接口方法。由于在 Python 众多的软件包中,有些软件包已经实现了实盘交易的功能,如 Hikyuu 内建的来自 “睿瞳深邃” 的 扯线木偶 (感谢“睿瞳深邃”的共享)。这些软件包中的交易类一般都已经实现了 buy、sell 方法,如果从 OrderBrokerBase 继承实现订单代理类,代码显得冗长,使用不方便。所以,在 Python 中,实现了 OrderBrokerWrap 类和 crtOB() 函数,可以快速包装具有 buy、sell 方法的类生成订单代理。

#创建模拟交易账户进行回测,初始资金30万
my_tm = crtTM(initCash = 300000)

#注册实盘交易订单代理
my_tm.regBroker(crtOB(TestOrderBroker())) #TestOerderBroker是测试用订单代理对象,只打印
#my_tm.regBroker(crtOB(Puppet()))  #Puppet为内建的扯线木偶实盘下单对象
#my_tm.regBroker(crtOB(MailOrderBroker("smtp.sina.com", "yourmail@sina.com", "yourpwd", "receivermail@XXX.yy)))

#根据需要修改订单代理最后的时间戳,后续只有大于该时间戳时,订单代理才会实际发出订单指令
my_tm.brokeLastDatetime=Datetime(201706010000)

#创建信号指示器(以5日EMA为快线,5日EMA自身的10日EMA最为慢线,快线向上穿越慢线时买入,反之卖出)
my_sg = SG_Flex(OP(EMA(n=5)), slow_n=10)

#固定每次买入1000股
my_mm = MM_FixedCount(1000)

#创建交易系统并运行
sys = SYS_Simple(tm = my_tm, sg = my_sg, mm = my_mm)
sys.run(sm['sz000001'], Query(-150))
代码示例
class hikyuu.trade_manage.OrderBrokerWrap(broker[, real=True, slip=0.03])
订单代理包装类,用户可以参考自定义自己的订单代理,加入额外的处理

参数:    
real (bool) – 下单前是否重新实时获取实时分笔数据
slip (float) – 如果当前的卖一价格和指示买入的价格绝对差值不超过slip则下单,否则忽略; 对卖出操作无效,立即以当前价卖出
_buy(self, code, price, num)
包装 Python 变量的 buy 方法

参数:    
code (str) – 证券代码
price (float) – 买入价格
num (int) – 买入数量
_sell(self, code, price, num)
包装 Python 变量的 sell 方法

参数:    
code (str) – 证券代码
price (float) – 卖出价格
num (int) – 卖出数量
class hikyuu.trade_manage.OrderBrokerWrap(broker[, real=True, slip=0.03])
快速生成订单代理包装对象

参数:    
broker – 订单代理示例,必须拥有buy和sell方法,并且参数为 code, price, num
real (bool) – 下单前是否重新实时获取实时分笔数据
slip (float) – 如果当前的卖一价格和指示买入的价格绝对差值不超过slip则下单,否则忽略; 对卖出操作无效,立即以当前价卖出
hikyuu.trade_manage.crtOB(broker[, real=True, slip=0.03])

内建的订单代理类

class hikyuu.trade_manage.TestOrderBroker
用于测试,在执行买入卖出操作时,进行打印,如:“买入:000001 10.0 1000”
class hikyuu.trade_manage.TestOrderBroker
class hikyuu.trade_manage.MailOrderBroker
邮件订单代理,执行买入/卖出操作时发送 Email,如:

my_tm.regBroker(crtOB(MailOrderBroker("smtp.sina.com", "yourmail@sina.com", "yourpwd", "receivermail@XXX.yy)))
__init__(self, host, sender, pwd, receivers)
初始化构造函数

参数:    
host (str) – smtp服务器地址
port (int) – smtp服务器端口
sender (str) – 发件邮箱(既用户名)
pwd (str) – 密码
receivers (list) – 接受者邮箱列表
buy(self, code, price, num)
执行买入操作,向指定的邮箱发送邮件,格式如下:

邮件标题:【Hkyuu提醒】买入 证券代码 邮件内容:买入:证券代码,价格:买入的价格,数量:买入数量
参数:    
code (str) – 证券代码
price (float) – 买入价格
num (int) – 买入数量
sell(self, code, price, num)
执行卖出操作,向指定的邮箱发送邮件,格式如下:

邮件标题:【Hkyuu提醒】卖出 证券代码 邮件内容:卖出:证券代码,价格:卖出的价格,数量:卖出数量
参数:    
code (str) – 证券代码
price (float) – 卖出价格
num (int) – 卖出数量
class hikyuu.trade_manage.MailOrderBroker

订单代理基类

Python中非必须使用 OrderBrokerBase 来实现自定义的订单代理。只要 Python 的对象包含 buy、sell方法,其方法参数规则与 OrderBrokerWrap 中的 _buy、_sell 方法相同,即可参见前一章节快速创建订单代理实例。

自定义订单代理接口:

订单代理基类,实现实际的订单操作及程序化的订单

name 代理名称
__init__(self[, name='NO_NAME'])
初始化订单代理基类

参数:    name (str) – 代理名称
buy(self, code, price, num)
执行买入操作

参数:    
code (str) – 证券代码
price (float) – 买入价格
num (int) – 买入数量
返回:    
买入操作的执行时刻

返回类型:    
Datetime

sell(self, code, price, num)
执行买入操作

参数:    
code (str) – 证券代码
price (float) – 买入价格
num (int) – 买入数量
返回:    
卖出操作的执行时刻

返回类型:    
Datetime

_buy(self, code, price, num)
【重载接口】执行实际买入操作

参数:    
code (str) – 证券代码
price (float) – 买入价格
num (int) – 买入数量
_sell(self, code, price, num)
【重载接口】执行实际买入操作

参数:    
code (str) – 证券代码
price (float) – 买入价格
num (int) – 买入数量
class hikyuu.trade_manage.OrderBrokerBase

 

绩效统计

class hikyuu.trade_manage.Performance
简单绩效统计

reset(self)
复位,清除已计算的结果

report(self, tm[, datetime=Datetime.now()])
简单的文本统计报告,用于直接输出打印

参数:    
tm (TradeManager) – 指定的交易管理实例
datetime (Datetime) – 统计截止时刻
返回类型:    
str

statistics(self, tm[, datetime=Datetime.now()])
根据交易记录,统计截至某一时刻的系统绩效, datetime必须大于等于lastDatetime

参数:    
tm (TradeManager) – 指定的交易管理实例
datetime (Datetime) – 统计截止时刻
get(self, name)
按指标名称获取指标值,必须在运行 statistics 或 report 之后生效

参数:    name (str) – 指标名称
返回类型:    float
__getitem__(self, name)
同 get 方法。按指标名称获取指标值,必须在运行 statistics 或 report 之后生效

参数:    name (str) – 指标名称
返回类型:    float
class hikyuu.trade_manage.Performance

 

posted @ 2021-02-09 14:57  KnowledgePorter  阅读(66)  评论(0)    收藏  举报