@backtest-kit/ollama (英语)
通用 LLM 适配器 反测试- kit 贸易战略。 一个更高级的API 12个供应商,图案强制结构输出,用户空间提示模块,符号旋转——加一 LLM 策略优化器 生成可运行策略代码.

📚 文档 • 妇女 参考执行情况 • 妇女 GitHub 图像
npm install @backtest-kit/ollama backtest-kit agent-swarm-kit
为什么
AI策略通常指每个供应商SDK锅炉板和JSON,你无法信任. 此软件包将全部崩溃: 用一个提供商 HOF 来包裹任何 async 函数, 并运行在该提供商的推断上下文内—— 互换 deepseek() → claude() → gpt5() 没有其他改动。 结构输出是强制的(Zod或JSON通过 agent-swarm-kit是因为 addOutline),提示作为纪念的用户空间模块进行直播
- 🔌 12个供应商 ——OpenAI,克洛德,DeepSeek,Grok,Groq,米斯特拉尔,迷惑,Cohere,Alibaba,Hugging Face,Ollama(当地),GLM-4(Z.ai).
- ⚡ 上级职能 以推论上下文来包裹 aync fn 通过
di-scoped; 相同的签名输入, 相同的退出 . - 🎯 用户空间计划 ——定义你自己的Zod或JSON schema;结构化输出用自动重试+自定义验证执行.
- 📝 用户空间提示 - 从负载
.cjs模块config/prompt/,或内入;通过functools-kit。 。 。 . - 🔄 按键旋转 ——通过自动旋转的API密钥数组.
- 🧬 战略优化器 —— 说
Optimizer生成 完整的可执行策略代码 从整个培训范围的LLM分析.
提供商 HOF
整个适配器是一个形状,为12个提供者重复: provider(fn, model, apiKey?) => fn中返回函数 同名签名 作为 fn,在提供者的推论上下文中执行(因此 agent-swarm-kit 在内部完成 解决提供方.
import { deepseek } from '@backtest-kit/ollama';
import { addStrategy } from 'backtest-kit';
addStrategy({
strategyName: 'llm-signal', interval: '5m',
// swap deepseek() → claude() / gpt5() / ollama() / groq() with no other change
getSignal: deepseek(getSignal, 'deepseek-chat', process.env.DEEPSEEK_API_KEY),
});
所有12个提供者, 基站 URL 旋转( S)
| 提供者 | 函数 | 推论 | 基础 URL |
|---|---|---|---|
| 开放AI | gpt5() | gpt5_inference | https://api.openai.com/v1/ |
| 克劳德 | claude() | claude_inference | https://api.anthropic.com/v1/ |
| 深层搜索 | deepseek() | deepseek_inference | https://api.deepseek.com/ |
| 格罗克(xAI) | grok() | grok_inference | https://api.x.ai/v1/ |
| 格罗克 | groq() | groq_inference | https://api.groq.com/ |
| 迷雾 | mistral() | mistral_inference | https://api.mistral.ai/v1/ |
| 复杂 | perplexity() | perplexity_inference | https://api.perplexity.ai/ |
| 代码 | cohere() | cohere_inference | https://api.cohere.ai/compatibility/v1/ |
| 阿里巴巴(昆文) | alibaba() | alibaba_inference | https://dashscope-intl.aliyuncs.com/compatible-mode/v1/ |
| 拥抱相貌 | hf() | hf_inference | https://router.huggingface.co/v1/ |
| Ollama(当地) | ollama() | ollama_inference | http://localhost:11434/ |
| GLM-4(扎伊岛) | glm4() | glm4_inference | https://open.bigmodel.cn/api/paas/v4/ |
// apiKey accepts a single key OR an array → automatic rotation across calls
const wrappedFn = ollama(myFn, 'llama3.3:70b', ['key1', 'key2', 'key3']);
所有12个都有一个签名—— <T>(fn: T, model: string, apiKey?: string | string[]) => T 运行 fn 内部 ContextService.runInContext({ apiKey, inference, model })匹配 InferenceName enum + 每个提供者 client/*Provider.client.ts + 键 config/*.ts 解决实际的 SDK 呼叫.
结构化产出
定义一个 schema( Zod 或 生 JSON),将其注册为针对此软件包的大纲 CompletionName,而LLM则被迫返回有效的JSON——带有拒绝不良信号的自定义验证(例如"LSL必须是LONG的下入").
Zod 大纲
// schema/Signal.schema.ts
import { z } from 'zod';
export const SignalSchema = z.object({
position: z.enum(['long', 'short', 'wait']).describe('long: bullish · short: bearish · wait: unclear'),
price_open: z.number().describe('Entry price in USD'),
price_stop_loss: z.number().describe('LONG: below entry · SHORT: above entry'),
price_take_profit: z.number().describe('LONG: above entry · SHORT: below entry'),
minute_estimated_time: z.number().describe('Estimated minutes to reach TP'),
risk_note: z.string().describe('Whale manipulation, order-book imbalance, divergences — with numbers'),
});
export type TSignalSchema = z.infer<typeof SignalSchema>;
// outline/signal.outline.ts
import { addOutline } from 'agent-swarm-kit';
import { zodResponseFormat } from 'openai/helpers/zod';
import { SignalSchema, TSignalSchema } from '../schema/Signal.schema';
import { CompletionName } from '@backtest-kit/ollama';
addOutline<TSignalSchema>({
outlineName: 'SignalOutline',
completion: CompletionName.RunnerOutlineCompletion,
format: zodResponseFormat(SignalSchema, 'position_decision'),
getOutlineHistory: async ({ history, param: messages = [] }) => { await history.push(messages); },
validations: [{
validate: ({ data }) => {
if (data.position === 'long' && data.price_stop_loss >= data.price_open) throw new Error('LONG: SL must be below entry');
if (data.position === 'short' && data.price_stop_loss <= data.price_open) throw new Error('SHORT: SL must be above entry');
},
}],
});
Raw JSON- schema 大纲( 无 Zod)
import { addOutline, IOutlineFormat } from 'agent-swarm-kit';
import { CompletionName } from '@backtest-kit/ollama';
const format: IOutlineFormat = {
type: 'object',
properties: {
take_profit_price: { type: 'number', description: 'Take profit price in USD' },
stop_loss_price: { type: 'number', description: 'Stop-loss price in USD' },
description: { type: 'string', description: 'User-friendly risk explanation, min 10 sentences' },
reasoning: { type: 'string', description: 'Technical analysis, min 15 sentences' },
},
required: ['take_profit_price', 'stop_loss_price', 'description', 'reasoning'],
};
addOutline({
outlineName: 'SignalOutline', format, completion: CompletionName.RunnerOutlineCompletion,
prompt: 'Generate crypto trading signals from price & volume indicators in JSON.',
getOutlineHistory: async ({ history, param }) => {
const report = await ioc.signalReportService.getSignalReport(param);
await commitReports(history, report);
await history.push({ role: 'user', content: 'Generate JSON based on reports.' });
},
validations: [
{ docDescription: 'Stop-loss vs max loss %', validate: ({ data }) => { if (data.action === 'buy' && percentDiff(data.current_price, data.stop_loss_price) > CC_LADDER_STOP_LOSS) throw new Error(`SL must not exceed -${CC_LADDER_STOP_LOSS}%`); } },
{ docDescription: 'Take-profit vs max profit %', validate: ({ data }) => { if (data.action === 'buy' && percentDiff(data.current_price, data.take_profit_price) > CC_LADDER_TAKE_PROFIT) throw new Error(`TP must not exceed +${CC_LADDER_TAKE_PROFIT}%`); } },
],
});
提示
快速模块自动接收交易上下文 . system 可能是字符串数组或函数 (symbol, strategyName, exchangeName, frameName, backtest)· ; user 同样的.
模块文件, 内置快捷键和承诺Prompt
// config/prompt/signal.prompt.cjs
module.exports = {
system: (symbol, strategyName, exchangeName, frameName, backtest) => [
`You are analyzing ${symbol} on ${exchangeName}`,
`Strategy: ${strategyName}, Timeframe: ${frameName}`,
backtest ? 'Backtest mode' : 'Live mode',
],
user: (symbol) => `Analyze ${symbol} and return a trading decision`,
};
import { Module, Prompt, commitPrompt, MessageModel } from '@backtest-kit/ollama';
// from a .cjs module (default baseDir: {cwd}/config/prompt/), memoized
const signalModule = Module.fromPath('./signal.prompt.cjs');
// or inline
const inline = Prompt.fromPrompt({ system: ['You are a trading bot'], user: (symbol) => `Trend for ${symbol}?` });
const messages: MessageModel[] = [];
await commitPrompt(signalModule, messages); // pushes rendered system + user messages with context
完整策略: 注册大纲, 从一个快速, 请求结构化的 JSON , 用一个提供者 HOF 包:
import './outline/signal.outline';
import { deepseek, Module, commitPrompt, MessageModel } from '@backtest-kit/ollama';
import { addStrategy } from 'backtest-kit';
import { json } from 'agent-swarm-kit';
const signalModule = Module.fromPath('./signal.prompt.cjs');
const getSignal = async () => {
const messages: MessageModel[] = [];
await commitPrompt(signalModule, messages);
const { data } = await json('SignalOutline', messages);
return data;
};
addStrategy({ strategyName: 'llm-signal', interval: '5m',
getSignal: deepseek(getSignal, 'deepseek-chat', process.env.DEEPSEEK_API_KEY) });
调试——放弃对话
dumpSignalData(signalId, history, signal, outputDir?) 将LLM对话全文存档于信号上,因此不透明的模型决定成为可读记录. 如果目录已经存在( 从未覆盖过先前的运行) 跳过 .
它写的是什么
进 {outputDir}/{signalId}/ (默认) ./dump/strategy: 00_system_prompt.md (系统信息+产出摘要),编号 XX_user_message.md 编号 : XX_assistant_message.md 每转一圈,最后 XX_llm_output.md 信号DTO。 打电话来 getSignal 在返回信号之前.
战略优化器——生成可运行的战略代码
最有威力的作品, 和其余的软件包提供: Optimizer 使用LLM分析跨训练范围的符号,并发出 完整、可执行的战略文件 ——进口,帮助者,策略,行走者,发射者——可以直接用回试-kit来运行.
优化 API + 添加 optimizerSchema + 进度事件
import { Optimizer, addOptimizerSchema, listenOptimizerProgress } from '@backtest-kit/ollama';
// describe sources, training ranges, strategy/template generation (see IOptimizer* interfaces)
addOptimizerSchema({ optimizerName: 'my-optimizer', /* sources, ranges, strategy, template */ });
listenOptimizerProgress((p) => console.log(p)); // ProgressOptimizerContract
const strategies = await Optimizer.getData('BTCUSDT', { optimizerName: 'my-optimizer' }); // metadata + LLM context per range
const code = await Optimizer.getCode('BTCUSDT', { optimizerName: 'my-optimizer' }); // full TS/JS source as string
await Optimizer.dump('BTCUSDT', { optimizerName: 'my-optimizer' }, './output'); // writes {optimizerName}_{symbol}.mjs
getData 从所有来源获取并构建每个培训范围的LLM对话; getCode 组装可执行战略; dump 写给 {optimizerName}_{symbol}.mjs配套登记功能: getOptimizerSchema, (中文(简体) ), listOptimizerSchema,以及 listenError它背后的发动机是 common/ClientOptimizer.ts 驾驶员: IOptimizer* 接口( e)IOptimizerSchema, (中文(简体) ), IOptimizerSource, (中文(简体) ), IOptimizerStrategy, (中文(简体) ), IOptimizerTemplate, (中文(简体) ), IOptimizerRange, (中文(简体) ), IOptimizerData, (中文(简体) ), IOptimizerFetchArgs, (中文(简体) ), IOptimizerFilterArgs, (中文(简体) ), IOptimizerCallbacks) (中文(简体) ).
API 参考
| 导出 | 说明 |
|---|---|
ollama gpt5 claude deepseek grok groq mistral perplexity cohere alibaba hf glm4 | 提供商 (fn, model, apiKey?) => fn |
CompletionName | 补全名称 agent-swarm-kit 大纲(RunnerOutlineCompletion, (...) (中文(简体) ) |
Module.fromPath(path, baseDir?) | 装入提示 .cjs 模块(默认基数) {cwd}/config/prompt/(中文(简体) ) |
Prompt.fromPrompt(source) | 从内含中构建一个提示 PromptModel |
commitPrompt(source, history) | 将模块/Prompt的系统+用户信息输入 history |
dumpSignalData(id, history, signal, dir?) | 将 LLM 对话存档为一个信号 |
validate(...) | 验证大纲结果 |
Optimizer | .getData 编号 : .getCode 编号 : .dump ——LLM战略码生成 |
addOptimizerSchema • 妇女 getOptimizerSchema • 妇女 listOptimizerSchema | 优化计程器登记册 |
listenOptimizerProgress • 妇女 listenError | 优化进度/ 错误事件 |
MessageModel MessageRole PromptModel | 信件提示模式( P) |
IOptimizer* • 妇女 ProgressOptimizerContract | 优化接口和进度合同 |
lib | 高级使用的内部发动机(IoC容器) |
完整源图
function/signal.function.ts——12家供应商HOF.function/{add,get,list,event,setup,validate,history,dump,signal}.ts登记、活动、,setLogger, (中文(简体) ),commitPrompt, (中文(简体) ),dumpSignalData。 。 。 .client/*Provider.client.ts(12) – 提供方SDK适配器.config/*.ts——每个提供者基础URL/段落,ollama.rotate.ts(按键旋转),params.ts, (中文(简体) ),emitters.ts。 。 。 .classes/—— 说Module, (中文(简体) ),Prompt, (中文(简体) ),Optimizer。 。 。 .common/ClientOptimizer.ts——优化引擎.enum/—— 说InferenceName(12个),CompletionName。 。 。 .interface/Optimizer.interface.ts, (中文(简体) ),contract/ProgressOptimizer.contract.ts, (中文(简体) ),model/{Message,Prompt}.model.ts。 。 。 .helpers/{toLintMarkdown,toPlainString}.ts, (中文(简体) ),lib/(IoC:core/{di,provide,types}服务)。 没有src/没有证件.
* 贡献
叉/ PR 打开 GitHub 图像。 。 。 .
许可证
麻省理工学院 特立奥尔斯基平板电脑