如何检查除权因子是否覆盖全部研究标的和日期?从覆盖率到缺口清单的 Python 实践

Pandas入门教程(二十二):股票数据分析实战——yfinance 获取数据、技术指标与收益率分析 把 Pandas 用在真实场景,才能体会它的价值。本文以茅台股票为例,用 yfinance 获取历史行情,完成缺失值处理与列筛选,绘制收盘价曲线,计算 SMA 移动平均线与 RSI 相对强弱指数,并通过日收益率、累计收益率和波动率完成完整的量化分析流程。 阅读详情

一句话回答

检查除权因子数据是否满足量化研究需求,不能只看数据表是否为空,而要确认研究标的、交易日期和公司行动调整记录是否匹配。通常需要建立“标的 × 日期”的预期数据集合,再根据因子数据的发布规则计算覆盖率、定位缺口并验证因子有效性。QuantDash Python SDK 可以用于获取历史 K 线和辅助构建交易日期基准,具体除权因子的完整性仍需研究系统自行验证。

为什么会有这个问题 / 传统做法有什么问题?

量化回测使用复权价格时,经常会遇到一个容易被忽略的问题:行情数据看起来很完整,但复权过程中使用的除权因子未必完整。

假设一个研究任务需要分析 100 只股票过去三年的日线数据。

研究系统准备了两类数据:

  • 历史行情:记录每天的开盘价、收盘价等。
  • 除权因子:记录公司行动引起的价格调整关系,用于构建复权价格。

如果某只股票在研究期间发生现金分红、送股或配股等事件,相关调整信息可能影响历史价格序列。

这里需要先区分三个概念。

原始价格是未经复权调整的历史行情价格。

除权因子是用于建立价格调整关系的数据,其具体定义取决于数据供应方的复权算法。

复权价格则是按照选定复权方向、基准日期和调整规则计算出来的价格序列。

复权价格不等于真实成交价格,复权价格收益率也不能直接代表包含现金分红、持仓数量变化、交易费用和税费的完整持仓收益。

对于除权因子的覆盖检查,最容易出现的错误是将所有交易日期都当成必须具有独立因子记录的日期。

实际上,常见的数据组织方式至少有两种:

数据组织方式检查重点
每个交易日都有因子值检查标的和交易日期是否完整
仅在因子变化时记录检查事件记录、有效区间和历史状态是否完整

假设某只股票在一个研究区间内有 200 个交易日,但其因子数据仅在少数公司行动日期发生变化。

如果供应方采用事件式记录,不能因为只有少量记录,就判断剩余日期全部缺失。

反过来,如果供应方明确承诺提供逐日因子,只有少量记录就可能意味着严重缺口。

因此,真正需要回答的问题不是“因子记录有多少条”,而是:

按照当前数据源的定义,研究期间每一个需要复权处理的交易日期,是否都能获得有效的调整状态?

传统做法通常是查询因子表最早和最晚的日期,再检查总行数。

这种方法有三个局限。

首先,最早日期和最晚日期完整,不代表中间没有断档。

其次,数据总量正常,不代表每只股票的数据都完整。某个标的缺失的数据,可能被其他标的的重复记录掩盖。

最后,记录存在不代表数值有效。空值、异常因子和重复冲突记录同样可能影响复权计算。

更可靠的方法是先建立统一的行情接入基准,再根据因子数据组织方式实施覆盖审计。

分步骤解决:使用 QuantDash 进行实践

第 1 步:安装 SDK 并初始化客户端

先安装 QuantDash Python SDK:

# 在终端执行
# pip install quantdash

随后通过环境变量配置 API Key:

import os
from quantdash import QuantDash

api_key = os.getenv("QUANTDASH_API_KEY")

if not api_key:
    raise RuntimeError(
        "请先设置 QUANTDASH_API_KEY 环境变量"
    )

try:
    qd = QuantDash(api_key=api_key)
except Exception as exc:
    raise RuntimeError(
        "QuantDash 客户端初始化失败"
    ) from exc

实际运行时,需要先在运行环境中设置 QUANTDASH_API_KEY。

建议将认证信息交给环境变量或专门的密钥管理系统,而不是直接写入研究脚本。

第 2 步:获取研究标的对应的历史行情

先从两只 A 股开始,建立研究日期基准。

这里使用 qd.klines.get() 获取不复权日 K 线。

选择 adjust=“none” 的原因是:覆盖审计需要尽可能独立于待验证的复权结果。直接使用复权后的价格判断因子是否完整,容易产生循环验证的问题。

