• API 功能

    • 按基金代码和持仓权重分析组合风险;
    • 支持 6 个月或 1 年分析周期;
    • 支持 95% 或 99% 置信水平;
    • 提供组合年化收益与年化波动率;
    • 提供最大回撤及对应日期区间;
    • 提供 VaR 与 CVaR 风险指标;
    • 展示单只基金的收益、波动与风险贡献;
    • 展示基金相关性与下行相关性;
    • 展示组合分散效果与数据完整性;
    • 结果基于历史数据,不构成投资建议;
    • 默认最大 QPS:5,可在开发者中心自助升级,月付年付订单接口调用次数不限。
    • 接口调用状态与状态监控
  • 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 错误;505 调用额度不足;900 服务内部错误;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 本次结果的版本标识
    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 组合年化波动率,按小数表示,例如 0.12 表示 12%
    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 该基金对组合风险的贡献占比;单只基金允许为负,组合可计算时各项之和约等于 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 数据质量提示码数组,例如 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 历史风险分析免责声明;结果仅供信息参考,不构成投资建议
    Data.IsDemo boolean 是否为免鉴权演示结果。正式 POST 请求为 false,Demo 返回 true

    响应示例(真实数据节选)

    接口数据预览
    {
      "DataStatus": {
        "RequestParameter": "fundCount=4&Period=1Y&ConfidenceLevel=0.95",
        "StatusCode": 100,
        "StatusDescription": "分析成功",
        "ResponseDateTime": "2026-08-31 03:38:54.257",
        "DataTotalCount": 1,
        "RequestId": "efed3113-98ad-4a58-ad58-d4fab4b44adf"
      },
      "Data": {
        "AnalysisStatus": "AVAILABLE",
        "ModelVersion": "gprm-1.1.0",
        "Period": "1Y",
        "ConfidenceLevel": 0.95,
        "WeightingMethod": "CONSTANT_WEIGHT",
        "DataStartDate": "20250901",
        "DataEndDate": "20260828",
        "SnapshotTime": "2026-08-31T11:38:54+08:00",
        "ObservationCount": 241,
        "CoverageRatio": 1.0,
        "RequestedFundCount": 4,
        "AnalyzedFundCount": 4,
        "PortfolioMetrics": {
          "AnnualizedReturn": 0.060532,
          "AnnualizedVolatility": 0.221846,
          "MaximumDrawdown": 0.1719,
          "MaximumDrawdownStartDate": "20260506",
          "MaximumDrawdownEndDate": "20260724",
          "ValueAtRisk": 0.02324,
          "ConditionalValueAtRisk": 0.029015,
          "DiversificationRatio": 1.493706
        },
        "FundMetrics": [
          {
            "FundCode": "012729",
            "FundName": "国泰中证动漫游戏ETF联接C",
            "Weight": 0.3,
            "AnalysisStatus": "AVAILABLE",
            "ObservationCount": 241,
            "CoverageRatio": 1.0,
            "AnnualizedReturn": -0.2624,
            "AnnualizedVolatility": 0.312991,
            "MaximumDrawdown": 0.392717,
            "RiskContribution": 0.30582
          },
          {
            "FundCode": "290008",
            "FundName": "泰信发展主题混合",
            "Weight": 0.25,
            "AnalysisStatus": "AVAILABLE",
            "ObservationCount": 241,
            "CoverageRatio": 1.0,
            "AnnualizedReturn": 0.51947,
            "AnnualizedVolatility": 0.463274,
            "MaximumDrawdown": 0.455578,
            "RiskContribution": 0.375555
          },
          {
            "FundCode": "000001",
            "FundName": "华夏成长混合",
            "Weight": 0.25,
            "AnalysisStatus": "AVAILABLE",
            "ObservationCount": 241,
            "CoverageRatio": 1.0,
            "AnnualizedReturn": 0.267234,
            "AnnualizedVolatility": 0.362689,
            "MaximumDrawdown": 0.270036,
            "RiskContribution": 0.274353
          }
        ],
        "PairwiseDependencies": [
          {
            "FundCodeA": "012729",
            "FundCodeB": "290008",
            "Correlation": 0.224457,
            "DownsideCorrelation": -0.133313
          },
          {
            "FundCodeA": "012729",
            "FundCodeB": "000001",
            "Correlation": 0.360282,
            "DownsideCorrelation": 0.162133
          },
          {
            "FundCodeA": "012729",
            "FundCodeB": "110022",
            "Correlation": 0.352017,
            "DownsideCorrelation": 0.182233
          }
        ],
        "DataQuality": {
          "MinimumObservationCount": 200,
          "LatestDataAgeDays": 3,
          "Warnings": []
        },
        "NoDataReasons": [],
        "ComplianceNotice": "本 Demo 使用固定基金组合展示历史风险指标;结果仅供信息参考,不构成投资建议。",
        "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 无响应内容 请求成功但响应体为空,适用于无需返回数据的操作。
    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 及接口权限
    505 调用额度不足 请确认接口调用额度
    900 服务内部错误 请稍后重试;持续失败时可提供 RequestId 联系支持
    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: 如何完成第一次 API 调用?

      A: 先确认当前接口的请求方法、必填参数和成功状态,再使用对应产品的 AppKey 发起请求;以实际响应中的业务状态判断结果。 查看接入指南

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

      A: 在开发者中心的 APP KEY 管理页面复制对应产品的 AppKey,并保存在服务端环境变量或密钥管理服务中。不要写入网页、App 客户端、公开仓库或日志。

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

      A: Java、Python、Node.js、PHP、Go、C#、Swift、Kotlin 等支持 HTTP 请求的语言均可接入;也可以通过 OpenAPI、Postman 或 Apifox 查看和调试接口。

    • Q: 请求失败或超时后可以重试吗?

      A: 先区分 HTTP 状态与业务错误。参数、鉴权和权限错误应修正后再请求;超时并不表示服务端未执行,重试前需确认接口是否会重复计费或产生副作用。 查看接入指南

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

      A: 实际响应时间受接口类型、参数和网络环境影响。请按当前套餐的 QPS 控制并发,生产接入前完成联调与容量评估。

  • 服务协议与免责声明

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

  • 技术支持

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

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

    了解工程服务