소스 검색

fix:定期报告的AI解析功能(暂不支持份额变动和财务数据解析)

wangzaijun 1 일 전
부모
커밋
1758a6b8be

+ 48 - 2
mo-daq/src/main/java/com/smppw/modaq/application/components/ReportParseUtils.java

@@ -7,6 +7,7 @@ import com.smppw.modaq.common.conts.Constants;
 import com.smppw.modaq.common.enums.ReportParseStatus;
 import com.smppw.modaq.common.enums.ReportType;
 import com.smppw.modaq.common.exception.ReportParseException;
+import com.smppw.modaq.domain.dto.report.ReportAssetAllocationDTO;
 import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.io.RandomAccessReadBufferedFile;
 import org.apache.pdfbox.pdmodel.PDDocument;
@@ -159,6 +160,50 @@ public final class ReportParseUtils {
         ASSET_ALLOCATION_TYPE_MAPPER.put("其他融资总额", "基金负债情况");
     }
 
+    /**
+     * 构建基金资产配置信息
+     *
+     * @param fileId      文件id
+     * @param detail      资产类型(清理过特殊字符的字符串)
+     * @param mvAndRemark 市值或备注
+     * @param dtos        结果数据
+     */
+    public static void buildAssetAllocation(Integer fileId, String detail, String mvAndRemark, List<ReportAssetAllocationDTO> dtos) {
+        if (StrUtil.isBlank(mvAndRemark)) {
+            return;
+        }
+        // 资产大类
+        String assetType = ReportParseUtils.ASSET_ALLOCATION_TYPE_MAPPER.get(detail);
+        if (StrUtil.contains(mvAndRemark, "#")) {
+            // 有#表示有备注,而且可能有多个,多个用分号分隔的.
+            List<String> marketValueAndRemarks = StrUtil.split(mvAndRemark, ";");
+            for (String mr : marketValueAndRemarks) {
+                if (StrUtil.isBlank(mr)) {
+                    continue;
+                }
+                List<String> mrs = StrUtil.split(mr, "#");
+                ReportAssetAllocationDTO dto = new ReportAssetAllocationDTO(fileId);
+                dto.setAssetType(assetType);
+                dto.setAssetDetails(detail);
+                dto.setMarketValue(mrs.get(1));
+                dto.setRemark(mrs.get(0));
+                dtos.add(dto);
+            }
+        } else {
+            ReportAssetAllocationDTO dto = new ReportAssetAllocationDTO(fileId);
+            dto.setAssetType(assetType);
+            dto.setAssetDetails(detail);
+            dto.setMarketValue(mvAndRemark);
+            dtos.add(dto);
+        }
+    }
+
+    /**
+     * 数据清洗,替换圆括号,包含中文或英文的圆括号
+     *
+     * @param value /
+     * @return /
+     */
     public static String cleaningValue(Object value) {
         return cleaningValue(value, true);
     }
