• API 功能

    • 采用咕咕数据自研 GuGuData Portfolio Risk Model(GPRM),按基金代码与用户权重输出可复核、可版本化的组合风险结果;
    • 组合收益只使用全部基金严格共有的交易日期,并采用恒定权重法计算,不插值、不前向填充、不静默剔除基金或重算权重;
    • 通过几何复利计算年化收益,以 252 个交易日计算年化波动率,并返回最大回撤及其峰值和谷值日期;
    • 使用历史模拟法计算 95% 或 99% 置信水平的单日 VaR 与 CVaR,统一采用正损失口径;
    • 使用稳健的收缩协方差估计降低多基金样本矩阵不稳定,并通过 Euler 分解返回每只基金的风险贡献;
    • 返回两两相关性、下行相关性和分散化比率,用于识别同涨同跌、下跌共振及组合分散效果;
    • 提供基金级观察数、覆盖率、个体收益、波动率、回撤和风险贡献,适用于组合监控、投研看板、量化预检与智能投顾后台;
    • 内置 6 个月与 1 年样本门槛、数据时效和公共样本检查,明确返回 AVAILABLE、PARTIAL 或 UNAVAILABLE;
    • 数据不足、重复日期冲突、非法收益和下行样本不足等情况均返回稳定原因码或警告,便于自动化降级与审计;
    • 仅返回模型衍生风险指标,不返回原始净值或收益序列;结果基于历史数据,不提供涨跌预测、基金评分、买卖或调仓建议。
    • 全接口通过 HTTPS 提供服务;
    • 全面兼容 Apple ATS;
    • 全国多节点 CDN 部署;
    • 接口调用状态与状态监控
  • API 文档

    接口地址: https://api.gugudata.com/ai/fund/portfolio-risk-analyses

    返回格式: application/json; charset=utf-8

    请求方式: POST

    请求协议: HTTPS

    请求示例: https://api.gugudata.com/ai/fund/portfolio-risk-analyses

    数据预览: https://www.gugudata.com/preview/fundportfolioriskanalysis

    接口测试:  https://api.gugudata.com/ai/fund/portfolio-risk-analyses/demo

    OpenAPI: https://www.gugudata.com/openapi/gugudata.openapi.3.1.json

    请求参数(POST 请求参数以 application/json 格式传递;鉴权方式请参见下方示例代码)

    参数名 参数类型 是否必须 默认值 备注
    appkey string YOUR_APPKEY 付费后获取的 APPKEY。推荐使用 Authorization: Bearer YOUR_APPKEY;同时兼容 AppKey、X-GUGUDATA-APPKEY、X-API-Key 请求头和 appkey 查询参数。APPKEY 不属于 JSON 请求体
    Positions array [{"FundCode":"012729","Weight":0.3},{"FundCode":"290008","Weight":0.25},{"FundCode":"000001","Weight":0.25},{"FundCode":"110022","Weight":0.2}] JSON 持仓数组,必须包含 2 至 10 个对象;FundCode 不得重复。任何一只基金不满足数据要求时,不会静默剔除或重新分配权重
    Positions[].FundCode string 012729 六位数字组成的公募基金代码,必须以 JSON 字符串传递以保留前导零,例如 012729
    Positions[].Weight number 0.3 当前组合权重,使用有限且大于 0 的小数;全部 Weight 之和与 1 的误差不得超过 0.000001,服务端不会自动归一化
    Period string 1Y 历史分析窗口,可选 6M 或 1Y,默认 1Y。6M 至少需要 100 个有效观察,1Y 至少需要 200 个有效观察
    ConfidenceLevel number 0.95 单日历史模拟 VaR 和 CVaR 的置信水平,仅支持 0.95 或 0.99,默认 0.95

    返回参数

    参数名 参数类型 备注
    DataStatus.RequestParameter string 服务端生成的脱敏请求摘要,仅包含基金数量、分析周期和置信水平,不包含基金代码、权重或 APPKEY
    DataStatus.StatusCode integer 业务状态码。100 表示请求正常完成;501 参数错误;502 请求频率受限;503 账号过期;504 APPKEY 错误;901 服务暂不可用
    DataStatus.Status string 机器可读的错误状态;成功响应通常不返回。参数错误为 invalid_argument,上游不可用为 service_unavailable
    DataStatus.StatusDescription string 本次请求的中文状态说明;程序判断应优先使用 StatusCode 和 AnalysisStatus
    DataStatus.ResponseDateTime string 服务端响应时间,格式为 YYYY-MM-DD HH:mm:ss.SSS
    DataStatus.DataTotalCount integer 当前响应中的分析结果数量;成功分析通常为 1,错误响应为 0
    DataStatus.RequestId string 请求追踪标识。咨询技术支持时可提供该值,但不要提供 APPKEY
    DataStatus.NoDataReason string 统一响应层的无数据原因码;基金组合的详细原因以 Data.NoDataReasons 为准
    Data.AnalysisStatus string 分析状态:AVAILABLE、PARTIAL 或 UNAVAILABLE
    Data.ModelVersion string 本次计算使用的 GuGuData Portfolio Risk Model 版本;相同输入、数据快照和模型版本可得到确定性结果
    Data.Period string 实际采用的历史分析周期,取值为 6M 或 1Y
    Data.ConfidenceLevel number 本次 VaR 和 CVaR 计算采用的置信水平,取值为 0.95 或 0.99
    Data.WeightingMethod string 组合收益的权重方法,固定为 CONSTANT_WEIGHT,表示在全部公共交易日期上使用请求中的恒定权重
    Data.DataStartDate string 组合严格公共样本的起始交易日期,格式为 YYYYMMDD
    Data.DataEndDate string 组合严格公共样本的结束交易日期,格式为 YYYYMMDD
    Data.SnapshotTime string 本次模型分析快照时间,使用 ISO 8601 格式并包含时区偏移
    Data.ObservationCount integer 全部请求基金严格共有的有效交易日期数量;该值不足周期门槛时 PortfolioMetrics 为 null
    Data.CoverageRatio number 全部基金严格公共日期数除以有效日期并集数量,范围为 0 至 1,越接近 1 表示日期对齐越完整
    Data.RequestedFundCount integer 请求中提交的基金数量
    Data.AnalyzedFundCount integer 满足周期数据要求并完成个体指标计算的基金数量
    Data.PortfolioMetrics object 组合层历史风险指标。仅当全部基金和严格公共样本均满足周期要求时返回对象,否则为 null
    Data.PortfolioMetrics.AnnualizedReturn number 基于组合日收益几何复利并按 252 个交易日年化;可为负数,小数表示,例如 0.08 表示 8%
    Data.PortfolioMetrics.AnnualizedVolatility number 基于稳健收缩协方差矩阵计算的组合年化波动率,年化因子为 252;小数表示
    Data.PortfolioMetrics.MaximumDrawdown number 分析期内组合累计收益从历史峰值到后续谷值的最大跌幅,按正数小数表示
    Data.PortfolioMetrics.MaximumDrawdownStartDate string 最大回撤起始日期,格式为 YYYYMMDD;无回撤时为 null
    Data.PortfolioMetrics.MaximumDrawdownEndDate string 最大回撤结束日期,格式为 YYYYMMDD;无回撤时为 null
    Data.PortfolioMetrics.ValueAtRisk number 按 ConfidenceLevel 计算的单日历史模拟风险价值,采用正损失口径;例如 0.02 表示阈值损失为 2%
    Data.PortfolioMetrics.ConditionalValueAtRisk number 超过 VaR 阈值后的单日平均尾部损失,采用正损失口径,并保证 CVaR 大于等于 VaR
    Data.PortfolioMetrics.DiversificationRatio number 加权个体年化波动率之和除以组合年化波动率;通常大于 1 表示存在分散化效果,零方差时为 null
    Data.FundMetrics array 按请求顺序返回每只基金的个体历史风险指标、覆盖率和组合风险贡献;基金不会被静默移除
    Data.FundMetrics[].FundCode string 六位基金代码
    Data.FundMetrics[].FundName string 基金名称;历史序列未提供名称时为 null
    Data.FundMetrics[].Weight number 请求中该基金的组合权重
    Data.FundMetrics[].AnalysisStatus string 该基金的个体指标状态,取值为 AVAILABLE 或 UNAVAILABLE;组合整体状态另见 Data.AnalysisStatus
    Data.FundMetrics[].ObservationCount integer 该基金在分析周期内的有效观察数
    Data.FundMetrics[].CoverageRatio number 该基金有效日期数占全部基金有效日期并集的比例
    Data.FundMetrics[].AnnualizedReturn number 该基金日收益按几何复利和 252 个交易日年化;数据不足时为 null
    Data.FundMetrics[].AnnualizedVolatility number 该基金日收益样本标准差按 252 个交易日年化;数据不足时为 null
    Data.FundMetrics[].MaximumDrawdown number 该基金在分析期内从峰值到谷值的最大跌幅,按正数小数表示;数据不足时为 null
    Data.FundMetrics[].RiskContribution number 使用 Euler 分解得到的组合方差风险贡献占比;单只基金允许为负,组合可计算时各项之和约等于 1
    Data.PairwiseDependencies array 满足周期样本门槛的基金两两依赖关系;每个无序基金对返回一条记录
    Data.PairwiseDependencies[].FundCodeA string 相关性基金代码 A
    Data.PairwiseDependencies[].FundCodeB string 相关性基金代码 B
    Data.PairwiseDependencies[].Correlation number 两只基金在严格公共日期上的 Pearson 相关系数,范围为 -1 至 1;零方差等不可计算情况为 null
    Data.PairwiseDependencies[].DownsideCorrelation number 全部基金组合收益小于 0 的严格公共交易日期上计算;所有基金对使用同一组下行日期。少于 30 个下行样本或零方差时为 null
    Data.DataQuality object 当前周期的数据门槛、最旧最新记录的数据年龄和标准化警告码
    Data.DataQuality.MinimumObservationCount integer 当前周期要求的最低有效观察数
    Data.DataQuality.LatestDataAgeDays integer 最旧一只基金的最新记录距分析日期的天数
    Data.DataQuality.Warnings array 标准化警告码数组,例如 STALE_SOURCE_FALLBACK、INSUFFICIENT_DOWNSIDE_OBSERVATIONS 或 ZERO_PORTFOLIO_VARIANCE
    Data.DataQuality.Warnings[] string 单条警告码;部分警告会附带相关基金代码,便于程序定位但不影响其他可计算指标
    Data.NoDataReasons array 基金级或组合级不可计算原因数组;合法基金但数据不足仍返回 HTTP 200 和业务码 100
    Data.NoDataReasons[].FundCode string 原因对应的基金代码;组合级原因时为 null
    Data.NoDataReasons[].Reason string 稳定原因码,包括 FUND_NOT_FOUND、EMPTY_HISTORY、INSUFFICIENT_OBSERVATIONS、INSUFFICIENT_COMMON_OBSERVATIONS、STALE_HISTORY、CONFLICTING_DUPLICATE_DATE、INVALID_RETURN、INSUFFICIENT_DOWNSIDE_OBSERVATIONS 或 ZERO_PORTFOLIO_VARIANCE
    Data.ComplianceNotice string 历史风险分析免责声明;Demo 使用固定真实基金组合和真实历史日增长率。本接口不提供涨跌预测、基金评分、买卖建议或调仓建议
    Data.IsDemo boolean 是否为免鉴权演示结果。正式 POST 请求为 false;Demo 使用固定真实基金组合并随历史数据更新,返回 true

    响应示例

    接口数据预览
    {
      "DataStatus": {
        "RequestParameter": "fundCount=4&Period=1Y&ConfidenceLevel=0.95",
        "StatusCode": 100,
        "StatusDescription": "分析成功",
        "ResponseDateTime": "2026-08-03 16:32:58.769",
        "DataTotalCount": 1,
        "RequestId": "00000000-0000-0000-0000-000000000000"
      },
      "Data": {
        "AnalysisStatus": "AVAILABLE",
        "ModelVersion": "gprm-1.1.0",
        "Period": "1Y",
        "ConfidenceLevel": 0.95,
        "WeightingMethod": "CONSTANT_WEIGHT",
        "DataStartDate": "20250804",
        "DataEndDate": "20260803",
        "SnapshotTime": "2026-08-04T00:34:20+08:00",
        "ObservationCount": 224,
        "CoverageRatio": 0.92562,
        "RequestedFundCount": 4,
        "AnalyzedFundCount": 4,
        "PortfolioMetrics": {
          "AnnualizedReturn": 0.114878,
          "AnnualizedVolatility": 0.222874,
          "MaximumDrawdown": 0.207106,
          "MaximumDrawdownStartDate": "20260506",
          "MaximumDrawdownEndDate": "20260724",
          "ValueAtRisk": 0.023209,
          "ConditionalValueAtRisk": 0.028629,
          "DiversificationRatio": 1.490229
        },
        "FundMetrics": [
          {
            "FundCode": "012729",
            "FundName": "国泰中证动漫游戏ETF联接C",
            "Weight": 0.3,
            "AnalysisStatus": "AVAILABLE",
            "ObservationCount": 242,
            "CoverageRatio": 1.0,
            "AnnualizedReturn": -0.113888,
            "AnnualizedVolatility": 0.312954,
            "MaximumDrawdown": 0.392717,
            "RiskContribution": 0.303092
          },
          {
            "FundCode": "290008",
            "FundName": "泰信发展主题混合",
            "Weight": 0.25,
            "AnalysisStatus": "AVAILABLE",
            "ObservationCount": 238,
            "CoverageRatio": 0.983471,
            "AnnualizedReturn": 0.55369,
            "AnnualizedVolatility": 0.462583,
            "MaximumDrawdown": 0.455578,
            "RiskContribution": 0.374423
          },
          {
            "FundCode": "000001",
            "FundName": "华夏成长混合",
            "Weight": 0.25,
            "AnalysisStatus": "AVAILABLE",
            "ObservationCount": 236,
            "CoverageRatio": 0.975207,
            "AnnualizedReturn": 0.311197,
            "AnnualizedVolatility": 0.355152,
            "MaximumDrawdown": 0.270036,
            "RiskContribution": 0.26799
          },
          {
            "FundCode": "110022",
            "FundName": "易方达消费行业股票",
            "Weight": 0.2,
            "AnalysisStatus": "AVAILABLE",
            "ObservationCount": 233,
            "CoverageRatio": 0.96281,
            "AnnualizedReturn": -0.107587,
            "AnnualizedVolatility": 0.156399,
            "MaximumDrawdown": 0.308984,
            "RiskContribution": 0.054495
          }
        ],
        "PairwiseDependencies": [
          {
            "FundCodeA": "012729",
            "FundCodeB": "290008",
            "Correlation": 0.218831,
            "DownsideCorrelation": -0.07497
          },
          {
            "FundCodeA": "012729",
            "FundCodeB": "000001",
            "Correlation": 0.368026,
            "DownsideCorrelation": 0.16334
          },
          {
            "FundCodeA": "012729",
            "FundCodeB": "110022",
            "Correlation": 0.389875,
            "DownsideCorrelation": 0.19799
          },
          {
            "FundCodeA": "290008",
            "FundCodeB": "000001",
            "Correlation": 0.258689,
            "DownsideCorrelation": -0.074275
          },
          {
            "FundCodeA": "290008",
            "FundCodeB": "110022",
            "Correlation": 0.15031,
            "DownsideCorrelation": 0.030834
          },
          {
            "FundCodeA": "000001",
            "FundCodeB": "110022",
            "Correlation": -0.034332,
            "DownsideCorrelation": -0.248425
          }
        ],
        "DataQuality": {
          "MinimumObservationCount": 200,
          "LatestDataAgeDays": 1,
          "Warnings": [
            
          ]
        },
        "NoDataReasons": [
          
        ],
        "ComplianceNotice": "本 Demo 使用固定真实基金组合和真实历史日增长率,通过 GuGuData Portfolio Risk Model 计算历史风险指标;结果随基金数据更新,不构成投资建议。",
        "IsDemo": true
      }
    }
  • 鉴权方式

    接口支持以下 AppKey 传递方式,任选一种即可;已有请求示例、Postman 集合和历史代码仍可继续使用原来的 appkey 参数方式。

    传输载体 参数 示例 说明
    HTTP Header X-GUGUDATA-APPKEY X-GUGUDATA-APPKEY: YOUR_APPKEY 推荐方式,适合服务端接入和统一封装。
    HTTP Header X-API-Key X-API-Key: YOUR_APPKEY 通用 API Key Header,便于和常见 API 客户端集成。
    HTTP Header Authorization Authorization: Bearer YOUR_APPKEY 适合 OpenAI 兼容接口或 Bearer Token 风格客户端。
    Query 参数 appkey ?appkey=YOUR_APPKEY 兼容现有示例、Postman 集合、浏览器调试和历史代码。

    部分历史 POST 接口仍兼容表单或 JSON body 中的 appkey;新接入建议优先使用 Header 或 Query 参数。

  • 接口常见 HTTP 响应状态码

    以下为接口调用中常见的 HTTP 传输层状态码,不等同于响应体内的业务状态码;完整状态码注册表以 IANA HTTP Status Code Registry 为准。

    状态码 状态码解释 备注
    200 请求成功 HTTP 请求已成功处理;业务状态请结合响应体中的自定义业务码判断。
    201 资源已创建 创建类接口请求成功,并已生成对应资源。
    202 请求已接受 请求已被接受处理,结果可能异步完成。
    204 无响应内容 请求成功但响应体为空,适用于无需返回数据的操作。
    304 资源未变更 配合缓存或条件请求使用,表示可继续使用本地缓存。
    400 请求参数错误 请求参数缺失、格式错误或参数组合不合法。
    401 认证失败 缺少、无效或未通过认证的访问凭证(如 AppKey)。
    403 无权限访问 订单到期、权限不足或接口额度不可用。
    404 资源不存在 请求路径不存在。
    405 请求方法不允许 当前路径不支持该 HTTP 方法。
    408 请求超时 客户端请求在服务端等待时间内未完成,可稍后重试。
    409 请求冲突 请求与当前资源状态冲突,调整参数或业务状态后重试。
    413 请求内容过大 上传文件或请求体超过接口限制。
    414 请求地址过长 请求 URL 超过服务端可处理长度,建议减少查询参数或改用 POST。
    415 请求内容类型不支持 上传或请求体的内容类型不符合接口要求。
    422 请求语义错误 请求格式正确,但参数取值、语义或业务约束无法处理。
    429 请求频率受限 默认按来源 IP 限速,单 IP 最多 5 QPS,可满足常规业务调用。超出限制时接口会返回 429 请求频率受限;已购买接口订单可加购 10 QPS 扩展。
    431 请求头过大 请求头字段过大或过多,建议精简 Header 后重试。
    500 服务器内部错误 服务端处理异常,请稍后重试。
    502 网关或上游错误 网关或代理从上游服务收到异常响应。
    503 服务暂时不可用 服务维护、容量保护或依赖异常导致暂时不可用,请稍后重试。
    504 网关超时 网关等待上游服务响应超时,可稍后重试或降低请求复杂度。
  • 接口自定义业务状态码

    业务状态码 业务状态码解释 备注
    100 正常返回 结合 AnalysisStatus 判断分析数据完整性
    501 参数错误 请检查基金代码、持仓数量、权重、周期和置信水平
    502 请求频率受限 请降低请求频率后重试
    503 账号已过期 请确认订单有效期
    504 APPKEY 错误 请检查 APPKEY 及接口权限
    901 服务暂不可用 历史数据服务暂不可用,请稍后重试
  • 请求示例代码

    curl --location --request POST 'https://api.gugudata.com/ai/fund/portfolio-risk-analyses' \
    --header 'Authorization: Bearer YOUR_APPKEY' \
    --header 'Content-Type: application/json' \
    --data '{
      "Positions": [
        {
          "FundCode": "012729",
          "Weight": 0.3
        },
        {
          "FundCode": "290008",
          "Weight": 0.25
        },
        {
          "FundCode": "000001",
          "Weight": 0.25
        },
        {
          "FundCode": "110022",
          "Weight": 0.2
        }
      ],
      "Period": "1Y",
      "ConfidenceLevel": 0.95
    }'
    #include <curl/curl.h>
    
    int main(void) {
      CURL *curl = curl_easy_init();
      if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://api.gugudata.com/ai/fund/portfolio-risk-analyses");
        curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json");
        headers = curl_slist_append(headers, "Authorization: Bearer YOUR_APPKEY");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{
      \"Positions\": [
        {
          \"FundCode\": \"012729\",
          \"Weight\": 0.3
        },
        {
          \"FundCode\": \"290008\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"000001\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"110022\",
          \"Weight\": 0.2
        }
      ],
      \"Period\": \"1Y\",
      \"ConfidenceLevel\": 0.95
    }");
        CURLcode res = curl_easy_perform(curl);
        (void)res;
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
      }
      return 0;
    }
    
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net.Http;
    using System.Text;
    
    var client = new HttpClient();
    var request = new HttpRequestMessage(HttpMethod.Post, "https://api.gugudata.com/ai/fund/portfolio-risk-analyses");
    request.Headers.Add("Authorization", "Bearer YOUR_APPKEY");
    request.Content = new StringContent("{
      \"Positions\": [
        {
          \"FundCode\": \"012729\",
          \"Weight\": 0.3
        },
        {
          \"FundCode\": \"290008\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"000001\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"110022\",
          \"Weight\": 0.2
        }
      ],
      \"Period\": \"1Y\",
      \"ConfidenceLevel\": 0.95
    }", Encoding.UTF8, "application/json");
    var response = client.SendAsync(request).Result;
    Console.WriteLine(response.Content.ReadAsStringAsync().Result);
    
    package main
    
    import (
      "strings"
      "fmt"
      "io"
      "net/http"
    )
    
    func main() {
      url := "https://api.gugudata.com/ai/fund/portfolio-risk-analyses"
      payload := strings.NewReader("{
      \"Positions\": [
        {
          \"FundCode\": \"012729\",
          \"Weight\": 0.3
        },
        {
          \"FundCode\": \"290008\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"000001\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"110022\",
          \"Weight\": 0.2
        }
      ],
      \"Period\": \"1Y\",
      \"ConfidenceLevel\": 0.95
    }")
      req, err := http.NewRequest("POST", url, payload)
      if err != nil {
        fmt.Println(err)
        return
      }
      req.Header.Set("Authorization", "Bearer YOUR_APPKEY")
      req.Header.Add("Content-Type", "application/json")
      res, err := http.DefaultClient.Do(req)
      if err != nil {
        fmt.Println(err)
        return
      }
      defer res.Body.Close()
      body, err := io.ReadAll(res.Body)
      if err != nil {
        fmt.Println(err)
        return
      }
      fmt.Println(string(body))
    }
    
    OkHttpClient client = new OkHttpClient().newBuilder().build();
    MediaType mediaType = MediaType.parse("application/json");
    RequestBody body = RequestBody.create(mediaType, "{
      \"Positions\": [
        {
          \"FundCode\": \"012729\",
          \"Weight\": 0.3
        },
        {
          \"FundCode\": \"290008\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"000001\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"110022\",
          \"Weight\": 0.2
        }
      ],
      \"Period\": \"1Y\",
      \"ConfidenceLevel\": 0.95
    }");
    Request request = new Request.Builder()
      .url("https://api.gugudata.com/ai/fund/portfolio-risk-analyses")
      .addHeader("Authorization", "Bearer YOUR_APPKEY")
      .method("POST", body)
      .build();
    Response response = client.newCall(request).execute();
    System.out.println(response.body().string());
    
    $.ajax({
      url: "https://api.gugudata.com/ai/fund/portfolio-risk-analyses",
      method: "POST",
      headers: { "Authorization": "Bearer YOUR_APPKEY" },
      contentType: "application/json",
      data: JSON.stringify({
      "Positions": [
        {
          "FundCode": "012729",
          "Weight": 0.3
        },
        {
          "FundCode": "290008",
          "Weight": 0.25
        },
        {
          "FundCode": "000001",
          "Weight": 0.25
        },
        {
          "FundCode": "110022",
          "Weight": 0.2
        }
      ],
      "Period": "1Y",
      "ConfidenceLevel": 0.95
    }),
    }).done(function (response) {
      console.log(response);
    });
    
    const https = require("node:https");
    const url = "https://api.gugudata.com/ai/fund/portfolio-risk-analyses";
    const body = JSON.stringify({
      "Positions": [
        {
          "FundCode": "012729",
          "Weight": 0.3
        },
        {
          "FundCode": "290008",
          "Weight": 0.25
        },
        {
          "FundCode": "000001",
          "Weight": 0.25
        },
        {
          "FundCode": "110022",
          "Weight": 0.2
        }
      ],
      "Period": "1Y",
      "ConfidenceLevel": 0.95
    });
    
    const request = https.request(url, {
      method: "POST",
      headers: {
        "Authorization": "Bearer YOUR_APPKEY",
        "Content-Type": "application/json",
        "Content-Length": Buffer.byteLength(body)
      }
    }, handleResponse);
    request.on("error", console.error);
    request.write(body);
    request.end();
    
    function handleResponse(response) {
      const chunks = [];
      response.on("data", function (chunk) {
        chunks.push(chunk);
      });
      response.on("end", function () {
        console.log(Buffer.concat(chunks).toString("utf8"));
      });
    }
    
    #import <Foundation/Foundation.h>
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.gugudata.com/ai/fund/portfolio-risk-analyses"]];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"Bearer YOUR_APPKEY" forHTTPHeaderField:@"Authorization"];
    NSString *body = @"{
      \"Positions\": [
        {
          \"FundCode\": \"012729\",
          \"Weight\": 0.3
        },
        {
          \"FundCode\": \"290008\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"000001\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"110022\",
          \"Weight\": 0.2
        }
      ],
      \"Period\": \"1Y\",
      \"ConfidenceLevel\": 0.95
    }";
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
    NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
      if (error) {
        NSLog(@"%@", error);
        return;
      }
      NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }];
    [task resume];
    
    <?php
    $curl = curl_init();
    curl_setopt_array($curl, array(
      CURLOPT_URL => "https://api.gugudata.com/ai/fund/portfolio-risk-analyses",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_POSTFIELDS => "{
      \"Positions\": [
        {
          \"FundCode\": \"012729\",
          \"Weight\": 0.3
        },
        {
          \"FundCode\": \"290008\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"000001\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"110022\",
          \"Weight\": 0.2
        }
      ],
      \"Period\": \"1Y\",
      \"ConfidenceLevel\": 0.95
    }",
      CURLOPT_HTTPHEADER => array(
        "Content-Type: application/json",
        "Authorization: Bearer YOUR_APPKEY",
      ),
    ));
    $response = curl_exec($curl);
    curl_close($curl);
    echo $response;
    
    import requests
    import json
    
    url = "https://api.gugudata.com/ai/fund/portfolio-risk-analyses"
    headers = { "Authorization": "Bearer YOUR_APPKEY" }
    payload = json.loads('{
      "Positions": [
        {
          "FundCode": "012729",
          "Weight": 0.3
        },
        {
          "FundCode": "290008",
          "Weight": 0.25
        },
        {
          "FundCode": "000001",
          "Weight": 0.25
        },
        {
          "FundCode": "110022",
          "Weight": 0.2
        }
      ],
      "Period": "1Y",
      "ConfidenceLevel": 0.95
    }')
    response = requests.post(url, json=payload, headers=headers)
    print(response.text)
    
    require "uri"
    require "net/http"
    
    url = URI("https://api.gugudata.com/ai/fund/portfolio-risk-analyses")
    https = Net::HTTP.new(url.host, url.port)
    https.use_ssl = true
    request = Net::HTTP::Post.new(url)
    request["Authorization"] = "Bearer YOUR_APPKEY"
    request["Content-Type"] = "application/json"
    request.body = "{
      \"Positions\": [
        {
          \"FundCode\": \"012729\",
          \"Weight\": 0.3
        },
        {
          \"FundCode\": \"290008\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"000001\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"110022\",
          \"Weight\": 0.2
        }
      ],
      \"Period\": \"1Y\",
      \"ConfidenceLevel\": 0.95
    }"
    response = https.request(request)
    puts response.read_body
    
    import Foundation
    
    let semaphore = DispatchSemaphore(value: 0)
    var request = URLRequest(url: URL(string: "https://api.gugudata.com/ai/fund/portfolio-risk-analyses")!, timeoutInterval: .infinity)
    request.httpMethod = "POST"
    request.addValue("Bearer YOUR_APPKEY", forHTTPHeaderField: "Authorization")
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = "{
      \"Positions\": [
        {
          \"FundCode\": \"012729\",
          \"Weight\": 0.3
        },
        {
          \"FundCode\": \"290008\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"000001\",
          \"Weight\": 0.25
        },
        {
          \"FundCode\": \"110022\",
          \"Weight\": 0.2
        }
      ],
      \"Period\": \"1Y\",
      \"ConfidenceLevel\": 0.95
    }".data(using: .utf8)
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
      defer { semaphore.signal() }
      guard let data = data else {
        print(String(describing: error))
        return
      }
      print(String(data: data, encoding: .utf8)!)
    }
    task.resume()
    semaphore.wait()
    
  • 常见问题 Q&A

    • Q: 数据请求有缓存吗?

      A: 接口默认以实时响应为目标。对于日更、月更等具备明确更新周期的数据,会在数据周期内采用缓存与预热策略,以提升响应速度和稳定性;实时查询类接口则以接口说明中的更新频率为准。建议业务侧结合数据时效要求设置本地缓存与重试策略,避免高频重复请求。

    • Q: 如何保证请求时 AppKey 的安全性?

      A: 建议将 AppKey 保存在服务端环境中,由后端统一调用 API,再向前端或业务系统返回必要结果。不要把 AppKey 写入网页、App 客户端或公开仓库;生产环境建议按系统或业务线拆分 AppKey,并保留调用日志,便于权限控制、审计与问题排查。

    • Q: 接口可以用于哪些开发语言?

      A: 只要支持 HTTPS 请求的语言和框架均可接入,包括 Java、Python、Node.js、PHP、Go、C#、Swift、Kotlin 等。推荐由后端统一封装调用逻辑,集中处理鉴权、缓存、限流、重试和错误码映射,让 Web、App、AI Agent、内部系统和自动化任务复用同一套数据能力。

    • Q: 接口的性能可以保证吗?

      A: GuGuData API 按生产环境标准部署,持续关注接口稳定性、响应速度与可用性。实际响应时间会受接口类型、请求参数、数据源更新和网络环境影响;建议生产接入前进行联调与压测,并设置合理的超时、重试、降级和告警策略。批量处理或高并发场景可提前评估 QPS、白名单和专属容量方案。

  • 服务协议与免责声明

    购买或使用 GuGuData API 服务前,请充分阅读服务协议、免责声明与数据合规声明。相关页面均支持在浏览器中快速导出 PDF,便于内部归档、评审和合规留存。

  • 技术支持

    • 技术支持邮箱: support@gugudata.com
    • 微信客服: 客服链接
  • 专业软件开发与系统工程服务

    GuGuData 官方认证工程合作伙伴,专注企业级数据接口集成、AI 工程化与大规模数据处理。团队深度理解 GuGuData 数据接口体系,具备海量数据采集、治理、检索与高并发接口服务经验,可围绕业务场景构建 AI Agent、MCP 接入、智能工作流和生产级数据应用,让数据能力稳定进入现有流程、内部平台和核心业务系统。

    了解工程服务