Skip to content
fasiondog edited this page Nov 23, 2025 · 3 revisions

核心概念

**本文档引用的文件** - [Stock.h](file://hikyuu_cpp/hikyuu/Stock.h) - [KData.h](file://hikyuu_cpp/hikyuu/KData.h) - [Indicator.h](file://hikyuu_cpp/hikyuu/indicator/Indicator.h) - [TradeManager.h](file://hikyuu_cpp/hikyuu/trade_manage/TradeManager.h) - [System.h](file://hikyuu_cpp/hikyuu/trade_sys/system/System.h) - [StockManager.h](file://hikyuu_cpp/hikyuu/StockManager.h) - [Stock.cpp](file://hikyuu_cpp/hikyuu/Stock.cpp) - [KData.cpp](file://hikyuu_cpp/hikyuu/KData.cpp) - [Indicator.cpp](file://hikyuu_cpp/hikyuu/indicator/Indicator.cpp) - [TradeManager.cpp](file://hikyuu_cpp/hikyuu/trade_manage/TradeManager.cpp) - [StockManager.cpp](file://hikyuu_cpp/hikyuu/StockManager.cpp)

目录

  1. 引言
  2. 核心领域模型
  3. StockManager 全局管理
  4. KData 行情数据封装
  5. Indicator 指标引擎
  6. 交易系统框架
  7. 总结

核心概念详细文档

引言

hikyuu 是一个专业的量化投资分析框架,其设计围绕一系列核心领域模型展开。本文档旨在深入阐述框架的核心概念,包括 Stock(股票)、KData(K线数据)、Indicator(技术指标)、TradeManager(交易管理器)和 System(交易系统)等核心类的设计理念和相互关系。通过理解这些核心组件,开发者可以更好地掌握框架的内部工作原理和设计哲学。

核心领域模型

hikyuu 框架的核心领域模型围绕金融市场的基本要素构建,通过一系列精心设计的类来抽象和封装复杂的金融数据与交易逻辑。

Stock(股票)

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线数据,这是连接 StockKData 的核心方法。
  • getWeight():获取该证券的权息信息列表,用于处理复权计算。

Section sources

  • Stock.h
  • Stock.cpp

KData(K线数据)

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(技术指标)

Indicator 类是框架的计算引擎,它实现了向量化计算和指标间的灵活组合,是技术分析的核心。

设计理念

  • 向量化计算:所有指标计算都是基于整个数据序列进行的,而不是单个数据点,这保证了计算的高效性。
  • 指标组合:框架通过重载运算符(如 +, -, >, < 等)和函数(如 WEAVE, IF)来实现指标间的组合。例如,MA(close, 5) > MA(close, 10) 会生成一个新的布尔型指标。
  • 惰性求值:指标的计算是惰性的,只有在需要获取具体数值时才会执行计算,这有助于优化性能。

关键属性与方法

  • operator[]:获取指定位置的指标值。
  • getResult(size_t num):当一个指标有多个输出结果时,用于获取指定的结果集。
  • setContext():为指标设置上下文(StockKQueryKData),这是计算的前提。
  • alike():判断两个指标是否等效,即计算效果相同。

Section sources

  • Indicator.h
  • Indicator.cpp

TradeManager(交易管理器)

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 类是整个框架的指挥中心,它将信号、止损、资金管理等可插拔部件组合成一个完整的交易策略。

设计理念

  • 组件化设计:交易系统的各个部分(信号、止损、资金管理等)被设计为独立的、可插拔的组件。这通过 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 全局管理

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 行情数据封装

KData 类的设计不仅封装了数据,还通过 KQuery 类实现了灵活的查询机制。

KQuery 类的作用KQuery 类定义了查询K线数据的条件,包括:

  • 查询方式 (queryType):支持按索引 (INDEX) 或按日期 (DATE) 查询。
  • 数据类型 (kType):指定K线周期,如 DAY, MIN, WEEK 等。
  • 复权类型 (recoverType):指定是否复权及复权方式,如 NO_RECOVER, FORWARD, BACKWARD

KData 的构造函数会根据 StockKQuery 来决定如何加载数据。如果数据已缓存且无需复权,则使用共享内存模式以提高效率;否则,会创建新的数据副本。

Section sources

  • KQuery.h
  • KData.h

Indicator 指标引擎

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 框架通过 StockManagerStockKDataIndicatorTradeManagerSystem 等核心类,构建了一个层次清晰、职责分明的量化分析体系。StockManager 作为全局管理者,StockKData 封装了基础数据,Indicator 提供了强大的计算能力,TradeManager 模拟了真实的交易过程,而 System 则通过组件化设计将这些部分有机地结合起来,形成了一个灵活、可扩展的交易策略开发平台。理解这些核心概念是掌握和使用 hikyuu 框架的基础。

Clone this wiki locally