@@ -166,7 +211,8 @@ public final class ReportParseUtils {
     /**
      * 数据清洗,替换圆括号,包含中文或英文的圆括号
      *
-     * @param value /
+     * @param value     /
+     * @param replaceEn /
      * @return /
      */
     public static String cleaningValue(Object value, boolean replaceEn) {
@@ -268,7 +314,7 @@ public final class ReportParseUtils {
             return null;
         }
         // 编译正则表达式模式
-        Pattern pat1 = Pattern.compile("(2\\d{3}).*([一二三四1234])季");  // 2023年XXX3季度
+        Pattern pat1 = Pattern.compile("(2\\d{3}).*([一二三四1234])季");  // 2023年XXX3季(\报)
         Pattern pat2 = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");  // 2023-12-31
         Pattern pat3 = Pattern.compile("(2\\d{3})年年度");  // 2023年年度
         Pattern pat4 = Pattern.compile("(\\d{4})年(\\d{1,2})月");  // 2023年12月

+ 1 - 26
mo-daq/src/main/java/com/smppw/modaq/application/components/report/parser/ai/AIAnnuallyReportParser.java

@@ -1,38 +1,13 @@
 package com.smppw.modaq.application.components.report.parser.ai;
 
 import com.smppw.modaq.application.components.report.parser.ReportParserConstant;
-import com.smppw.modaq.common.exception.ReportParseException;
 import com.smppw.modaq.domain.dto.report.AnnuallyReportData;
-import com.smppw.modaq.domain.dto.report.ReportBaseInfoDTO;
-import com.smppw.modaq.domain.dto.report.ReportFundInfoDTO;
-import com.smppw.modaq.domain.dto.report.ReportParserParams;
 import com.smppw.modaq.domain.mapper.EmailFieldMappingMapper;
 import org.springframework.stereotype.Component;
 
 @Component(ReportParserConstant.PARSER_AI_ANNUALLY)
-public class AIAnnuallyReportParser extends AbstractAIReportParser<AnnuallyReportData> {
+public class AIAnnuallyReportParser extends AIQuarterlyReportParser<AnnuallyReportData> {
     public AIAnnuallyReportParser(EmailFieldMappingMapper fieldMappingMapper) {
         super(fieldMappingMapper);
     }
-
-    @Override
-    protected boolean isSupportAIParse() {
-        return false;
-    }
-
-    @Override
-    protected String prompt() {
-        return "";
-    }
-
-    @Override
-    protected AnnuallyReportData parseExtInfoAndSetData(ReportBaseInfoDTO reportInfo,
-                                                        ReportFundInfoDTO fundInfo) throws ReportParseException {
-        return null;
-    }
-
-    @Override
-    protected ReportFundInfoDTO buildFundInfo(ReportParserParams params) {
-        return null;
-    }
 }

+ 102 - 15
mo-daq/src/main/java/com/smppw/modaq/application/components/report/parser/ai/AIQuarterlyReportParser.java

@@ -1,57 +1,144 @@
 package com.smppw.modaq.application.components.report.parser.ai;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import com.smppw.modaq.application.components.ReportParseUtils;
 import com.smppw.modaq.application.components.report.parser.ReportParserConstant;
 import com.smppw.modaq.common.enums.ReportParseStatus;
 import com.smppw.modaq.common.exception.ReportParseException;
-import com.smppw.modaq.domain.dto.report.QuarterlyReportData;
-import com.smppw.modaq.domain.dto.report.ReportBaseInfoDTO;
-import com.smppw.modaq.domain.dto.report.ReportFundInfoDTO;
-import com.smppw.modaq.domain.dto.report.ReportParserParams;
+import com.smppw.modaq.domain.dto.report.*;
 import com.smppw.modaq.domain.mapper.EmailFieldMappingMapper;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
 import java.util.Map;
 
 @Component(ReportParserConstant.PARSER_AI_QUARTERLY)
-public class AIQuarterlyReportParser extends AbstractAIReportParser<QuarterlyReportData> {
+public class AIQuarterlyReportParser<T extends QuarterlyReportData> extends AbstractAIReportParser<T> {
     public AIQuarterlyReportParser(EmailFieldMappingMapper fieldMappingMapper) {
         super(fieldMappingMapper);
     }
 
     @Override
     protected boolean isSupportAIParse() {
-        return false;
+        return true;
     }
 
     @Override
     protected String prompt() {
         return """
-                识别文件中的基金基本情况、主要财务指标、投资组合情况、基金份额变动情况,
-                主要财务指标可能包含分级基金数据,投资组合情况包含期末基金资产组合情况、报告期末按行业分类的股票投资组合,
-                要求解析结果的中文符号转英文符号,结果用json返回
+                识别文件中的基金基本情况、投资组合情况,
+                投资组合情况包含期末基金资产组合情况、报告期末按行业分类的股票投资组合,
+                报告期末按行业分类的股票投资组合又包含报告期末按行业分类的境内股票投资组合、报告期末按行业分类的港股通投资股票投资组合,
+                要求准确识别金额等小数的位数,结果用json返回
                 """;
     }
 
     @Override
-    protected QuarterlyReportData parseExtInfoAndSetData(ReportBaseInfoDTO reportInfo,
-                                                         ReportFundInfoDTO fundInfo) throws ReportParseException {
+    @SuppressWarnings("unchecked")
+    protected T parseExtInfoAndSetData(ReportBaseInfoDTO reportInfo,
+                                       ReportFundInfoDTO fundInfo) throws ReportParseException {
         QuarterlyReportData reportData = new QuarterlyReportData(reportInfo, fundInfo);
-        reportData.setAssetAllocation(null);
+        // 这俩有分级基金,先不解析
         reportData.setShareChange(null);
         reportData.setFinancialIndicators(null);
-        reportData.setInvestmentIndustry(null);
-        return reportData;
+        // 资产配置组合
+        Integer fileId = reportInfo.getFileId();
+        String reportName = reportInfo.getReportName();
+        Object assetInfo = this.allInfoMap.get("投资组合情况");
+        if (assetInfo == null) {
+            throw new ReportParseException(ReportParseStatus.PARSE_ASSET_INFO_FAIL, reportName);
+        }
+        Map<String, Object> assetInfoMap = (Map<String, Object>) assetInfo;
+        reportData.setAssetAllocation(this.buildAssetAllocationInfo(fileId, reportName, assetInfoMap));
+        reportData.setInvestmentIndustry(this.buildInvestmentIndustryInfo(fileId, reportName, assetInfoMap));
+        @SuppressWarnings("unchecked")
+        T t = (T) reportData;
+        return t;
     }
 
     @Override
     @SuppressWarnings("unchecked")
     protected ReportFundInfoDTO buildFundInfo(ReportParserParams params) {
         // 获取并移除基金基本情况信息
-        Object fundInfo = this.allInfoMap.remove("基金基本情况");
+        Object fundInfo = this.allInfoMap.get("基金基本情况");
         if (fundInfo == null) {
             throw new ReportParseException(ReportParseStatus.PARSE_FUND_INFO_FAIL, params.getFilename());
         }
         Map<String, Object> fundInfoMap = (Map<String, Object>) fundInfo;
         return this.buildDto(params.getFileId(), ReportFundInfoDTO.class, fundInfoMap);
     }
+
+    @SuppressWarnings("unchecked")
+    private List<ReportAssetAllocationDTO> buildAssetAllocationInfo(Integer fileId, String reportName,
+                                                                    Map<String, Object> assetInfoMap) {
+        Object allocationInfo = assetInfoMap.get("期末基金资产组合情况");
+        if (allocationInfo == null) {
+            throw new ReportParseException(ReportParseStatus.PARSE_ASSET_INFO_FAIL, reportName);
+        }
+        List<Map<String, Object>> allocationList = ListUtil.list(false);
+        try {
+            allocationList = (List<Map<String, Object>>) allocationInfo;
+        } catch (Exception ignored) {
+        }
+
+        List<ReportAssetAllocationDTO> dtos = ListUtil.list(false);
+        for (Map<String, Object> allocation : allocationList) {
+            String detail = ReportParseUtils.cleaningValue(allocation.get("项目"));
+            if (!ReportParseUtils.ASSET_ALLOCATION_TYPE_MAPPER.containsKey(detail)) {
+                continue;
+            }
+            String marketValueAndRemark = ReportParseUtils.cleaningValue(allocation.get("金额"), false);
+            // 大类
+            ReportParseUtils.buildAssetAllocation(fileId, detail, marketValueAndRemark, dtos);
+        }
+        return dtos;
+    }
+
+    @SuppressWarnings("unchecked")
+    private List<ReportInvestmentIndustryDTO> buildInvestmentIndustryInfo(Integer fileId, String reportName,
+                                                                          Map<String, Object> assetInfoMap) {
+        Object industryInfo = assetInfoMap.get("报告期末按行业分类的股票投资组合");
+        if (industryInfo == null) {
+            throw new ReportParseException(ReportParseStatus.PARSE_INDUSTRY_INFO_FAIL, reportName);
+        }
+        Map<String, Object> industryMap = MapUtil.empty();
+        try {
+            industryMap = (Map<String, Object>) industryInfo;
+        } catch (Exception ignored) {
+        }
+        List<ReportInvestmentIndustryDTO> dtos = ListUtil.list(false);
+        this.buildIndustryInfo(fileId, 1, industryMap, dtos);
+        this.buildIndustryInfo(fileId, 2, industryMap, dtos);
+        return dtos;
+    }
+
+    @SuppressWarnings("unchecked")
+    private void buildIndustryInfo(Integer fileId, Integer industryType,
+                                   Map<String, Object> industryMap,
+                                   List<ReportInvestmentIndustryDTO> dtos) {
+        String industryKey = industryType == 1 ? "报告期末按行业分类的境内股票投资组合" : "报告期末按行业分类的港股通投资股票投资组合";
+        List<Map<String, Object>> industryList = ListUtil.list(false);
+        try {
+            industryList = (List<Map<String, Object>>) industryMap.get(industryKey);
+        } catch (Exception ignored) {
+        }
+        if (CollUtil.isEmpty(industryList)) {
+            return;
+        }
+        for (Map<String, Object> industry : industryList) {
+            String industryName = ReportParseUtils.cleaningValue(industry.get("行业类别"));
+            if (StrUtil.isBlank(industryName) || !ReportParseUtils.INDUSTRY_COLUMN_NAMES.contains(industryName)) {
+                continue;
+            }
+            ReportInvestmentIndustryDTO dto = new ReportInvestmentIndustryDTO(fileId);
+            dto.setInvestType(industryType);
+            dto.setIndustryName(industryName);
+            dto.setMarketValue(ReportParseUtils.cleaningValue(industry.get("公允价值")));
+            dto.setRatio(ReportParseUtils.cleaningValue(industry.get("占基金资产净值比例(%)")));
+            dtos.add(dto);
+        }
+    }
 }

+ 1 - 23
mo-daq/src/main/java/com/smppw/modaq/application/components/report/parser/pdf/PDQuarterlyReportParser.java

@@ -241,29 +241,7 @@ public class PDQuarterlyReportParser<T extends QuarterlyReportData> extends Abst
                     continue;
                 }
                 // 大类
-                String assetType = ReportParseUtils.ASSET_ALLOCATION_TYPE_MAPPER.get(detail);
-                if (StrUtil.contains(marketValueAndRemark, "#")) {
-                    // 有#表示有备注,而且可能有多个,多个用分号分隔的.
-                    List<String> marketValueAndRemarks = StrUtil.split(marketValueAndRemark, ";");
-                    for (String mr : marketValueAndRemarks) {
-                        if (StrUtil.isBlank(mr)) {
-                            continue;
-                        }
-                        List<String> mrs = StrUtil.split(mr, "#");
-                        ReportAssetAllocationDTO dto = new ReportAssetAllocationDTO(fileId);
-                        dto.setAssetType(assetType);
-                        dto.setAssetDetails(detail);
-                        dto.setMarketValue(mrs.get(1));
-                        dto.setRemark(mrs.get(0));
-                        dtos.add(dto);
-                    }
-                } else {
-                    ReportAssetAllocationDTO dto = new ReportAssetAllocationDTO(fileId);
-                    dto.setAssetType(assetType);
-                    dto.setAssetDetails(detail);
-                    dto.setMarketValue(marketValueAndRemark);
-                    dtos.add(dto);
-                }
+                ReportParseUtils.buildAssetAllocation(fileId, detail, marketValueAndRemark, dtos);
             }
         }
         return dtos;

+ 4 - 4
mo-daq/src/test/java/com/smppw/modaq/MoDaqApplicationTests.java

@@ -37,15 +37,15 @@ public class MoDaqApplicationTests {
 
     @Test
     public void reportTest() {
-        MailboxInfoDTO emailInfoDTO = this.buildMailbox("wangzaijun@simuwang.com", "*");
-        Date startDate = DateUtil.parse("2025-04-30 15:20:00", DateConst.YYYY_MM_DD_HH_MM_SS);
-        Date endDate = DateUtil.parse("2025-04-30 19:42:05", DateConst.YYYY_MM_DD_HH_MM_SS);
+        MailboxInfoDTO emailInfoDTO = this.buildMailbox("**@simuwang.com", "**");
+        Date startDate = DateUtil.parse("2025-05-07 10:20:00", DateConst.YYYY_MM_DD_HH_MM_SS);
+        Date endDate = DateUtil.parse("2025-05-07 19:42:05", DateConst.YYYY_MM_DD_HH_MM_SS);
         try {
             List<String> folderNames = ListUtil.list(false);
 //            folderNames.add("其他文件夹/报告公告");
             folderNames.add("INBOX");
             emailParseService.parseEmail(emailInfoDTO, startDate, endDate,
-                    folderNames, ListUtil.of(EmailTypeConst.REPORT_LETTER_EMAIL_TYPE));
+                    folderNames, EmailTypeConst.REPORT_EMAIL_TYPES);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }

+ 0 - 372
季报-无分级基金.json

@@ -1,372 +0,0 @@
-{
-  "基金基本情况": {
-    "基金名称": "亘曦财富5号私募证券投资基金",
-    "基金编码": "STA259",
-    "基金管理人": "上海亘曦私募基金管理有限公司",
-    "基金托管人": "国泰君安证券股份有限公司",
-    "投资顾问": "",
-    "基金运作方式": "开放式",
-    "基金成立日期": "2021年11月02日",
-    "期末基金总份额": 206.009022,
-    "投资目标": "本基金在深入研究的基础上构建投资组合,在严格控制投资风险的前提下,力求获得长期稳定的投资回报。",
-    "投资策略": "本基金将根据宏观经济分析和整体市场估值水平的变化自上而下地进行资产配置,在降低市场风险的同时追求更高收益。以上内容为私募基金管理人对于本基金全部或部分投资品种相应投资策略的阐述,不构成对于本基金投资范围、投资比例及限制或其他投资风控指标的补充。",
-    "业绩比较基准": "",
-    "风险收益特征": "本基金属于[R4]风险投资品种,适合风险识别、评估、承受能力[C4]及以上的普通合格投资者和专业投资者。"
-  },
-  "基金净值表现": {
-    "当季": {
-      "净值增长率": 0.39,
-      "净值增长率标准差": null,
-      "业绩比较基准收益率": null,
-      "业绩比较基准收益率标准差": null
-    },
-    "自基金合同生效起至今": {
-      "净值增长率": -28.12,
-      "净值增长率标准差": null,
-      "业绩比较基准收益率": null,
-      "业绩比较基准收益率标准差": null
-    }
-  },
-  "主要财务指标": {
-    "本期已实现收益": 11647.52,
-    "本期利润": 15125.97,
-    "期末基金净资产": 1480854.87,
-    "报告期期末单位净值": 0.7188
-  },
-  "投资组合情况": {
-    "期末基金资产组合情况": [
-      {
-        "项目": "银行存款",
-        "金额": 150679.97
-      },
-      {
-        "项目": "股权投资",
-        "金额": 0.00
-      },
-      {
-        "项目": "其中:优先股",
-        "金额": 0.00
-      },
-      {
-        "项目": "其他股权类投资",
-        "金额": null
-      },
-      {
-        "项目": "上市公司定向增发股票投资",
-        "金额": 0.00
-      },
-      {
-        "项目": "新三板挂牌企业投资",
-        "金额": 0.00
-      },
-      {
-        "项目": "结算备付金",
-        "金额": 0.00
-      },
-      {
-        "项目": "存出保证金",
-        "金额": 0.00
-      },
-      {
-        "项目": "股票投资",
-        "金额": 0.00
-      },
-      {
-        "项目": "债券投资",
-        "金额": 0.00
-      },
-      {
-        "项目": "其中:银行间市场债券",
-        "金额": 0.00
-      },
-      {
-        "项目": "其中:利率债",
-        "金额": 0.00
-      },
-      {
-        "项目": "其中:信用债",
-        "金额": 0.00
-      },
-      {
-        "项目": "资产支持证券",
-        "金额": 0.00
-      },
-      {
-        "项目": "基金投资(公募基金)",
-        "金额": 1167123.67
-      },
-      {
-        "项目": "其中:货币基金",
-        "金额": 1167123.67
-      },
-      {
-        "项目": "期货及衍生品交易保证金",
-        "金额": 0.00
-      },
-      {
-        "项目": "买入返售金融资产",
-        "金额": 0.00
-      },
-      {
-        "项目": "其他证券类标的",
-        "金额": null
-      },
-      {
-        "项目": "商业银行理财产品投资",
-        "金额": null
-      },
-      {
-        "项目": "信托计划投资",
-        "金额": null
-      },
-      {
-        "项目": "基金公司及其子公司资产管理计划投资",
-        "金额": null
-      },
-      {
-        "项目": "保险资产管理计划投资",
-        "金额": null
-      },
-      {
-        "项目": "证券公司及其子公司资产管理计划投资",
-        "金额": null
-      },
-      {
-        "项目": "期货公司及其子公司资产管理计划投资",
-        "金额": null
-      },
-      {
-        "项目": "私募基金产品投资",
-        "金额": 168395.68
-      },
-      {
-        "项目": "未在协会备案的合伙企业份额",
-        "金额": null
-      },
-      {
-        "项目": "另类投资",
-        "金额": 0.00
-      },
-      {
-        "项目": "银行委托贷款规模",
-        "金额": null
-      },
-      {
-        "项目": "信托贷款",
-        "金额": null
-      },
-      {
-        "项目": "应收账款投资",
-        "金额": null
-      },
-      {
-        "项目": "各类受(收)益权投资",
-        "金额": null
-      },
-      {
-        "项目": "票据(承兑汇票等)投资",
-        "金额": null
-      },
-      {
-        "项目": "其他债权投资",
-        "金额": null
-      },
-      {
-        "项目": "境外投资",
-        "金额": 0.00
-      },
-      {
-        "项目": "其他资产",
-        "金额": null
-      },
-      {
-        "项目": "债券回购总额",
-        "金额": 0.00
-      },
-      {
-        "项目": "融资、融券总额",
-        "金额": 0.00
-      },
-      {
-        "项目": "其中:融券总额",
-        "金额": 0.00
-      },
-      {
-        "项目": "银行借款总额",
-        "金额": 0.00
-      },
-      {
-        "项目": "其他融资总额",
-        "金额": null
-      }
-    ],
-    "报告期末按行业分类的股票投资组合": {
-      "境内股票投资组合": [
-        {
-          "行业类别": "农、林、牧、渔业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "采矿业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "制造业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "电力、热力、燃气及水生产和供应业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "建筑业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "批发和零售业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "交通运输、仓储和邮政业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "住宿和餐饮业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "信息传输、软件和信息技术服务业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "金融业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "房地产业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "租赁和商务服务业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "科学研究和技术服务业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "水利、环境和公共设施管理业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "居民服务、修理和其他服务业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "教育",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "卫生和社会工作",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "文化、体育和娱乐业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "综合",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        }
-      ],
-      "港股通投资股票投资组合": [
-        {
-          "行业类别": "基础材料",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "消费者非必需品",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "消费者常用品",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "能源",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "金融",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "医疗保健",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "工业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "信息技术",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "电信服务",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "公用事业",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "房地产",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        },
-        {
-          "行业类别": "合计",
-          "公允价值": 0.00,
-          "占基金资产净值比例": 0.00
-        }
-      ]
-    }
-  },
-  "基金份额变动情况": {
-    "报告期期初基金份额总额": 310.371368,
-    "报告期期间基金总申购份额": 0.000000,
-    "减:报告期期间基金总赎回份额": 104.362346,
-    "报告期期间基金拆分变动份额": 0.000000,
-    "期末基金总份额": 206.009022
-  }
-}

+ 0 - 0
季报-有分级基金.json


+ 0 - 67
年报.json

@@ -1,67 +0,0 @@
-```json
-{
-"基金基本情况": {
-"基金名称": "奇盛领航私募证券投资基金",
-"基金编码": "SNJ798",
-"基金运作方式": "开放式",
-"基金成立日期": "2020年12月10日",
-"基金管理人": "深圳奇盛基金管理有限公司",
-"基金托管人": "中信证券股份有限公司",
-"期末基金总份额(万份)": 5877.552724,
-"基金到期日期": "2035年12月9日"
-},
-"主要财务指标": [
-{
-"年份": "2024年",
-"本期已实现收益": 259297.13,
-"本期利润": 1128208.88,
-"期末可供分配利润": -1919612.46,
-"期末可供分配基金份额利润": -0.033,
-"期末基金净资产": 89897594.42,
-"报告期期末单位净值": 1.530,
-"基金份额累计净值增长率(%)": 61
-},
-{
-"年份": "2023年",
-"本期已实现收益": -27237.23,
-"本期利润": 7149221.85,
-"期末可供分配利润": -2382834.44,
-"期末可供分配基金份额利润": -0.039,
-"期末基金净资产": 93078807.17,
-"报告期期末单位净值": 1.509,
-"基金份额累计净值增长率(%)": 58.9
-},
-{
-"年份": "2022年",
-"本期已实现收益": -3673772.14,
-"本期利润": 120034.28,
-"期末可供分配利润": -2221501.89,
-"期末可供分配基金份额利润": -0.039,
-"期末基金净资产": 77454185.82,
-"报告期期末单位净值": 1.368,
-"基金份额累计净值增长率(%)": 44.8
-}
-],
-"投资组合情况": {
-"期末基金资产组合情况": {
-"现金类资产": {
-"银行存款": 2953.99
-},
-"私募基金产品投资": {
-"SNG851#": 90024143.72
-},
-"其他资产": 0
-},
-"报告期末按行业分类的股票投资组合": {
-"合计": 0.00
-}
-},
-"基金份额变动情况": {
-"报告期期初基金份额总额": 6169.34159,
-"报告期期间基金总申购份额": 10.141988,
-"报告期期间基金总赎回份额": 301.930854,
-"报告期期间基金拆分变动份额": 0,
-"期末基金总份额(万份)": 5877.552724
-}
-}
-```