Skip to main content

Quant Module

quant 模块提供量化分析工具,包括技术指标计算、因子分析、OHLCV 行情数据和策略回测。 公式语法基于 Mai-language,兼容通达信/同花顺。

快速开始

import { Reportify } from 'reportify-sdk';

const client = new Reportify({ apiKey: 'your-api-key' });

// 计算 RSI 指标
const data = await client.quant.indicatorsCompute({
  symbols: ['000001'],
  formula: 'RSI(14)'
});

// 因子选股
const stocks = await client.quant.factorsScreen({
  formula: 'RSI(14) < 30'
});

// 获取 OHLCV 数据
const ohlcv = await client.quant.ohlcv({ symbol: '000001' });

// 策略回测
const result = await client.quant.backtest({
  symbol: '000001',
  formula: 'CROSS(MA(CLOSE, 5), MA(CLOSE, 20))',
  startDate: '2023-01-01',
  endDate: '2024-01-01'
});

指标 (Indicators)

indicators()

获取可用技术指标列表。
const indicators = await client.quant.indicators();

indicators.forEach(ind => {
  console.log(`${ind.name}: ${ind.description}`);
  console.log(`  输出字段: ${ind.fields.join(', ')}`);
});
返回类型:
interface IndicatorMeta {
  name: string;        // 指标名称(如 MACD, RSI, KDJ)
  description: string; // 指标描述
  fields: string[];    // 输出字段
}

indicatorsCompute()

计算技术指标值。
const data = await client.quant.indicatorsCompute({
  symbols: ['000001', '600519'],
  formula: 'RSI(14)',
  market: 'cn',           // 可选,默认 "cn"
  startDate: '2024-01-01',  // 可选
  endDate: '2024-06-01'     // 可选
});
参数:
参数类型必填说明
symbolsstring[]股票代码列表
formulastring指标公式
marketstring市场(cn/hk/us),默认 cn
startDatestring开始日期,默认 3 个月前
endDatestring结束日期,默认今天
公式示例:
// RSI 指标
const rsi = await client.quant.indicatorsCompute({
  symbols: ['000001'],
  formula: 'RSI(14)'
});

// MACD 指标(默认参数)
const macd = await client.quant.indicatorsCompute({
  symbols: ['000001'],
  formula: 'MACD()'
});

// KDJ 指标
const kdj = await client.quant.indicatorsCompute({
  symbols: ['000001'],
  formula: 'KDJ(9, 3, 3)'
});

// 布林带
const boll = await client.quant.indicatorsCompute({
  symbols: ['000001'],
  formula: 'BOLL(20, 2)'
});

因子 (Factors)

factors()

获取可用因子列表(变量和函数)。
const factors = await client.quant.factors();

factors.forEach(f => {
  console.log(`${f.name} (${f.type}, level ${f.level}): ${f.description}`);
});
因子分级:
  • Level 0 变量: CLOSE, OPEN, HIGH, LOW, VOLUME 及别名
  • Level 0 函数: MA, EMA, REF, HHV, LLV, STD 等核心函数
  • Level 1 函数: CROSS, COUNT, EVERY 等应用函数
  • Level 2 函数: MACD, KDJ, RSI, BOLL 等技术指标

factorsCompute()

计算因子值,使用 Mai-language 语法。
const data = await client.quant.factorsCompute({
  symbols: ['000001'],
  formula: 'RSI(14)',
  market: 'cn',
  startDate: '2024-01-01',
  endDate: '2024-06-01'
});
公式示例:
// 简单指标
const rsi = await client.quant.factorsCompute({
  symbols: ['000001'],
  formula: 'RSI(14)'
});

// 获取 MACD 的 DIF 线
const dif = await client.quant.factorsCompute({
  symbols: ['000001'],
  formula: 'MACD().dif'
});

// 收盘价是否高于 20 日均线(布尔值)
const aboveMA = await client.quant.factorsCompute({
  symbols: ['000001'],
  formula: 'CLOSE > MA(CLOSE, 20)'
});

// MA20 偏离度(百分比)
const deviation = await client.quant.factorsCompute({
  symbols: ['000001'],
  formula: '(CLOSE - MA(CLOSE, 20)) / MA(CLOSE, 20) * 100'
});
支持的运算符:
类型运算符说明
比较>, <, >=, <=, ==, !=比较运算
逻辑与&AND大小写不敏感
逻辑或|OR大小写不敏感
逻辑非~NOT大小写不敏感
算术+, -, *, /四则运算

factorsScreen()

因子选股,筛选满足条件的股票。
const stocks = await client.quant.factorsScreen({
  formula: 'RSI(14) < 30',
  market: 'cn',             // 可选
  checkDate: '2024-06-01',  // 可选,默认最新交易日
  symbols: undefined        // 可选,undefined 表示全市场
});
参数:
参数类型必填说明
formulastring选股公式
marketstring市场,默认 cn
checkDatestring检查日期,默认最新交易日
symbolsstring[]股票池,undefined 表示全市场
选股示例:
// RSI 超卖
const oversold = await client.quant.factorsScreen({
  formula: 'RSI(14) < 30'
});

