组合优化实战:Markowitz模型与遗传算法Python拆解
简介面向金融量化与Python开发者的投资组合优化实战代码包围绕Markowitz均值-方差模型与遗传算法两条主线提供可运行的Python实现。内容聚焦风险约束下的资产配置基于历史价格数据计算资产平均收益率与协方差矩阵构建有效边界随后使用线性规划或矩阵运算求解最小方差组合进一步借助DEAP库中的选择、交叉、变异操作设计遗传算法对带复杂约束的多目标问题进行全局寻优弥补传统梯度方法易陷入局部最优的不足。压缩包共59个文件以28个py源码文件为代码核心辅以17个PDF文档作为理论说明4个CSV文件存放行情与价格数据6个URL链接提供扩展阅读另有配置文件与安装脚本整体约18.68MB。已有1218人学习下载。源码目录结构清晰portfolio_optimization、example、test等模块既便于整体调用也适合逐段学习配合README、requirements.txt可快速复现实验覆盖最小方差组合、有效前沿构建与遗传算法寻优等典型场景适合金融专业学生、量化分析师及中级Python开发者参考。1. 投资组合优化从 Markowitz 到遗传算法Python 代码拆解做量化的人拿到「组合优化」需求第一反应通常是用 scipy.optimize 套一个 SLSQP 求解最小方差第二反应往往是「怎么跑出来权重这么不合理」。如果组合里只有三五只常规资产Markowitz 均值-方差模型确实够用一旦你把约束加上满仓隔离、固定只数、单只上限传统数学规划就开始难为你了这时候遗传算法反而能绕出一条路。这个 portfolio-optimization-main 源码包恰好把两条路都做齐了Markowitz 有效边界用 pandas numpy scipy 实现进化优化用 DEAP 风格的种群逻辑写在 population.py 和 optimization/meta.py 里。项目数据、测试、入口都在适合当成一个可直接改造成自己量化交易策略的基线代码。后面我会把项目的文件职责、运行方式、参数含义和几处容易翻车的点全部拆开。2. 先立住基线Markowitz 均值-方差与有效边界2.1 均值-方差框架先算出收益与风险再谈最优Markowitz 在 1952 年提出的均值-方差框架至今依然是组合优化的默认起点。它把一个组合抽象成两个数期望收益和收益方差。期望收益用各个资产历史收益率的加权平均去估计风险用组合收益的方差去度量协方差矩阵里对角线是单资产波动非对角线刻画了资产之间的联动。优化的目标不是「把收益做到最大」而是在收益和波动之间找一条最优边界。实际代码里最常见的两个目标是给定预期收益求最小方差或者在无风险利率之上最大化夏普比率。前者是二次规划后者带了一个分式目标函数严格来说是非凸的但实践中 SLSQP 也经常能收敛。需要记住的一点是均值-方差优化对输入参数极其敏感历史均值收益率微调 0.5%最优权重可能完全变样。所以它不是「预测未来」的工具而是「在给定预测下推导配置」的工具。这份源码包的 portfolio.py 模块本质上就是在做这一层的事情。很多新手混淆了「收益预测」和「配置优化」。前者是模型的输入比如你预测某只股票下一年超额收益 8%后者是给定这些输入后如何分配权重让组合的波动尽可能小。源码包里所有玩法都围绕后者展开你替换掉数据文件里的收益率均值得到的权重会完全不同这恰好说明优化器没有全局最优解只有「给定假设下的最优解」。2.2 数据准备从 prices.csv 到收益率与协方差矩阵打开源码包里 data 目录能看到 prices.csv 这样一张多列价格表每一列是一个标的每一行是一个交易日。第一步处理永远是先检查数据质量再计算收益率。常见做法是import pandas as pd import numpy as np # 读取价格数据第一列是日期不要让 pandas 把它当数值 prices pd.read_csv(data/prices.csv, index_col0, parse_datesTrue) # 快速检查行数、列名、缺失值 print(prices.shape) print(prices.isnull().sum()) # 计算日收益率pct_change 会自动把相邻两天的价格相除再减 1 returns prices.pct_change().dropna() # 年化处理252 个交易日得到年化收益率和年化协方差 mean_returns returns.mean() * 252 cov_matrix returns.cov() * 252pct_change() 得到的是每个标的各自相邻交易日的收益率首行为 NaN必须 dropna否则后面协方差矩阵里会出现 NaN。乘以 252 是把日频数据年化的常规做法股票市场上一般用 252债券和外汇有些团队用 260 甚至 365关键是你前后口径要一致。协方差矩阵同样要乘 252这是因为收益的方差是随时间线性叠加的日度方差乘上天数才是年化方差。这里有个我经常提醒别人的细节prices 读进来后必须先确认列名里没有重复tickers.csv 和 prices.csv 的列顺序是否一致。源码包里 resources 目录还有一份 prices_olc.csv其实就是用于对照或者测试的数据副本如果自己加数据把新 CSV 放在资源目录并保持列名统一就行。我一般还会顺手打印returns.corr().round(3)挑出相关性超过 0.9 的两列心里先有个底——它们很可能在后续优化里制造权重集中。注意如果 returns 里出现大段 NaN说明某只标的有停牌或者上市日期晚于其他标的先处理数据不要直接进优化流程。2.3 最小方差组合scipy SLSQP 求解与约束设置from scipy.optimize import minimize n len(mean_returns) def portfolio_variance(weights): # 组合方差 w^T * Sigma * w return np.dot(weights.T, np.dot(cov_matrix, weights)) def portfolio_return(weights): # 组合收益 w^T * mu return np.dot(weights, mean_returns) # 约束所有权重加起来必须等于 1 constraints ({type: eq, fun: lambda w: np.sum(w) - 1}) # 边界默认不允许卖空权重限定在 0 到 1 之间 bounds tuple((0, 1) for _ in range(n)) # 初始值用等权SLSQP 对起点还算敏感等权是个稳定的选择 init_weights np.repeat(1 / n, n) res minimize(portfolio_variance, init_weights, methodSLSQP, boundsbounds, constraintsconstraints) print(res.x) print(res.fun)第一个约束用 eq 类型表示等式约束np.sum(w) - 1为 0 时满足条件这是 SLSQP 的标准写法。bounds 里每个资产都限制在 0 到 1等于禁止融券卖空如果允许卖空直接改成(None, None)。初始化权重这里不要用全零全零起点会让 SLSQP 陷入平凡解。最后打印出的res.x就是最小方差组合的权重res.fun是这个组合的年化方差。如果你要的是最大夏普组合目标函数需要改成负夏普再最小化因为 scipy 的 minimize 只能做最小化。这个思路在源码包的 example 目录里已经有模板修改时把 return 部分与方差部分包进同一个函数即可。一个容易被忽略的小问题是权重接近 0 的资产在结果里依然占位真实交易中你不可能持有一万个最小仓位所以后面要加一个「剔除小权重再归一化」的步骤这也是我在避坑章节里会专门说的一点。3. 遗传算法原理用进化策略替换 SLSQP 的适用场景与 DEAP 实现3.1 什么时候用遗传算法而不用 SLSQPSLSQP 这类序列二次规划方法在目标函数连续、可导、约束为光滑函数时效率很高。但投资组合一旦出现下面三类情况它就渐渐失效第一组合里要加整数约束比如「最多持有 20 只股票」或者「每只权重只能是 1% 的整数倍」这种离散决策塞进 SLSQP 会变成一个难以处理的混合整数问题第二目标函数本身带交易成本、冲击成本或者最低持仓阈值这些函数存在不连续点梯度信息是错的第三是组合数量一大比如 100 只以上协方差矩阵条件数变差SLSQP 经常在边界上卡住或者直接报错。遗传算法的思路完全不同。它不依赖梯度它的主体是「种群 适应度 选择 交叉 变异」相当于把权重向量编码成一条染色体让几千组候选组合在迭代中优胜劣汰。对不连续、非凸、带整数约束的目标遗传算法反而更不容易被局部极值困住。代价是计算量大、参数敏感、且结果有一定随机性。所以在源码包里作者保留了 SLSQP 作为基线遗传算法走 optimization/meta.py两条路线可以互相校验。这个双重结构值得称赞先用 SLSQP 拿到一个参考下限再用 GA 去探索约束更复杂的世界两边结果差距不大说明问题处理正确。3.2 DEAP 搭建进化流程编码、评估、交叉、变异这里我用 DEAP 演示一下这个项目里 population.py 和 optimization/meta.py 配合的核心逻辑。DEAP 是 Python 生态里最主流的进化计算框架把遗传算子的注册和算法的编排解耦开。先建两个类型一个是带最大适应度的个体另一个是个体容器种群。import random import numpy as np from deap import base, creator, tools, algorithms # 定义个体一个染色体就是一组权重向量 creator.create(FitnessMax, base.Fitness, weights(1.0,)) creator.create(Individual, list, fitnesscreator.FitnessMax) toolbox base.Toolbox() # 每个基因随机初始化成 0~1 之间的浮点 toolbox.register(attr_float, random.random) toolbox.register(individual, tools.initRepeat, creator.Individual, toolbox.attr_float, nn) toolbox.register(population, tools.initRepeat, list, toolbox.individual) def eval_sharpe(individual): w np.array(individual) w w / np.sum(w) # 归一化权重约束交给评估函数 ret np.dot(w, mean_returns) vol np.sqrt(np.dot(w.T, np.dot(cov_matrix, w))) sharpe (ret - rf) / vol # rf 是无风险利率设一个常数 return (sharpe,) # DEAP 要求返回元组我把归一化这一步放在 eval 里而不是放进遗传算子这点很重要。因为交叉、变异产生的新个体权重的和不会是 1如果不做归一化适应度会出现系统性偏差整个种群会往「权重和越大越占便宜」的错误方向演化。这是新手做 GA 优化组合最常踩的坑。接下来注册遗传算子toolbox.register(evaluate, eval_sharpe) # 交叉用混合交叉子代基因在两父本之间取随机比例插值 toolbox.register(mate, tools.cxBlend, alpha0.5) # 变异用高斯扰动有 indpb 概率对单个基因加噪声 toolbox.register(mutate, tools.mutGaussian, mu0, sigma0.2, indpb0.1) # 选择采用锦标赛每次从 3 个个体里挑适应度最高的 toolbox.register(select, tools.selTournament, tournsize3)四个算子的参数我都说明一下。cxBlend 的 alpha 控制子代基因偏向父本的程度alpha0.5 表示子代落在两父本连线中点附近alpha 越大越激进mutGaussian 的 sigma0.2 表示扰动幅度大概是基因值的 20%indpb0.1 是每个基因独立的变异概率这组值在 10~50 只资产的组合上比较稳。tournsize3 偏强压选择压力大收敛快但容易早熟如果做 100 只以上组合我会适当下调到 2。3.3 关键参数用一张表把种群、迭代、概率定下来真正到跑数据的时候参数组合远比 GA 的原理重要。我每次先按默认值跑一遍再根据结果微调。下面这张是常用范围表参数常用取值含义与调整方向种群大小 pop_size200~500越小收敛越快但容易局部解资产数超过 50 就至少给 300进化代数 ngen80~150只增加代数不能保证质量更应配合变异率交叉率 cxpb0.5~0.7太高会让种群快速趋同变异率 mutpb0.2~0.4太低收敛到单一染色体太高则变成随机游走锦标赛大小 tournsize2~33 选择压力大2 更温和随机种子 seed固定值不设 seed 每次结果都不同复盘非常痛苦常规做法是先固定随机种子跑 5 次取最差和最好记录范围而不是把单次结果当作结论。项目里 DEAP 的eaSimple算法循环里每一代都会做选择、交叉、变异、再评估默认配置下在 20 只资产里跑 100 代大概需要几十秒完全可以接受。如果换成种群 1000、代数 200时间会涨到几分钟这时候再考虑用多进程。4. 完整复现这套源码从项目结构到端到端运行4.1 源码包结构速览先读懂每个文件的职责整个 portfolio-optimization-main 的结构是标准 Python 包组织方式。我把核心文件对应关系列了一张表路径职责data/prices.csv主数据集多资产历史价格data/resources/prices_olc.csv备用价格数据常用来做对照预测data/resources/tickers.csv标的代码列表portfolio_optimization/portfolio.pyMarkowitz 组合类均值、方差、最小方差组合求解portfolio_optimization/population.py遗传算法个体与种群定义portfolio_optimization/optimization/meta.py进化优化主循环调用 population 和 portfolioportfolio_optimization/utils.py数据装载、CSV 解析、日期对齐等工具函数portfolio_optimization/example可运行的示例脚本演示整个流程portfolio_optimization/test/assets.py对资产模块的单元测试requirements.txt / setup.py依赖与安装配置读源码的顺序建议是从 portfolio.py 开始它是最短的看完它你就能理解「收益、协方差、优化」三个核心概念是如何落到代码上的然后再去读 population.py最后扫一眼 example 的入口脚本。不要一上来就钻进 meta.py 的循环细节那里面大量 DEAP 内部 API 会让你迷路。提示test/assets.py 看起来像个简单的断言脚本但它是这个项目的安全网。改完 portfolio.py 后跑一次能立刻发现收益口径或者协方差维度搞错的问题。4.2 端到端运行从 CSV 到最优权重环境先决条件是 numpy、pandas、scipy 和 deap。requirements.txt 里已经列了版本直接 pip 安装即可。这里给出一个可以直接运行的端到端脚本import pandas as pd from portfolio_optimization.portfolio import Portfolio from portfolio_optimization.optimization.meta import ga_optimize # 第一步数据装载 prices pd.read_csv(data/prices.csv, index_col0, parse_datesTrue) portfolio Portfolio(prices) # 第二步SLSQP 基线 min_var_weights portfolio.min_variance(solverSLSQP) print(最小方差结果, min_var_weights) # 第三步遗传算法 best_weights, fitness_history ga_optimize( returnsportfolio.returns, covportfolio.cov_matrix(), targetsharpe, risk_free_rate0.02, pop_size300, ngen100, cxpb0.6, mutpb0.3, seed42, verboseTrue, ) print(GA 最优权重, best_weights) print(GA 最优夏普, fitness_history[-1])如果依赖装好输出会是每进化一代打印一行 fitness 信息最后打印权重。我把随机种子固定成了 42这很关键不固定 seed你两次运行得到结果会不同复盘就乱了。拿到权重之后记得做两件事一是把所有权重视觉化用 matplotlib 画个横向条形图检查是否有持仓权重集中在某一两只股票上二是看无效边界图源码包 example 里已经有绘制散点图的脚本把所有随机组合画成浅色点、有效边界画成折线你会明显看到 GA 求出的解落在边界附近而不是边界内部。这套代码本质上就是一套可以反复改数据的量化交易策略实验框架。4.3 改造成你要的约束最大持仓比例与固定数量选股实际操盘时你不会用全局满仓 0~1 的权重两个最常见的改造是每只权重上限和最少持有的股票只数。前者很简单把 bounds 从 0~1 改成 0~0.15 即可SLSQP 会直接遵守。后者是整数约束更适合 GA。一个有效做法是约束评估函数在 eval_sharpe 里先按权重排序选出前 K 个保留其余置 0再做归一化。权重重置后等于把「选哪些股票」这个离散问题内化进了适应度评估。def eval_with_topk(individual, k10): w np.array(individual).copy() idx np.argsort(w)[-k:] if k len(w) else np.arange(len(w)) w np.where(np.isin(np.arange(len(w)), idx), w, 0.0) # 归一化后再算夏普 w w / np.sum(w) ret np.dot(w, mean_returns) vol np.sqrt(np.dot(w.T, np.dot(cov_matrix, w))) return ((ret - rf) / vol,)这段代码最关键的是np.argsort(w)[-k:]返回权重最大的前 k 个下标其余基因被硬置为 0。这样做的好处是种群在演化中会自然学习哪几只股票更重要而不是预先人工指定标的池。但要注意当 k 比资产总数小很多时搜索空间会显著增大因为高维向量里只有少部分基因幸存交叉和变异很多是无效操作此时建议把变异率调高到 0.4 以上。5. 避坑组合优化里最常见的四类翻车现场5.1 权重之和不是 1或者出现负数现象SLSQP 求解结束拿到一组权重求和得到 0.97 或者 1.03甚至出现负权重。看起来优化器没有严格满足约束。原因scipy 的 SLSQP 对等式约束用的是数值容差默认的 ftol 是 1e-6浮点误差和优化器终止迭代条件会让约束只能近似满足。另外如果目标函数在最优解附近非常平坦SLSQP 会提前收敛不再花力气修正约束。解决不要在优化调用里纠结这一个问题标准做法是优化完成后强制归一化w w / np.sum(w)同时把约束写成np.sum(w) - 1并用ftol1e-9提高精度。还要把结果里小于 0.005 的权重直接剔除再重新归一化一遍这样才符合真实持仓逻辑。我一开始总盯着 scipy 的文档找参数后来才意识到优化器输出只是一个数学解真实场景下的可执行度比数值精度更重要。5.2 协方差矩阵奇异导致优化直接报错现象资产数量大于样本数量报LinAlgError: Singular matrix或者不报错但优化结果权重极端两三只股票占了 90%。原因协方差矩阵是满秩的前提是样本数大于资产数。日线数据只有 60 行却扔进去 50 只股票矩阵必然奇异另一种情况是多只股票强相关比如同一板块的 ETF协方差矩阵条件数极大求逆后噪声被放大。解决首选把样本拉长到至少 3 倍资产数如果数据长度受限用sklearn.covariance.LedoitWolf做收缩估计给采样协方差加一个稳定化偏置这是组合优化界处理短序列的常规做法拿它替换原来的np.cov输出其余代码不用动。这个替换几乎是零成本的强烈建议直接写进 utils.py 里作为默认预处理。5.3 遗传算法过早收敛适应度很多代不再变化现象eaSimple运行到第 15 代best fitness 就不再提升后面 85 代完全白跑。种群看似很多元但最优解始终是同一个或极相似的味道。原因两个最可能。其一是变异率太低交叉算子把优秀个体的片段两两组合后迅速收敛没有新基因注入其二是选择压力过大tournsize3 加上每代都保留精英少数几个高适应度个体快速占据整个种群多样性很快枯竭。解决把变异率从 0.1 抬到 0.3 左右同时将 mutpb 均匀改为按基因独立概率 0.1~0.15让部分个体保留部分个体大幅突变还可以引入小概率重新初始化即每代随机替换 5% 的个体机制上类似移民。另一个务实做法是记录每一代的 best fitness看到连续 20 代不升就停止没必要空跑到预设 ngen。这件事没有银弹本质是种群多样性在跟收敛速度做对抗。5.4 数据对齐问题行数和日期不一致现象合并价格数据后某列的 NaN 特别多收益矩阵的行数明显小于价格矩阵的行数优化结果里个别资产权重忽大忽小。原因不同 ticker 的上市日期、停牌日期、节假日都不完全一致。pandas 的pd.concat默认是外连接不同列的日期会互相补齐于是出现大量缺失值对应资产的收益率序列被自动截断样本数量骤减。解决在构造收益矩阵前统一用prices prices.dropna(howany)只保留所有 ticker 都有交易的日期如果某只资产停牌时间长宁可剔除它也不要硬填。其次把returns.isnull().sum()的结果打印出来逐个核对这是最小成本的数据检查习惯。这个问题通常发生在你把新 ticker 添加进 tickers.csv 时所以加数据后先跑一遍对齐检查再跑优化。我在数据对齐上栽过跟头——混进一只上市两天的次新股整个协方差矩阵直接变形优化结果把大量权重压到了它身上回测惨不忍睹。6. 验证优化结果滚动回测这个 30 行的日常习惯优化器的输出只是「训练集上的最优解」直接拿去实盘是典型的过拟合行为。我强烈建议在固定拿到一组权重后立刻做一个滚动回测把完整时间段切成长度一致的回看窗口和持有窗口在每个回看窗口内重新优化在接下来的持有窗口内评估权重再把所有持有期结果串起来看夏普比率和最大回撤是否稳定。def rolling_backtest(prices, window252, step21, min_varTrue): returns prices.pct_change().dropna() results [] for start in range(0, len(returns) - window, step): train returns.iloc[start:startwindow] test returns.iloc[startwindow:startwindowstep] mean_train train.mean() * 252 cov_train train.cov() * 252 # 每个窗口重新求解最小方差 if min_var: w solve_min_var(mean_train, cov_train) else: w ga_optimize(train, cov_train)[best] # 持有期收益 port_ret test.dot(w) results.append({ start: test.index[0], sharpe: (port_ret.mean() * 252) / (port_ret.std() * np.sqrt(252)), cum_return: (1 port_ret).prod() - 1, max_drawdown: (1 port_ret).cummax().div(1 port_ret).sub(1).min() }) return pd.DataFrame(results)参数上window 选 252 是使用年度数据做训练step 选 21 表示每月再平衡一次。这样跑完后重点看一个指标每期夏普比率的标准差。标准差越小说明优化结果越稳不是单靠某一段行情碰运气如果标准差很大就要怀疑权重在极端行情里是否被少数资产主导。这一步也会抓到第 5 章里数据对齐不完整的隐患因为错误数据常常只在部分窗口内暴露出来。从那以后我每次做组合优化都会强制走完这个流程先修数据、再跑基线、再跑 GA、最后滚动验证。任何一步的结果不对劲我都会回头先查数据而不是急着调优化器参数。这个习惯帮我省下了大量在错误输出上浪费时间的机会。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于Hadoop与Spark的中文手写数字实时识别系统实现与避坑指南

