-
Notifications
You must be signed in to change notification settings - Fork 724
风险控制与安全
本文档旨在全面阐述Hikyuu量化交易框架中的实盘风险控制与安全策略。基于trade.py文件中的交易管理逻辑,详细说明资金校验、持仓检查和订单风控等核心安全机制。文档将解释如何配置最大单笔交易额、最大持仓比例和每日交易限额等关键参数,并介绍交易日志记录、异常熔断和手动干预开关的实现方式。同时,强调资金隔离、API密钥保护和系统监控的重要性,提供设置告警通知和定期审计的实践建议,以确保实盘交易的安全可靠。
Hikyuu项目采用模块化设计,其核心交易管理功能位于hikyuu/trade_manage/目录下。该目录包含交易逻辑的核心实现,如订单代理(broker.py)、交易记录(trade.py)以及与C++核心库的接口。trade.py文件主要负责Python层面的交易记录扩展和数据转换功能,而实际的交易执行、资金管理和风险控制逻辑则由底层C++代码(如TradeManager.h)实现。日志记录功能由util/mylog.py提供,确保所有交易活动都有迹可循。
graph TD
subgraph "Python接口层"
trade_py[trade.py]
broker_py[broker.py]
mylog_py[mylog.py]
end
subgraph "C++核心层"
TradeManager_h[TradeManager.h]
TradeManagerBase_h[TradeManagerBase.h]
end
subgraph "配置与数据"
config[hku_config_template.py]
data[数据驱动]
end
trade_py --> TradeManager_h
broker_py --> TradeManager_h
mylog_py --> trade_py
config --> trade_py
图源
- trade.py
- broker.py
- TradeManager.h
- hku_config_template.py
节源
- trade.py
- broker.py
- hku_config_template.py
trade.py文件是Python层面对交易记录和资金管理功能的扩展。它通过定义to_np、to_df等方法,为TradeRecordList和PositionRecordList类提供了便捷的数据转换接口,使其能够无缝集成到pandas等数据分析库中。此外,它还为Performance类添加了to_df方法,便于将绩效分析结果转换为DataFrame格式进行分析。这些功能虽然不直接涉及风险控制,但为后续的风险分析和审计提供了坚实的数据基础。
节源
- trade.py
Hikyuu的风险控制与安全架构采用分层设计。最上层是Python脚本,用于配置策略和参数;中间层是Python与C++的绑定层,负责调用核心功能;最底层是用C++编写的高性能核心库,实现了所有关键的交易逻辑和风险控制。这种架构既保证了开发的灵活性,又确保了执行的效率和安全性。交易指令从上层发起,经过严格的风控校验后,由底层的TradeManager执行,并通过OrderBroker与券商API进行交互。
graph TB
subgraph "用户层"
Strategy[交易策略]
Config[配置文件]
end
subgraph "接口层"
PythonAPI[Python API]
end
subgraph "核心引擎"
TradeManager[交易管理器<br>TradeManager]
MoneyManager[资金管理器<br>MoneyManager]
RiskControl[风控模块]
end
subgraph "外部系统"
BrokerAPI[券商API]
Database[数据库]
end
Strategy --> PythonAPI
Config --> PythonAPI
PythonAPI --> TradeManager
TradeManager --> MoneyManager
TradeManager --> RiskControl
TradeManager --> BrokerAPI
TradeManager --> Database
图源
- TradeManager.h
- TradeManagerBase.h
TradeManager是整个交易系统的核心,负责管理账户的交易记录、资金使用和持仓情况。它继承自TradeManagerBase,并实现了具体的交易逻辑。
在执行任何交易操作前,TradeManager会进行严格的资金和持仓校验。例如,在buy方法中,系统会检查当前现金是否足以支付购买成本(包括价格和交易费用)。如果配置了auto-checkin参数,系统会自动补充资金;否则,它会根据可用现金调整购买数量,确保不会发生透支。对于持仓检查,getStockNumber()方法会返回当前持有的证券种类数量,可以用来限制最大持仓比例。
classDiagram
class TradeManagerBase {
+string name()
+void name(string)
+int precision()
+TradeCostPtr costFunc()
+void costFunc(TradeCostPtr)
+price_t cash(Datetime, KType)
+bool have(Stock)
+bool haveShort(Stock)
+size_t getStockNumber()
+double getHoldNumber(Datetime, Stock)
+TradeRecord buy(Datetime, Stock, price_t, double, ...)
+TradeRecord sell(Datetime, Stock, price_t, double, ...)
+FundsRecord getFunds(KType)
+FundsRecord getFunds(Datetime, KType)
}
class TradeManager {
+price_t initCash()
+Datetime initDatetime()
+Datetime firstDatetime()
+Datetime lastDatetime()
+void updateWithWeight(Datetime)
+price_t currentCash()
+double getShortHoldNumber(Datetime, Stock)
+double getDebtNumber(Datetime, Stock)
+price_t getDebtCash(Datetime)
+TradeRecordList getTradeList()
+PositionRecordList getPositionList()
+PositionRecordList getHistoryPositionList()
+PositionRecord getPosition(Datetime, Stock)
+bool checkin(Datetime, price_t)
+bool checkout(Datetime, price_t)
+bool borrowCash(Datetime, price_t)
+bool returnCash(Datetime, price_t)
}
TradeManager --|> TradeManagerBase : 继承
图源
- TradeManager.h
- TradeManagerBase.h
TradeManager通过参数化设计支持灵活的风控配置。关键参数包括:
-
最大单笔交易额:可以通过
MoneyManager中的max-stock参数来限制单个证券的最大持仓数量,间接控制单笔交易额。 -
最大持仓比例:通过
getStockNumber()获取当前持仓数,并与预设的上限进行比较,实现比例控制。 - 每日交易限额:虽然没有直接的每日限额参数,但可以通过在策略层面记录每日交易总额,并在超过阈值时停止交易来实现。
节源
- TradeManager.h
- TradeManagerBase.h
系统的安全性和可审计性依赖于完善的日志记录和异常处理机制。
util/mylog.py文件提供了强大的日志记录功能。它使用Python的logging模块,并配置了文件处理器RotatingFileHandler,将日志输出到~/.hikyuu/hikyuu_py.log文件中。日志级别包括DEBUG、INFO、WARNING、ERROR和CRITICAL,便于不同场景下的调试和监控。所有交易操作,如买入、卖出,都会通过hku_info、hku_warn等函数记录到日志中,包含操作时间、证券代码、价格、数量等关键信息。
flowchart TD
Start([开始交易])
--> ValidateInput["验证输入参数"]
--> CheckCash["检查可用资金"]
--> CashValid{"资金充足?"}
CashValid --> |否| AdjustQuantity["调整购买数量或报错"]
CashValid --> |是| CheckPosition["检查当前持仓"]
--> PositionValid{"持仓数超限?"}
PositionValid --> |是| RejectOrder["拒绝订单"]
PositionValid --> |否| CalculateCost["计算交易成本"]
--> ExecuteOrder["执行交易"]
--> LogTransaction["记录交易日志"]
--> UpdatePosition["更新持仓记录"]
--> End([交易完成])
style AdjustQuantity fill:#f9f,stroke:#333
style RejectOrder fill:#f96,stroke:#333
style LogTransaction fill:#bbf,stroke:#333
图源
- mylog.py
- TradeManager.h
系统通过参数support_borrow_cash和support_borrow_stock来控制是否允许融资融券,这是一种内置的“熔断”机制,防止在极端情况下产生过大的风险敞口。当这些参数设置为false时,系统将严格限制在自有资金和证券范围内进行交易。此外,OrderBrokerWrap类提供了一个包装器,允许用户在订单代理前后加入自定义的处理逻辑,这可以用来实现手动干预开关。例如,可以在_buy方法中加入一个全局开关变量,当开关关闭时,直接返回而不执行实际的买入操作。
节源
- mylog.py
- broker.py
Hikyuu的交易管理模块依赖于多个内部和外部组件。核心依赖是C++实现的TradeManager和TradeManagerBase,它们提供了所有底层的交易逻辑。broker.py依赖于OrderBrokerBase,用于与外部券商系统进行交互。日志功能依赖于Python标准库的logging模块。配置文件hku_config_template.py定义了系统的默认配置,是系统初始化的重要依赖。
graph LR
A[trade.py] --> B[TradeManager]
C[broker.py] --> B
D[mylog.py] --> E[logging]
B --> F[TradeCostBase]
B --> G[OrderBrokerBase]
H[hku_config_template.py] --> A
H --> C
图源
- trade.py
- broker.py
- mylog.py
- hku_config_template.py
节源
- trade.py
- broker.py
- mylog.py
- hku_config_template.py
由于核心交易逻辑由C++实现,Hikyuu在处理大量交易时具有很高的性能。Python层主要负责配置和数据转换,对性能影响较小。日志记录使用了文件处理器,并设置了合理的日志级别(默认为WARN),避免了过多的I/O操作影响交易执行速度。资金和持仓的校验逻辑高效,通常在O(1)或O(log n)时间内完成。
当遇到交易问题时,应首先检查日志文件~/.hikyuu/hikyuu_py.log。常见的错误包括:
-
资金不足:日志中会记录
Ignore! Is less than the minimum number of transactions或类似的警告,表明因资金不足而无法完成交易。 -
持仓超限:如果触发了
max-stock限制,日志会显示Ignore! TM had max-stock number!。 -
API连接失败:在
OrderBroker执行操作时,如果与券商API通信失败,会抛出异常并被hku_error记录。 -
参数配置错误:检查
hikyuu.ini配置文件,确保support_borrow_cash、auto-checkin等关键风控参数设置正确。
节源
- mylog.py
- TradeManagerBase.h
Hikyuu框架通过分层架构和模块化设计,构建了一套全面且灵活的实盘风险控制与安全体系。其核心在于C++实现的TradeManager,它提供了坚实的资金、持仓和交易管理基础。Python层则提供了便捷的配置和扩展接口。通过合理的参数配置,可以实现对最大单笔交易额、最大持仓比例等风险的控制。完善的日志记录和异常处理机制确保了系统的可审计性和稳定性。结合资金隔离、API密钥保护和系统监控的最佳实践,Hikyuu能够为实盘交易提供一个安全可靠的运行环境。