// 金叉
const goldenCross = await client.quant.factorsScreen({
  formula: 'CROSS(MA(CLOSE, 5), MA(CLOSE, 10))'
});

// 上升趋势
const uptrend = await client.quant.factorsScreen({
  formula: '(CLOSE > MA(CLOSE, 20)) & (MA(CLOSE, 20) > MA(CLOSE, 60))'
});

// 在指定股票池中筛选
const filtered = await client.quant.factorsScreen({
  formula: 'RSI(14) < 30',
  symbols: ['000001', '600519', '000002']
});

行情 (Quotes)

ohlcv()

获取单个股票的 OHLCV 日线数据。
const data = await client.quant.ohlcv({
  symbol: '000001',
  market: 'cn',
  startDate: '2024-01-01',
  endDate: '2024-06-01'
});

data.forEach(d => {
  console.log(`${d.date}: O=${d.open} H=${d.high} L=${d.low} C=${d.close} V=${d.volume}`);
});
返回类型:
interface OHLCVData {
  symbol: string;
  date: string;
  open: number;
  high: number;
  low: number;
  close: number;
  volume: number;
}

ohlcvBatch()

批量获取多个股票的 OHLCV 数据。
const data = await client.quant.ohlcvBatch({
  symbols: ['000001', '600519', '000002'],
  market: 'cn',
  startDate: '2024-01-01',
  endDate: '2024-06-01'
});
数据按日期(降序)、股票代码排序。

kline1m()

获取单个股票的 1 分钟 K 线数据。
const data = await client.quant.kline1m({
  symbol: '000001',
  startDateTime: '2024-01-01 09:30:00',
  endDateTime: '2024-01-01 15:00:00',
  market: 'cn'
});

data.forEach(d => {
  console.log(`${d.datetime}: O=${d.open} H=${d.high} L=${d.low} C=${d.close} V=${d.volume}`);
});
参数:
参数类型必填说明
symbolstring股票代码
startDateTimestring开始时间(YYYY-MM-DD HH:MM:SS)
endDateTimestring结束时间(YYYY-MM-DD HH:MM:SS)
marketstring市场,默认 cn
返回类型:
interface OHLCVData {
  symbol: string;
  datetime: string;
  open: number;
  high: number;
  low: number;
  close: number;
  volume: number;
}

kline1mBatch()

批量获取多个股票的 1 分钟 K 线数据。
const data = await client.quant.kline1mBatch({
  symbols: ['000001', '600519', '000002'],
  startDateTime: '2024-01-01 09:30:00',
  endDateTime: '2024-01-01 15:00:00',
  market: 'cn'
});
数据按日期(升序)、股票代码排序。

minute()

获取单个股票的分钟数据。
const data = await client.quant.minute({
  symbol: '000001',
  startDateTime: '2024-01-01 09:30:00',
  endDateTime: '2024-01-01 15:00:00',
  market: 'cn'
});

data.forEach(d => {
  console.log(`${d.datetime}: O=${d.open} H=${d.high} L=${d.low} C=${d.close} V=${d.volume}`);
});
参数:
参数类型必填说明
symbolstring股票代码
startDateTimestring开始时间(YYYY-MM-DD HH:MM:SS)
endDateTimestring结束时间(YYYY-MM-DD HH:MM:SS)
marketstring市场,默认 cn
返回类型:
interface OHLCVData {
  symbol: string;
  datetime: string;
  open: number;
  high: number;
  low: number;
  close: number;
  volume: number;
}

minuteBatch()

批量获取多个股票的分钟数据。
const data = await client.quant.minuteBatch({
  symbols: ['000001', '600519', '000002'],
  startDateTime: '2024-01-01 09:30:00',
  endDateTime: '2024-01-01 15:00:00',
  market: 'cn'
});
数据按日期(升序)、股票代码排序。

回测 (Backtest)

backtest()