基于Hadoop与Spark的中文手写数字实时识别系统实现与避坑指南

简介:这是一份基于Hadoop和Spark的中文手写数字实时识别系统完整课设源码包,面向大数据课程设计、毕业设计以及Python实践作业场景。项目将分布式计算框架与机器学习结合,针对中文手写数字的实时识别需求,提供了从数据特征提取、模…

2026/10/10 14:48:53 阅读更多 →
汉明码纠错原理与C语言实现:从(7,4)到(12,8)及ECC内存

汉明码纠错原理与C语言实现:从(7,4)到(12,8)及ECC内存

做嵌入式通信和存储的同学,大概率都遇到过这种诡异情况:数据在链路上跑一圈回来,某个字节悄无声息地变了,最常用的奇偶校验却只告诉你“出错了”,至于哪一位出错,一脸茫然。汉明码就是专门解决“单比特翻转…

2026/10/10 14:48:53 阅读更多 →
手机本地部署大模型实战:从Termux环境到Qwen3.5离线推理优化

手机本地部署大模型实战:从Termux环境到Qwen3.5离线推理优化

把大语言模型装进手机本地跑,这事儿放在一年前还只属于技术极客的玩具。但最近端侧AI的进展确实让我有点坐不住了——Qwen3.5这代模型把参数规模压到了能上手机的级别,配合量化压缩跟新架构带来的显存优化,再加上Termux这类终端工具链的成熟&…