import pandas as pd

symbols = ["600519.SH", "000001.SZ"]

def fetch_daily_klines(qd, symbol):
    try:
        df = qd.klines.get(
            symbol,
            period="1d",
            count=250,
            adjust="none",
            to_dataframe=True,
        )
    except Exception as exc:
        raise RuntimeError(
            f"{symbol} 历史行情获取失败"
        ) from exc

    if df is None or df.empty:
        raise ValueError(
            f"{symbol} 没有返回日线数据"
        )

    if not isinstance(df, pd.DataFrame):
        raise TypeError(
            f"{symbol} 返回结果不是 DataFrame"
        )

    return df.copy()


market_data = {
    symbol: fetch_daily_klines(qd, symbol)
    for symbol in symbols
}

for symbol, frame in market_data.items():
    print(symbol, "记录数:", len(frame))
    print("返回字段:", frame.columns.tolist())

这里的 count=250 用于演示获取一定数量的历史日线,并不意味着接口一定返回 250 个有效交易日。

如果实际研究需要严格的起止日期,应根据 SDK 文档使用 start_time 和 end_time,并验证返回范围是否与研究窗口一致。

另外,代码暂时不假设日期字段一定叫 trade_date 或 datetime。

不同数据接口可能采用不同的时间字段或索引结构,应先检查实际返回结果。

第 3 步:建立标的与交易日期覆盖矩阵

获取行情后,可以将研究日期统一转换为规范格式。

下面将“行情日期字段”和“除权因子日期字段”作为显式配置,避免把未经确认的 SDK 返回字段名称写死。

本步骤中的因子数据来自研究系统已有的数据表,而不是声称 QuantDash 提供了独立的除权因子接口。

假设研究系统已经将逐日因子整理为以下标准结构:

  • symbol:标的代码。
  • trade_date:交易日期。
  • adj_factor:与指定复权规则对应的因子值。

这些是示例中的内部标准字段,并非 QuantDash API 返回字段声明。

import pandas as pd

def normalize_dates(frame, date_column):
    if date_column not in frame.columns:
        raise KeyError(
            f"缺少日期字段: {date_column}"
        )

    dates = pd.to_datetime(
        frame[date_column],
        errors="raise",
    )

    if dates.isna().any():
        raise ValueError("日期存在空值")

    if dates.dt.tz is not None:
        raise ValueError(
            "请先统一时区,再提取交易日期"
        )

    return dates.dt.normalize()


def build_expected_dates(
    market_data,
    date_columns,
):
    records = []

    for symbol, frame in market_data.items():
        dates = normalize_dates(
            frame,
            date_columns[symbol],
        )

        for date in dates.drop_duplicates():
            records.append({
                "symbol": symbol,
                "trade_date": date,
            })

    return pd.DataFrame(records).drop_duplicates()


# 根据第 2 步实际打印的返回字段进行配置。
# 下方列名仅为研究数据已经标准化后的示例。
date_columns = {
    "600519.SH": "trade_date",
    "000001.SZ": "trade_date",
}

for symbol, column in date_columns.items():
    if column not in market_data[symbol].columns:
        raise KeyError(
            f"{symbol} 未找到 {column},"
            "请根据实际返回结构调整映射"
        )

expected_dates = build_expected_dates(
    market_data,
    date_columns,
)

# factor_df 应由研究系统的因子存储层读取,
# 并整理为 symbol、trade_date、adj_factor 三列。
# 这里不虚构除权因子 SDK 接口或因子样本值。
required = {
    "symbol",
    "trade_date",
    "adj_factor",
}

if "factor_df" not in globals():
    raise RuntimeError(
        "请先加载并标准化逐日因子数据 factor_df"
    )

if not isinstance(factor_df, pd.DataFrame):
    raise TypeError("factor_df 必须是 DataFrame")

missing = required - set(factor_df.columns)

if missing:
    raise KeyError(f"因子数据缺少字段: {missing}")

factor_df = factor_df.copy()
factor_df["trade_date"] = normalize_dates(
    factor_df,
    "trade_date",
)

factor_df["adj_factor"] = pd.to_numeric(
    factor_df["adj_factor"],
    errors="coerce",
)

duplicates = factor_df.duplicated(
    ["symbol", "trade_date"],
    keep=False,
)

if duplicates.any():
    raise ValueError(
        "因子数据存在重复的标的与交易日期组合"
    )