执行策略回测。
const result = await client.quant.backtest({
  startDate: '2023-01-01',
  endDate: '2024-01-01',
  symbol: '000001',
  market: 'cn',
  entryFormula: 'CROSS(MA(CLOSE, 5), MA(CLOSE, 20))',  // 买入信号:MA5 上穿 MA20
  exitFormula: 'CROSSDOWN(MA(CLOSE, 5), MA(CLOSE, 20))',  // 卖出信号(可选)
  initialCash: 100000,  // 初始资金
  commission: 0.0003,   // 佣金费率
  stopLoss: 0.05,       // 止损 5%
  sizerPercent: 99,     // 仓位 99%
  autoClose: true,      // 自动平仓
  labels: { rsi: 'RSI(14)', ma20: 'MA(CLOSE, 20)' }  // 额外指标(可选)
});
参数:
参数类型必填默认值说明
startDatestring-回测开始日期(YYYY-MM-DD)
endDatestring-回测结束日期(YYYY-MM-DD)
symbolstring-股票代码
marketstringcn市场(cn/hk/us)
entryFormulastring-买入/开仓公式(结果 > 0 触发买入)
exitFormulastring-卖出/平仓公式(结果 > 0 触发卖出)
initialCashnumber100000初始资金
commissionnumber0佣金费率
stopLossnumber0止损比例(0 表示不设置)
sizerPercentnumber99仓位百分比
autoClosebooleantrue是否自动平仓
labelsRecord<string, string>-标签字典,返回额外指标值
返回类型:
interface BacktestResult {
  success: boolean;
  initial_cash: number;
  final_cash: number;
  total_return: number;
  total_return_pct: number;
  max_drawdown: number;
  profit_factor: number;
  win_rate: number;
  total_trades: number;
  trades: Array<{
    date: string;
    action: 'buy' | 'sell';
    price: number;
    quantity: number;
    value: number;
    pnl?: number;
  }>;
}
使用示例:
// 1. 简单金叉策略(只有买入信号)
const result = await client.quant.backtest({
  startDate: '2023-01-01',
  endDate: '2024-01-01',
  symbol: '000001',
  entryFormula: 'CROSS(MA(CLOSE, 5), MA(CLOSE, 20))'
});

console.log(`总收益: ${result.total_return.toFixed(2)}`);
console.log(`收益率: ${(result.total_return_pct * 100).toFixed(2)}%`);
console.log(`最大回撤: ${(result.max_drawdown * 100).toFixed(2)}%`);
console.log(`胜率: ${(result.win_rate * 100).toFixed(2)}%`);
console.log(`盈亏比: ${result.profit_factor.toFixed(2)}`);
console.log(`交易次数: ${result.total_trades}`);

// 2. 买入和卖出信号都指定
const result2 = await client.quant.backtest({
  startDate: '2023-01-01',
  endDate: '2024-01-01',
  symbol: '000001',
  entryFormula: 'CROSS(MA(CLOSE, 5), MA(CLOSE, 20))',      // 金叉买入
  exitFormula: 'CROSSDOWN(MA(CLOSE, 5), MA(CLOSE, 20))'    // 死叉卖出
});

// 3. RSI 超卖超买策略
const result3 = await client.quant.backtest({
  startDate: '2023-01-01',
  endDate: '2024-01-01',
  symbol: '000001',
  entryFormula: 'RSI(14) < 30',   // RSI 低于 30 买入
  exitFormula: 'RSI(14) > 70'     // RSI 高于 70 卖出
});

// 4. 使用 labels 记录额外指标
const result4 = await client.quant.backtest({
  startDate: '2023-01-01',
  endDate: '2024-01-01',
  symbol: '000001',
  entryFormula: 'CROSS(RSI(14), 30)',
  labels: {
    rsi: 'RSI(14)',
    ma20: 'MA(CLOSE, 20)',
    ma60: 'MA(CLOSE, 60)'
  }
});
// 每日数据中会包含 rsi、ma20、ma60 的值

完整示例

技术分析工作流

import { Reportify } from 'reportify-sdk';

const client = new Reportify({ apiKey: 'your-api-key' });

async function technicalAnalysis() {
  // 1. 获取股票数据
  const ohlcv = await client.quant.ohlcv({
    symbol: '000001',
    startDate: '2024-01-01'
  });

  // 2. 计算多个指标
  const rsi = await client.quant.indicatorsCompute({
    symbols: ['000001'],
    formula: 'RSI(14)'
  });
  
  const macd = await client.quant.indicatorsCompute({
    symbols: ['000001'],
    formula: 'MACD()'
  });

  // 3. 分析最新数据
  const latestRSI = rsi[0]?.rsi;
  const latestMACD = macd[0]?.macd;
  
  console.log(`最新 RSI: ${latestRSI}`);
  console.log(`最新 MACD: ${latestMACD}`);
}

technicalAnalysis();

选股并回测

async function screenAndBacktest() {
  // 1. 选股:RSI 超卖
  const oversoldStocks = await client.quant.factorsScreen({
    formula: 'RSI(14) < 30'
  });
  
  console.log(`发现 ${oversoldStocks.length} 只超卖股票`);

  // 2. 对每只股票进行回测
  for (const stock of oversoldStocks.slice(0, 5)) {
    const result = await client.quant.backtest({
      startDate: '2023-01-01',
      endDate: '2024-01-01',
      symbol: stock.symbol,
      entryFormula: 'CROSS(RSI(14), 30)'  // RSI 上穿 30 买入
    });
    
    console.log(`${stock.symbol}: 收益率 ${(result.total_return_pct * 100).toFixed(2)}%`);
  }
}

screenAndBacktest();