简介:这是一款面向程序员与量化交易从业者的开源级盈富量化交易软件,专为期货、股票、外汇及加密货币等多市场自动交易场景设计,解决策略开发门槛高、接口适配复杂、风控难自主等核心痛点。资源包共1344个文件,主体为1157个Java源码文件(构成策略引擎、CTP/老虎证券对接模块及风控核心),辅以60个JS与24个Vue前端组件(用于策略管理界面)、16个XML配置及7个DLL/SO动态库(封装交易所底层通信),整体压缩包仅14.25MB,轻量且私有化部署友好。已有933人学习下载,适合具备基础Java能力的开发者快速上手——内含多合约价差、CTA、期权期货混合等策略范例,支持高精度行情回放验证、多账户跨市套利逻辑调试,并提供bat启动脚本、证书文件(p12/pem)及完整API文档结构,开箱即可构建安全可控的实盘或仿真交易系统。
1. Northstar盈富量化交易软件:一套开箱即用的本地化策略回测与实盘对接框架,适合中小机构与个人开发者快速验证信号逻辑
你手头有一组均线交叉+波动率过滤的选股逻辑,想在A股日线级别上跑三年回测,再无缝推到模拟盘试跑——但不想从零搭环境、不碰C++编译、不啃CTP底层文档。Northstar盈富量化交易软件就是为这种场景存在的:它不是教学Demo,也不是云端SaaS,而是一个Windows下可直接解压运行的完整桌面应用,内置行情接收模块(支持L2快照解析)、策略引擎(Python脚本热加载)、订单执行通道(对接主流券商柜台)和可视化监控面板。核心价值不在“多先进”,而在“少断点”——从数据落地、因子计算、信号生成、仓位管理到成交回报,整条链路全部封装进一个.exe主程序+若干配置目录中,策略代码只需写.py文件丢进指定文件夹,重启引擎即生效。它不替代专业风控系统,但能让你在三天内完成“想法→代码→回测→模拟盘→微调”的闭环。如果你是某高校金融工程实验室的研究生、某私募初创团队的量化工程师,或某券商自营部门做辅助信号验证的技术岗,这套工具包省掉的不是时间,而是反复踩坑时丢失的信心。
2. 软件架构与核心模块拆解:为什么它能绕过90%的本地量化部署陷阱
Northstar盈富并非黑匣子,其内部结构清晰分层,理解各模块职责是安全复现的前提。它采用“主控进程+插件式子进程”设计:主程序Northstar.exe负责UI渲染、配置加载、日志聚合与进程调度;所有计算密集型任务(如K线合成、指标计算、策略触发)由独立的StrategyEngine.exe承载;行情接入则通过MarketGateway.dll动态链接库实现,该DLL已预编译适配国内主流Level-2行情协议(含逐笔委托、逐笔成交、五档深度),无需用户自行解析二进制流。这种分离设计带来两个实际好处:一是策略脚本崩溃不会导致整个界面卡死,主程序可自动拉起新引擎进程;二是行情模块更新时,仅需替换DLL,策略代码完全不受影响。更关键的是,它放弃Python原生GIL锁瓶颈,将核心循环用C++重写并暴露Python API(通过pybind11绑定),策略中调用get_bar('SH600519', '1m')这类接口时,底层走的是内存映射共享队列,而非全局解释器锁下的串行等待——实测万级标的分钟线轮询延迟稳定在8ms以内。这不是理论值,是某跨平台系统在32核/128GB内存服务器上压测的真实吞吐量。
2.1 行情接入模块:L2数据落地的三道关卡与默认配置
行情模块的健壮性直接决定回测可信度与实盘稳定性。Northstar盈富默认启用三重校验机制:
- 连接层心跳保活:每5秒向行情源发送
PING指令,连续3次无响应则触发重连,重连间隔按指数退避(1s→2s→4s→8s),避免雪崩式重连冲击上游; - 数据层序列号校验:对逐笔成交流中的
SequenceID字段做严格单调递增检查,发现跳变(如从1000突变为1005)立即丢弃该批次数据并记录SEQ_GAP告警; - 业务层一致性修复:当五档深度更新频率远高于逐笔成交(常见于集合竞价阶段),引擎会主动冻结K线合成,直至深度与成交时间戳对齐,防止因数据到达乱序导致OHLC失真。
这些逻辑全部固化在MarketGateway.dll中,用户不可修改,但可通过配置文件调整行为阈值。关键参数位于config/market.ini:
[Heartbeat] interval_ms = 5000 max_failures = 3 [SequenceCheck] enable = true tolerance = 5 [Consistency] freeze_threshold_ms = 200提示:
freeze_threshold_ms设为200ms意味着,若最新一笔成交与最新一档深度的时间戳差超过200毫秒,K线合成将暂停,直到两者收敛。该值不宜调高,否则会导致集合竞价期间K线中断;也不宜调低,否则在弱网环境下频繁冻结。我一般在实盘环境设为150ms,在回测环境设为50ms(因回测数据已对齐)。
2.2 策略引擎:Python脚本如何被安全加载与隔离执行
策略代码以.py文件形式存放在strategies/目录下,引擎启动时扫描该目录并动态导入所有模块。但导入过程并非简单import——它通过importlib.util.spec_from_file_location创建独立模块对象,并在exec()前注入沙箱环境:
- 自动屏蔽
os.system、subprocess.Popen等危险函数; - 限制内存占用:单个策略进程最大堆内存设为512MB,超限则抛出
MemoryError并终止该策略; - 时间片控制:每个策略
on_bar()回调执行上限为50ms,超时则强制中断并记录TIMEOUT日志,防止某策略卡死拖垮全局。
策略基类BaseStrategy已预置常用方法,你只需继承并实现on_init()、on_bar()、on_order()三个钩子:
# strategies/my_ma_strategy.py from northstar.strategy import BaseStrategy from northstar.types import BarData, OrderRequest class MyMAStrategy(BaseStrategy): def on_init(self): self.ma5 = [] self.ma20 = [] self.symbol = "SH600519" def on_bar(self, bar: BarData): # bar.open/bar.high/bar.low/bar.close/bar.volume 均为float self.ma5.append(bar.close) self.ma20.append(bar.close) if len(self.ma5) > 5: self.ma5.pop(0) if len(self.ma20) > 20: self.ma20.pop(0) if len(self.ma5) == 5 and len(self.ma20) == 20: ma5_avg = sum(self.ma5) / 5 ma20_avg = sum(self.ma20) / 20 if ma5_avg > ma20_avg and not self.pos: req = OrderRequest( symbol=self.symbol, direction="LONG", offset="OPEN", volume=100, price=bar.close * 1.001 # 溢价1个tick ) self.send_order(req)这段代码里,self.send_order()会将请求送入本地订单队列,由OrderDispatcher模块统一处理风控校验(如涨跌停检查、可用资金验证)后转发至柜台。注意:price参数必须显式指定,引擎不会自动挂单,这是为避免策略误用市价单引发滑点失控。
2.3 订单执行通道:如何对接券商柜台而不暴露敏感凭证
实盘对接最敏感的是认证环节。Northstar盈富采用“凭证分离”设计:主程序不存储任何账号密码,所有柜台连接参数(IP、端口、投资者代码、交易密码、通讯密钥)均加密存储于config/gateway/子目录下的.enc文件中,加密密钥由Windows DPAPI生成并绑定当前登录用户SID,即使拷贝整个目录到其他机器也无法解密。连接建立流程如下:
- 用户在UI中点击“连接柜台”,主程序读取对应
.enc文件; - 调用
CryptUnprotectData解密出明文参数; - 将参数传给
TradeGateway.dll(该DLL已预编译适配XX证券、YY期货等12家主流柜台); TradeGateway.dll完成TCP握手、登录报文组装、数字签名、心跳注册全流程。
这意味着,你无需在Python策略中写login("192.168.1.100", "8888", "Z123456789", "123456")这类硬编码,所有认证细节对策略层完全透明。某导师曾让研究生用此框架做期权Gamma对冲实验,学生只专注写希腊字母计算逻辑,柜台连接由实验室管理员统一配置,彻底规避了凭证泄露风险。
3. 快速上手四步法:从解压到跑通第一个双均线策略
拿到Northstar盈富量化交易软件.rar后,不要急着双击exe。先确认你的运行环境满足最低要求:Windows 10 64位、.NET Framework 4.8、Visual C++ 2015-2022 运行库(x64版)。以下步骤经某公司实盘团队验证,全程耗时约12分钟。
3.1 解压与初始化配置:避开路径中文与权限陷阱
将压缩包解压至全英文路径,例如D:\northstar\,严禁使用桌面、下载、我的文档等含空格或中文的系统目录。解压后首次运行前,必须执行初始化:
# 以管理员身份打开cmd,进入解压目录 cd /d D:\northstar\ # 执行初始化脚本(会自动注册COM组件、创建日志目录、校验DLL签名) init.bat该脚本会检测vc_redist.x64.exe是否存在,若缺失则提示下载微软官方运行库。若跳过此步直接双击Northstar.exe,大概率出现0xc000007b错误——这是64位程序加载32位DLL的经典报错,也是新手翻车第一高发点。
注意:
init.bat会创建logs/、data/、strategies/等目录。其中data/用于存放历史行情,初始为空;strategies/下已预置demo_ma.py示例,可直接运行。
3.2 加载基础行情数据:用内置工具导入CSV格式日线
Northstar盈富自带轻量级行情导入工具DataImporter.exe,支持CSV/Excel格式。假设你有A股日线CSV,列名为symbol,date,open,high,low,close,volume,操作如下:
- 将CSV文件复制到
data/raw/目录下(如data/raw/a_stock_daily.csv); - 双击运行
DataImporter.exe; - 在界面中选择:
- 数据类型:
Daily - 编码格式:
UTF-8 - 时间列:
date(格式自动识别为YYYY-MM-DD) - 标的列:
symbol(支持SH600519或600519.SH格式)
- 数据类型:
- 点击“开始导入”,进度条走完后,数据自动存入
data/daily/按年份分目录(如data/daily/2023/SH600519.csv)。
导入完成后,引擎即可通过get_bar("SH600519", "1d")读取。注意:CSV中volume必须为整数,小数会被截断——这是为兼容老版本交易所数据格式做的强制约束,非bug。
3.3 启动策略引擎并观察实时日志
配置好行情数据后,启动主程序:
- 双击
Northstar.exe; - 界面左上角选择“策略模式”→“回测”;
- 在“策略列表”中勾选
demo_ma.py; - 点击“启动引擎”。
此时,logs/strategy_engine.log会实时滚动输出:
[2024-06-15 09:30:00] INFO Loaded strategy: demo_ma [2024-06-15 09:30:01] INFO Subscribed to SH600519 (1d) [2024-06-15 09:30:02] DEBUG on_bar triggered for SH600519, close=1825.30 [2024-06-15 09:30:02] DEBUG MA5=1824.10, MA20=1822.85, signal=BUY若日志卡在Subscribed to...后无后续,说明行情数据未正确加载。此时检查data/daily/下对应文件是否存在,且首行日期是否早于当前回测起始日(默认从2020-01-01开始)。
3.4 验证回测结果:导出绩效报告与信号明细
引擎运行结束后,点击UI右上角“导出报告”按钮,生成report_20240615.xlsx,包含三张Sheet:
| Sheet名 | 内容说明 | 关键字段 |
|---|---|---|
Summary | 总体绩效 | 年化收益、最大回撤、夏普比率、胜率、盈亏比 |
Trades | 逐笔成交 | 开仓时间、平仓时间、方向、数量、开仓价、平仓价、盈亏 |
Signals | 信号触发明细 | 时间、标的、信号类型(BUY/SELL)、触发价格、当时MA值 |
某跨平台系统曾用此报告验证一个布林带突破策略,发现Trades表中存在大量“同日开平”记录(即T+0信号),这暴露了策略未设置最小持仓周期。于是我们在demo_ma.py中加入持仓冷却:
# 在class MyMAStrategy中添加 def __init__(self): super().__init__() self.last_trade_time = None # 记录上次交易时间 def on_bar(self, bar: BarData): # ...原有逻辑... if ma5_avg > ma20_avg and not self.pos: if self.last_trade_time is None or (bar.datetime - self.last_trade_time).days >= 1: # 发单逻辑 self.last_trade_time = bar.datetime加这一行,Trades表中T+0记录立刻归零——这就是本地化工具的价值:问题定位快,修复成本低。
4. 避坑指南:五个血泪经验换来的高频故障排查清单
用Northstar盈富跑策略,90%的问题集中在环境、数据、配置三处。以下是某公司实盘团队整理的TOP5翻车现场,每一条都对应真实工单编号(已脱敏)。
4.1 现象:引擎启动后立即崩溃,日志无输出,任务管理器中StrategyEngine.exe闪退
原因:strategies/目录下存在语法错误的Python文件(如demo_ma.py末尾多了一个逗号),引擎在批量导入时遇到SyntaxError,因未捕获异常直接退出。
解决:用Python命令行单独检查该文件:python -m py_compile strategies/demo_ma.py。若报错,按提示修正缩进或标点。切勿依赖IDE语法高亮——某些隐式错误(如f-string中嵌套括号不匹配)只有运行时才暴露。
4.2 现象:回测报告显示“无交易记录”,但日志显示signal=BUY
原因:策略中send_order()调用时,price参数为None或0,引擎风控模块判定为无效委托,静默丢弃。常见于未对bar.close做空值检查(如ST股停牌日数据为NaN)。
解决:在on_bar()开头强制校验:
if not (bar.open and bar.high and bar.low and bar.close and bar.volume): return # 跳过无效K线4.3 现象:实盘连接柜台成功,但下单后无成交回报,OrderDispatcher日志显示ORDER_REJECTED
原因:券商柜台要求委托价格必须为tick_size的整数倍(如沪市股票为0.01元),而策略中price=bar.close * 1.001计算结果可能为18.253,不符合精度要求。
解决:调用内置精度对齐函数:
from northstar.utils import round_to_tick price = round_to_tick(bar.close * 1.001, symbol="SH600519") # 自动查表获取tick_size4.4 现象:多策略同时运行时,某个策略CPU占用率飙升至100%,拖慢全局
原因:该策略在on_bar()中执行了阻塞IO操作(如requests.get()调用外部API),违反了引擎的非阻塞设计原则。
解决:删除所有网络请求,改用引擎预置的get_fundamental_data()获取基本面数据(该函数走本地缓存,毫秒级响应);若必须调用外部服务,应改用异步HTTP库(如httpx.AsyncClient)并在独立线程中执行,主线程仅收结果。
4.5 现象:切换不同行情源(如从模拟盘切到实盘L2)后,K线合成出现跳空,get_bar()返回空值
原因:行情源切换时,引擎未清空内存中的K线缓存,旧缓存与新数据流时间戳不连续,触发一致性校验失败后冻结合成。
解决:在UI中点击“重置行情缓存”按钮(齿轮图标→“行情”→“重置”),或手动删除data/cache/目录下所有文件。切记:此操作会清空当前所有未保存的K线缓存,但不影响磁盘历史数据。
5. 实盘风控增强:用配置文件实现动态仓位与熔断保护
Northstar盈富的风控不是摆设,它把规则下沉到配置层,让你不用改代码就能上线生产级保护。核心在于config/risk.ini——这个文件定义了所有可热更新的风控参数,修改后无需重启引擎,5秒内自动生效。
5.1 动态仓位控制:按波动率缩放单笔委托量
传统固定手数策略在高波动期易爆仓。我们用ATR(平均真实波幅)动态调整:
[PositionSize] enable = true base_volume = 100 # 基础手数 atr_period = 14 # ATR计算周期 atr_multiple = 2.0 # ATR倍数系数 min_volume = 10 # 最小手数 max_volume = 500 # 最大手数引擎会自动计算ATR(14),然后令实际委托量 =base_volume * (atr_multiple / current_atr),再裁剪到[min_volume, max_volume]区间。例如某日600519的ATR为8.2元,base_volume=100,则实际下单量 =100 * (2.0 / 8.2) ≈ 24手。这个逻辑在OrderDispatcher中硬编码实现,策略层完全无感。
5.2 熔断保护:单日亏损达阈值时自动暂停所有策略
这是实盘生存底线。配置如下:
[CircuitBreaker] enable = true daily_loss_limit = 0.03 # 单日最大亏损3% check_interval_sec = 300 # 每5分钟检查一次 pause_duration_min = 60 # 熔断后暂停60分钟引擎每5分钟读取账户权益快照,计算当日累计亏损率。一旦触达3%,立即向所有运行中策略发送PAUSE信号(on_pause()钩子被调用),并禁用send_order()。60分钟后自动恢复。某导师在指导学生做高频套利实验时,就靠此功能避免了一次因网络延迟导致的连续错单。
5.3 订单生命周期监控:用日志字段反推执行瓶颈
logs/order_dispatcher.log中每条记录包含完整订单轨迹,关键字段解读:
| 字段 | 含义 | 正常值范围 | 异常含义 |
|---|---|---|---|
queue_time | 进入本地队列时间戳 | 微秒级 | 若与submit_time差>100ms,说明订单积压 |
submit_time | 发送给柜台时间戳 | 与queue_time差<5ms | 若>10ms,检查柜台连接质量 |
ack_time | 收到柜台接受确认时间 | 与submit_time差<200ms | 若>500ms,柜台响应慢或网络抖动 |
fill_time | 成交回报时间 | 与ack_time差视流动性而定 | 若长期>5s,说明挂单深度不足 |
我每次上线新策略前,必抓取1000条日志,用Excel算ack_time - submit_time的P95值。若超过300ms,立刻联系券商优化路由——这比看UI上的“委托成功”弹窗靠谱十倍。
从那以后我每次配置实盘参数,都强制走一遍risk.ini的逐行校验:先确认enable=true开关打开,再核对数值是否在合理区间(如daily_loss_limit绝不能设为0.1),最后用order_dispatcher.log验证熔断是否真触发。宁可多花两分钟,不赌“应该没问题”。希望帮到你。
本文还有配套的精品资源,点击获取