-
Notifications
You must be signed in to change notification settings - Fork 724
核心概念
hikyuu 是一个专业的量化投资分析框架,其设计围绕一系列核心领域模型展开。本文档旨在深入阐述框架的核心概念,包括 Stock(股票)、KData(K线数据)、Indicator(技术指标)、TradeManager(交易管理器)和 System(交易系统)等核心类的设计理念和相互关系。通过理解这些核心组件,开发者可以更好地掌握框架的内部工作原理和设计哲学。
hikyuu 框架的核心领域模型围绕金融市场的基本要素构建,通过一系列精心设计的类来抽象和封装复杂的金融数据与交易逻辑。
Stock 类是框架中对证券(股票、基金、指数等)的抽象。它不仅仅是一个简单的数据容器,更是一个功能丰富的对象,封装了证券的所有静态属性和动态行为。
设计理念:
-
信息完整性:
Stock类包含了证券的完整信息,如市场简称 (market)、证券代码 (code)、名称 (name)、类型 (type)、起始和结束日期 (startDatetime,lastDatetime)、最小跳动量 (tick)、价格精度 (precision) 等。 -
行为封装:除了属性,
Stock还提供了丰富的方法来获取其动态数据,如getKData()用于获取K线数据,getWeight()用于获取权息信息,getFinanceInfo()用于获取财务信息等。 -
内部ID:每个
Stock实例都有一个唯一的内部ID(id()),该ID是其内部数据指针的内存地址,用于高效地作为map的键值。
关键属性与方法:
-
market_code():返回市场简称与证券代码的组合,如 "sh000001",这是框架中标识证券的常用方式。 -
getKData(const KQuery&):根据查询条件KQuery获取对应的K线数据,这是连接Stock和KData的核心方法。 -
getWeight():获取该证券的权息信息列表,用于处理复权计算。
Section sources
- Stock.h
- Stock.cpp
KData 类是 Stock 类的延伸,专门用于封装和管理特定证券在特定时间段内的行情数据。它是技术分析和策略计算的基础。
设计理念:
-
数据切片:
KData支持强大的切片操作,可以通过索引或日期范围来获取数据的子集。这通过getKData(int64_t start, int64_t end)和getKData(const Datetime& start, const Datetime& end)等方法实现。 -
多周期支持:
KData可以封装不同周期的行情数据,如日线、周线、分钟线等。KQuery类中的kType字段定义了这些周期。 -
数据访问:提供了类似STL容器的迭代器 (
begin(),end()) 和下标操作符 (operator[]),方便用户遍历和访问K线记录 (KRecord)。
关键属性与方法:
-
getKRecord(size_t pos):根据索引位置获取K线记录。 -
getPos(const Datetime& datetime):根据日期获取在KData中的索引位置。 -
getKData(const KQuery::KType& ktype):获取相同时间范围内其他周期的K线数据,例如从日线数据获取对应的分钟线数据。 -
open(),close(),high(),low(),vol():这些方法返回Indicator对象,分别代表开盘价、收盘价、最高价、最低价和成交量,是进行技术指标计算的起点。
Section sources
- KData.h
- KData.cpp
Indicator 类是框架的计算引擎,它实现了向量化计算和指标间的灵活组合,是技术分析的核心。
设计理念:
- 向量化计算:所有指标计算都是基于整个数据序列进行的,而不是单个数据点,这保证了计算的高效性。
-
指标组合:框架通过重载运算符(如
+,-,>,<等)和函数(如WEAVE,IF)来实现指标间的组合。例如,MA(close, 5) > MA(close, 10)会生成一个新的布尔型指标。 - 惰性求值:指标的计算是惰性的,只有在需要获取具体数值时才会执行计算,这有助于优化性能。
关键属性与方法:
-
operator[]:获取指定位置的指标值。 -
getResult(size_t num):当一个指标有多个输出结果时,用于获取指定的结果集。 -
setContext():为指标设置上下文(Stock和KQuery或KData),这是计算的前提。 -
alike():判断两个指标是否等效,即计算效果相同。
Section sources
- Indicator.h
- Indicator.cpp
TradeManager 类是模拟交易的核心,它负责管理账户的交易记录、资金使用情况和持仓状态。
设计理念:
-
状态管理:
TradeManager维护了账户的完整状态,包括当前现金 (m_cash)、持仓记录 (m_position)、交易历史 (m_trade_list) 和资金详情 (FundsRecord)。 -
交易执行:提供了
buy(),sell(),sellShort(),buyShort()等方法来模拟各种交易操作。这些操作会更新内部状态并生成交易记录 (TradeRecord)。 -
权息处理:通过
updateWithWeight()方法,TradeManager能够根据权息信息自动调整历史持仓和交易记录,确保回测的准确性。
关键属性与方法:
-
currentCash():返回当前现金。 -
have(const Stock&):判断当前是否持有指定的证券。 -
getHoldNumber():获取指定时刻某证券的持有数量。 -
getFunds():获取账户当前的资产详情,包括现金、市值、负债等。
Section sources
- TradeManager.h
- TradeManager.cpp
System 类是整个框架的指挥中心,它将信号、止损、资金管理等可插拔部件组合成一个完整的交易策略。
设计理念:
-
组件化设计:交易系统的各个部分(信号、止损、资金管理等)被设计为独立的、可插拔的组件。这通过
System类中的成员指针(如m_sg,m_st,m_mm)来实现。 - 策略解耦:这种设计使得策略的各个部分可以独立开发、测试和复用。例如,可以轻松地将一个信号策略与不同的资金管理策略组合。
-
运行流程:
run()方法是交易系统的入口,它会按时间顺序遍历K线数据,并协调各个组件做出交易决策。
关键组件:
-
SignalPtr(m_sg):信号产生器,决定何时买入或卖出。 -
StoplossPtr(m_st):止损策略,控制下行风险。 -
MoneyManagerPtr(m_mm):资金管理策略,决定每次交易的资金量。 -
TradeManagerPtr(m_tm):交易管理器,执行具体的交易操作。
Section sources
- System.h
StockManager 类是框架的全局单例,负责管理所有 Stock 实例的生命周期和数据加载。
设计理念:
-
单例模式:
StockManager使用单例模式,确保在整个应用程序中只有一个实例,从而统一管理所有证券数据。 -
集中管理:它维护了一个
m_stockDict映射,将证券的market_code(如 "sh000001")映射到对应的Stock对象,实现了高效的查找。 -
数据驱动:
StockManager通过init()方法初始化,该方法接受各种数据驱动参数(基础信息、K线数据等),并负责从数据库或文件中加载所有数据。
关键方法:
-
instance():获取StockManager单例实例的静态方法。 -
getStock(const string& querystr):根据 "市场简称+证券代码" 的字符串查询并返回对应的Stock对象。 -
init():初始化方法,负责加载所有证券、市场信息、K线数据等。
Section sources
- StockManager.h
- StockManager.cpp
KData 类的设计不仅封装了数据,还通过 KQuery 类实现了灵活的查询机制。
KQuery 类的作用:
KQuery 类定义了查询K线数据的条件,包括:
-
查询方式 (
queryType):支持按索引 (INDEX) 或按日期 (DATE) 查询。 -
数据类型 (
kType):指定K线周期,如DAY,MIN,WEEK等。 -
复权类型 (
recoverType):指定是否复权及复权方式,如NO_RECOVER,FORWARD,BACKWARD。
KData 的构造函数会根据 Stock 和 KQuery 来决定如何加载数据。如果数据已缓存且无需复权,则使用共享内存模式以提高效率;否则,会创建新的数据副本。
Section sources
- KQuery.h
- KData.h
Indicator 类的实现基于一个强大的引擎,其核心是 IndicatorImp 基类。
引擎工作原理:
-
操作符重载:当两个
Indicator对象进行运算(如ind1 + ind2)时,框架会创建一个新的IndicatorImp实例,并将这两个指标作为左右子节点添加到一个计算树中。 -
惰性计算:计算树的构建是即时的,但实际的数值计算是惰性的。只有当用户尝试访问指标值(如
ind[0])时,引擎才会遍历计算树,执行_calculate()方法来生成结果。 - 结果缓冲:计算结果会被缓存,避免重复计算。
这种设计使得复杂的指标公式(如 IF(MA(close,5)>MA(close,10), close, 0))可以被高效地解析和执行。
Section sources
- IndicatorImp.h
- Indicator.h
交易系统框架的组件化设计思想是其最核心的特性之一。
可插拔部件:
- Signal (信号):负责生成买入和卖出信号。开发者可以实现不同的信号策略,如均线交叉、MACD金叉等。
- Stoploss (止损):负责在价格下跌到预设水平时卖出,以限制损失。
- MoneyManager (资金管理):负责决定每次交易投入的资金量,如固定金额、固定比例、凯利公式等。
-
其他部件:还包括
Environment(市场环境判断)、ProfitGoal(盈利目标)、Slippage(滑点模拟)等。
设计优势: 这种设计极大地提高了策略的灵活性和可复用性。开发者可以像搭积木一样,将不同的信号、止损和资金管理策略自由组合,快速构建和测试新的交易系统。
Section sources
- System.h
- SystemPart.h
hikyuu 框架通过 StockManager、Stock、KData、Indicator、TradeManager 和 System 等核心类,构建了一个层次清晰、职责分明的量化分析体系。StockManager 作为全局管理者,Stock 和 KData 封装了基础数据,Indicator 提供了强大的计算能力,TradeManager 模拟了真实的交易过程,而 System 则通过组件化设计将这些部分有机地结合起来,形成了一个灵活、可扩展的交易策略开发平台。理解这些核心概念是掌握和使用 hikyuu 框架的基础。