audit = expected_dates.merge(
    factor_df[
        ["symbol", "trade_date", "adj_factor"]
    ],
    on=["symbol", "trade_date"],
    how="left",
    indicator=True,
    validate="one_to_one",
)

audit["factor_valid"] = (
    audit["_merge"].eq("both")
    & audit["adj_factor"].notna()
    & audit["adj_factor"].gt(0)
)

coverage = (
    audit.groupby("symbol")["factor_valid"]
    .agg(["sum", "count"])
)

coverage["coverage_rate"] = (
    coverage["sum"] / coverage["count"]
)

print(coverage)

这里定义的覆盖率为:

[
覆盖率=\frac{有效因子覆盖的预期交易日数量}{预期交易日总数量}
]

需要注意,这个公式只适用于已确认采用逐日因子数据组织方式的情况。

对于事件式因子,不能简单用原始事件记录数量作为分子,而应先按照供应方规则还原有效因子状态,再检查日期覆盖。

代码中的正值检查也建立在“因子采用正数乘法系数”的前提下。如果实际数据是加法调整值或其他定义,就需要调整验证规则。

第 4 步:生成缺失清单并定位覆盖问题

有了覆盖矩阵,还需要把检查结果转化为能够处理的异常清单。

单纯输出一个覆盖率,通常不足以指导后续数据补齐。

例如,研究人员需要知道:

  • 哪只股票存在问题。
  • 哪个交易日期无法获得有效因子。
  • 是整条记录缺失,还是因子值异常。

下面继续使用第 3 步生成的 audit 数据。

import numpy as np

def build_factor_issue_report(audit):
    required = {
        "symbol",
        "trade_date",
        "adj_factor",
        "_merge",
        "factor_valid",
    }

    missing = required - set(audit.columns)

    if missing:
        raise KeyError(
            f"审计数据缺少字段: {missing}"
        )

    issues = audit.loc[
        ~audit["factor_valid"]
    ].copy()

    if issues.empty:
        return issues.assign(
            issue_type=pd.Series(dtype="object")
        )

    conditions = [
        issues["_merge"].eq("left_only"),
        issues["adj_factor"].isna(),
        issues["adj_factor"].le(0),
    ]

    labels = [
        "因子记录缺失",
        "因子值为空或无法解析",
        "因子值非正数",
    ]

    issues["issue_type"] = np.select(
        conditions,
        labels,
        default="其他异常",
    )

    return issues[
        ["symbol", "trade_date", "issue_type"]
    ].sort_values(
        ["symbol", "trade_date"]
    )


issue_report = build_factor_issue_report(audit)

print("异常记录数量:", len(issue_report))
print(issue_report.head(20))

# 输出供后续排查使用的异常文件
issue_report.to_csv(
    "factor_coverage_issues.csv",
    index=False,
    encoding="utf-8-sig",
)

生成的文件可以交给数据补齐流程使用。

但这里有一个重要工程边界:缺失检测不等于自动修复。

对于确实缺失的因子数据,应该回到原始公司行动记录或可信数据源进行核实,而不是直接填入 1。

如果数据源采用事件式记录,还需要额外确认因子的起始有效状态、变更日期和因子定义。只有这些信息足够明确,才能将事件记录映射到连续交易日期。

另外,日 K 线日期只能作为“实际获取到的行情日期集合”。如果研究任务要求覆盖全部应交易日期,还应结合正式交易日历、上市退市状态和停牌规则检查行情本身的缺口。

关键坑与注意事项

  • 不要混淆逐日因子与事件式因子。 逐日因子适合直接做日期覆盖检查;事件式因子应先验证事件链和有效区间,不能把没有事件的日期直接判定为缺失。
  • 不要把行情存在视为因子完整。 原始 K 线和公司行动调整信息属于不同的数据维度,行情记录完整并不能证明复权调整状态完整。
  • 不要忽略批量请求中的部分失败。 批量获取多只股票时,应逐只检查返回结果和日期范围,避免因部分标的缺失而低估研究数据规模。
  • 统一交易日期与时区。 毫秒时间戳、带时区时间和本地日期需要按市场交易日规则转换,不能直接截取任意时区下的日期进行连接。
  • 因子数值有效不代表复权规则正确。 不同复权基准、乘法或加法规则不能直接混用;数值检查必须服从数据源定义。
  • 历史数据可能修订。 对因子数据保留获取时间、来源版本和数据摘要,避免同一研究窗口在不同时间得到无法解释的回测差异。
  • 警惕历史信息可得性。 如果在历史时点进行策略模拟,应区分当时已知的公司行动信息与事后修订的因子,不能默认最新因子数据在过去每个时点都已可用。

常见问题(FAQ)

Q:除权因子覆盖率必须达到 100% 吗?

A:如果研究流程要求逐日因子完整,那么目标通常是所有适用交易日期都有有效值。但是否允许例外,要结合上市时间、停牌、数据源规则和研究范围判断。事件式因子不应直接套用逐日记录覆盖率。

Q:没有发生分红或送股的日期,需要因子记录吗?

A:取决于数据组织方式。逐日因子一般会提供当天适用的调整状态;事件式因子可能只在发生变化时保留记录。不能将没有事件记录理解为数据缺失。

Q:能否直接通过 QuantDash 获取独立的除权因子表?

A:本文使用已知的 qd.klines.get() 获取历史 K 线及指定复权方式的数据。独立除权因子接口未在本文给定的已确认 API 中,因此没有假设其存在。若需要原始因子表,应核对实际 SDK 文档或接入其他已授权的数据来源。

Q:为什么不能根据前复权价格反推出完整除权事件?

A:复权价格反映特定调整规则下的结果,但未必保留公司行动的全部细节。例如现金分红、送股和配股的具体条款可能无法通过价格序列唯一还原。需要审计公司行动时应保留原始事件数据。

Q:生产环境应该多久检查一次覆盖率?

A:可以按数据更新批次执行增量检查,并定期对关键研究窗口进行全量复核。检查频率取决于数据发布时间、历史修订机制和研究任务要求,而不是固定采用一个通用周期。

小结

检查除权因子数据的覆盖情况,核心不是统计因子表有多少行,而是判断研究所需标的与交易日期能否获得正确、有效、可追溯的复权调整状态。数据组织方式、交易日期基准和因子定义,都会影响最终审计结论。

在工程实现中,可以通过 QuantDash Python SDK 获取原始历史 K 线,为研究建立标准化的行情日期基准。因子表加载、覆盖矩阵计算、异常分类、历史版本管理和公司行动核对仍需要研究系统自行完成。将这些验证环节纳入数据准备流程,才能降低复权数据缺口对因子研究和策略回测可靠性的影响。

参考

QuantDash Python SDK 文档:https://docs.quantdash.net/zh-Hans/sdk/python-quickstart

如何处理动态语言(Python / JS)的“隐形”调用链? 本文揭示动态语言(Python/JS)中静态AST解析导致调用链“断链”的核心问题,提出通过运行时追踪补全图谱的解决方案。基于Code-Graph-RAG的cgr trace机制,分别利用pytest插件与V8 Profiler捕获真实调用路径,将动态边合并至静态图谱,并在权重体系中提升动态边优先级。实践表明,该方法可显著提升图谱覆盖率,实现“结构+行为”双视角理解代码,为MCP与Rerank系统提供可靠支持。 阅读详情

相关推荐

Win10环境下VS2019离线部署OnnxRuntime的完整指南

本文提供了在Windows 10系统下,为Visual Studio 2019进行OnnxRuntime离线部署的完整教程。针对网络受限环境,详细讲解了如何获取正确的离线安装包、配置本地NuGet源,并逐步指导项目配置与测试,确保AI模型在C++环境中顺利运行。

weixin_29205061的博客 400

个人开发者做 ETF 行情数据校验:标的池读取、缺失值检查与复现记录

以读取 CN_ETF 标的池、整理 ETF 行情为例,讲清个人开发者在取数之后必须补上的三层校验:标的池覆盖与分层抽样、按交易日的缺失矩阵、可重跑的复现记录,并给出可直接运行的 Pandas 检查代码与高频易错点。

quantdash_cc的博客 226

python毕设 基于Web的中药材信息查询系统程序+论文

***(程序+源码+数据库+调试部署+开发环境)论文文档1,文末可获取,系统界面在最后面。****

m0_74825541的博客 1257

AI量化项目数据源横评:AkShare、BaoStock、Tushare等免费API实测对比

在AI量化与股票预测项目中,数据层的稳定性往往决定模型成败。免费股票数据API看似便捷,实则藏有字段缺失、格式不一、接口失效等深坑。理解数据结构与复权原理是构建可靠数据管道的基础,而合理选择数据源则直接影响特征工程、回测与实盘表现。AkShare以接口丰富著称,却需应对爬虫库的更新波动;BaoStock提供稳定历史行情,适合回测训练;Tushare数据规范但受积分限制;新浪与腾讯接口轻量快速,用于实时监控。不同数据源各有适用场景,工程上需通过适配器统一格式、重试降级、交易日历对齐等策略保障数据质量。本文实测

weixin_34341117的博客 285

汽车Bootloader流程

根据ISO14229-1 写的汽车行业 Bootloader流程 1:编程前 → 先读取软硬件版本号 22 F1 XX 软件信息 22 F1 XX 硬件信息 → 进入扩展会话extend diagnostic sessions 功能寻址 10 03 → 编程条件检测routine control:ECU升级条件的判断,如车速,检测车的型号 31 01 02 03 → 关闭DTC检测,(由于很多节点收不到其它节点的报文后会记录DTC故障)功能寻址 85 02 → 关闭诊断通讯(禁止各个节点的应用报...

weixin_41320142的博客 2831

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 405

ESP-IDF的安装及其在VScode中编译环境的搭建

从安装目录的\Espressif\frameworks\esp-idf-v5.3.2\examples路径中拷贝一个工程到项目中,比如拷贝\get-started下的hello_world文件夹。安装时可能会遇到如下问题,提示:"e:\ssc\software\ESP-IDF\v5.3.2\Espressif\tools\idf-python\3.11.2\python.exe -m pip" is not valid. (ERROR_INVALID_PIP)接着等待安装完成即可,其他步骤同方式1。

Freddy_Ssc的博客 4366

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 234

【手把手教学】YOLOv13的Dilated Reparam Block (DRB) 实现细节与优化技巧

DRB(Dilated Reparam Block)是一种创新的卷积神经网络模块,通过多分支膨胀卷积和结构重参数化技术显著提升模型性能。训练阶段使用不同膨胀率和卷积核大小的并行分支增强特征提取能力,推理阶段则将这些分支融合为单一高效的大核卷积。该方法成功解决了大核卷积的计算复杂度和训练困难等问题,在保持推理效率的同时,使模型准确率提升8.56%,mAP暴涨12.33%。DRB的核心在于训练时复杂、推理时简单的设计哲学,以及膨胀卷积的多尺度特征提取能力,为CNN性能优化提供了新的思路。

FJN110的博客 556

Matlab可调用MODTRAN5封装器之Mod5

MODTRAN 是一个计算地球大气中电磁辐射传输的软件代码。MODTRAN是通过使用具有严格格式的输入文本文件来控制的。这个文件被称为“tape5”,扩展名为.tp5或.ltn。手工创建或编辑这个文件是不方便的。Mod5提供了一组函数来简化MODTRAN用例的处理。这些方法包括将tape5文件格式读取到Mod5类“实例”或“对象”中,更改文件中描述的案例实例,将tape5格式写回文件,在案例上运行MODTRAN并将MODTRAN输出文件中的各种结果读取回Matlab。还有许多绘图方法可用。

qq_19512613的博客 3255

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 426

AUTOSAR内存篇 -内存驱动(Mem)

Mem驱动程序的task是基于底层内存设备技术的物理分段的低级内存访问。Mem驱动程序的API与内存设备技术无关,因此向存储器访问模块上层提供了与存储器设备无关的接口。所有高级功能(如跨段操作)都由内存访问模块处理,以尽可能降低Mem驱动器的复杂性和占用空间。Mem驱动API命名、类型定义和文件命名规则都遵循标准的AUTUSAR BSW模块实现。服务Mem_Init初始化Mem驱动的内部状态,并设置Mem驱动Job处理状态到MEM_JOB_OK。

IOT2017的博客 713

详解Python条件语句

在 Python 中,if...else 是一种条件语句,可以根据给定的条件执行不同的操作。这个语句通常用于控制程序的流程。

2601_96798737的博客 206

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Python3 协程:异步编程的核心机制与实战

协程是解决I/O密集型任务等待瓶颈的高效机制,相比线程更轻量、无锁开销。从yield到async/await的演进,使异步编程语义清晰、易于理解。通过async/await可实现并发执行多个任务(如gather、create_task),显著提升网络请求、爬虫等场景性能。关键在于使用异步库(如aiohttp)替代同步库,避免阻塞事件循环。合理控制超时与并发数,才能发挥协程最大优势。

Lxn2zh的博客 159

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 268

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

torch.compile 差异仅 1e-6,边界样本预测为何翻转

torch.compile 加速后输出与 eager 不一致,部分预测翻转。逐层对比与 graph break 分析定位到动态分支翻转根因。容差回归仅适用于无分支翻转场景,零容忍场景应禁用编译。

昨日种种,皆成今我。今日种种,皆成新我。 159

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 128

【Python】国家中小学智慧教育平台电子教材批量下载与 PDF 合成实战

成果:两本语文电子课本(一年级上册 118 页 / 23MB、三年级上册 130 页 / 30.3MB),合计 248 页、约 54MB,单本下载加合成 40~60 秒,PDF 页数校验全部通过。经验教训SPA 站点的数据接口优先从 bundle 里挖,比抓页面稳得多;资源链接要按 private/public 分组看待,只取平台公开部分;页数、目录名这类“可推断”的信息,永远用实际响应验证一次;受限环境里“能不能跑浏览器”要在方案定稿前确认。后续计划:这版 PDF 是图片版,没有文字层;

木头大左的博客 134

魔塔社区微调训练Qwen2-1.5B-Instruct模型并烧录到‌RK3568开发板教程

本文基于Ubuntu 22.04 + CUDA 13.0.3环境,使用LLaMA-Factory框架对Qwen2-1.5B-Instruct模型进行LoRA微调,训练儿童故事生成专用模型。通过配置qwen模板、制作alpaca格式数据集、执行sft训练并合并LoRA权重,最终将模型转换为GGUF格式,并量化为Q4_K_M以适配RK3568嵌入式平台。全程支持国产镜像加速下载与显存优化,实现高效轻量化部署。

浅清秋慕夏的博客 186

【回眸】DeepSeek V4.1 Flash 快速上手与实战

本文介绍如何高效本地部署开源大模型,通过现代化工具链实现分钟级环境搭建。聚焦显存优化、一键安装、代码调用与多轮对话实现,解决“显存不足”“连接超时”等痛点,提供参数调优与结构化输出技巧,助力开发者在离线场景下快速构建稳定、高效的本地推理系统。

啤酒鸭的物联网开发记录博客 223

智叟云集-手机证据抓取系统的工程结构与应用入口

本文系统阐述手机证据抓取系统的工程结构与应用入口,涵盖四大层面:工程目录划分(Android、Python服务、Web页面、测试与构建工具);Android组件通过Manifest声明可启动页面,主界面由MainActivity管理;Python服务通过run.py解析参数并启动FastAPI应用,支持远程访问;浏览器页面采用HTML/CSS/JS分离架构,静态资源通过路径关联,实现动态交互。各模块分工明确,协同构建可运行的采集系统。

2301_77178996的博客 232

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 472

利用python中matplotlib.pyplot库绘制图

plt.plot(x,y) # x,y是每个点的坐标,plot()把每个点按顺序画折线。plt.subplots(2,2)表示绘制2*2的子图布局,axs[0,0]表示在第0行第0列绘制子图...coordinates_i[:,0]表示获取每一行(每一个spot)的第0列(x坐标)coordinates_i[:,1]表示获取每一行(每一个spot)的第0列(y坐标)plot.subplot(2,2,1) 表示子图布局是2*2的,开始绘制第一个。也可以导入数据绘制。可以设置color属性,设置颜色。

qq_46147236的博客 102

Spring Boot 自动配置原理

Spring Boot 自动配置由 @EnableAutoConfiguration 导入选择器,读取 jar 中 .imports 候选清单,经去重、排序、排除后逐类做条件判断,通过才注册 Bean。延迟导入让用户 Bean 优先,@ConditionalOnMissingBean 使默认配置让位。失效时查清单和 Negative matches。

2401_89855466的博客 375

【每天一个 Python 小案例29】Python 实现商品购物车

本篇实现一个购物车:商品目录、加入商品、修改数量、移除商品、查看小计、计算满减与 VIP 折扣、结算扣库存。核心设计是"目录与购物车分离"——目录存商品主数据,购物车只存 {商品编号: 数量};金额一律用 Decimal 并做 ROUND_HALF_UP 舍入。折扣部分讲清阶梯满减的匹配顺序(阈值从高到低、命中即停)与叠加顺序(先满减、后打折),并用一次完整结算演示 706 元如何变成 613.70 元。

xinjiyaya的博客 210
上一篇: 为什么批量行情请求成功,股票池仍然可能存在数据缺口?
下一篇: 五档盘口数据实战:单标的可复现样例、校验清单与 8 个易错点
quantdash_cc
博客等级 码龄105天 38粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值