算法交易
算法交易工具运行您用 JavaScript 编写的交易算法。算法代码逐个日期接收市场数据,发送买入和卖出订单,并获得与投资组合工具相同的结果。
字段:
- 代码 - 算法可以交易的资产。可使用任意代码类型,最多 10 个。
- 余额 - 初始现金,以页面顶部所选货币计。
- 日期范围 - 模拟的开始和结束日期。
- 杠杆 - 启用后允许卖空,算法可以在下方保证金限制内卖出未持有的资产。卖空所得不计入现金。请谨慎使用,因为它会同时放大潜在收益和风险。
- 初始保证金 - 一个百分比 (默认 50%),用于限制新开的卖空持仓:卖空总价值最多为 (现金 + 多头持仓) / 初始保证金。例如,50% 允许卖空持仓最多为现金加多头持仓的 2 倍。
- 维持保证金 - 卖空价值中必须保留为保证金的百分比 (默认 30%)。如果保证金低于该值,模拟将报错停止。系统不会自动追加保证金。
- 算法代码 - 算法的 JavaScript 代码 (见下文)。
算法代码 (AlgoWorkspace):
算法代码作为异步函数的函数体运行,其中 this 绑定到 AlgoWorkspace。先注册事件监听器,然后在代码末尾调用 start() 开始模拟。代码必须有且仅有一个 data 监听器,并且每个监听器在完成时都必须调用 next()。
可用事件:
this.on('start', async (next, timeseries) => { ... })- 在首个日期之前运行一次。timeseries 包含所有价格数据,以日期为键 (Record<string, AssetDataFlat[]>)。此时 this.assets 和 this.portfolio 尚未设置。this.on('data', async (next) => { ... })- 每个有数据的日期运行一次。订单在监听器调用 next() 后按该日期的价格成交。this.on('end', async (next, result) => { ... })- 在最后一个日期之后运行,并传入最终结果。result.summary.alpha 和 beta 是 Promise。this.on('error', async (next, errors) => { ... })- 当某个日期的订单被取消时运行,例如现金或保证金不足。errors 是 string[]。代码中的异常会停止模拟,并显示在“警告”标签页中。
属性和方法:
this.date- 当前日期。this.assets- 当前日期的价格 (AssetDataFlat[]: assetCode, date, value, currency)。仅包含该日期有数据的代码。this.portfolio- 当前投资组合的副本 (cash, assets, total, longValue, shortValue, totalProfit, realizedProfit, margin)。修改它不会产生任何效果,请使用下方的方法。this.index- 当前日期的序号,从 1 到 this.length。this.length- 有数据的日期数量。this.inputs- 模拟的输入。this.state- 用于在事件之间存储自定义数据的对象。this.buy(assetCode: string, quantity: number): void- 发送买入订单。数量必须是非零的有限数。this.sell(assetCode: string, quantity: number): void- 发送卖出订单。如果启用了杠杆,卖出数量超过持仓时将开立卖空持仓。this.print(...msgs: any[]): void- 向“消息”标签页添加一条带当前日期的消息。this.depositCash(amount: number): void- 向投资组合添加现金。this.loadScript(url: string): Promise<number>- 加载外部 JavaScript 库。运行结束后,已加载的脚本会被移除。this.download(obj: any, name?: string): Promise<void>- 将 obj 下载为名为 name.json 的 JSON 文件 (默认为 invest-tester.json)。
算法交易页面的默认代码是一个完整示例。它会加载一个库、随机下单并每月定投。