2026/10/10 14:48:53 阅读更多 →

最新新闻

基于Python+FaceNet的课堂签到系统:原理、实现与避坑指南

基于Python+FaceNet的课堂签到系统:原理、实现与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 15:42:20 阅读更多 →
STM32F767ZG搭配PCA9422的嵌入式电源管理方案详解

STM32F767ZG搭配PCA9422的嵌入式电源管理方案详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 15:42:20 阅读更多 →
PCA9422与MKV42F64VLH16协同实现嵌入式电源主动管理

PCA9422与MKV42F64VLH16协同实现嵌入式电源主动管理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 15:42:20 阅读更多 →
植物营养健康检测数据集实战:YOLOv8-seg多类别标注与训练部署

植物营养健康检测数据集实战:YOLOv8-seg多类别标注与训练部署

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 15:42:20 阅读更多 →
TM4C129ENCPDT与PCA9422协同电源管理设计

TM4C129ENCPDT与PCA9422协同电源管理设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 15:42:20 阅读更多 →
本地部署 OpenResearch 的十个暗坑:依赖地狱、双栏 PDF 与扫描件

本地部署 OpenResearch 的十个暗坑:依赖地狱、双栏 PDF 与扫描件

本地部署 OpenResearch 的十个暗坑:依赖地狱、双栏 PDF 与扫描件 【免费下载链接】OpenResearch Turn your coding agents into research agents 项目地址: https://gitcode.com/GitHub_Trending/op/OpenResearch 把 coding agent 改造成 research agent&…

2026/10/10 15:41:18 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →