本文系 AI 生成,仅供参考,不保证准确性,实战中务必将结果与专业软件中的数据进行对比。
在量化交易和股票数据分析中,“复权”是一个绕不开的核心概念。很多新手在搭建自己的数据库或编写策略时,常常因为复权处理不当,导致回测结果失真、技术指标错位,甚至引发系统性的计算灾难。
本文将从底层逻辑出发,用大白话为你讲透复权的本质,并提供一套成熟、高效的数据库与指标设计方案,帮你完美避开各种“坑”。
一、股票中的“复权”是什么意思?
简单来说,复权是为了消除股票因分红、送股、配股等除权除息事件造成的K线价格“断崖式”缺口。
二、如何计算复权因子?
复权因子本质上就是除权前后的价格比例,但不同数据源的定义方向恰好相反:
• BaoStock 算法:复权因子 = 除权后价格 ÷ 除权前价格(结果小于 1,如 10 ÷ 20 = 0.5)。
• 掘金量化算法:复权因子 = 除权前价格 ÷ 除权后价格(结果大于 1,如 20 ÷ 10 = 2)。
无论哪种定义,其核心作用都是作为一个乘数,用于在不同历史价格之间进行等比换算。
三、将股票历史价格保存到数据库中时,建议使用真实价格还是复权价格?
四、以MA5为例,如何计算和保存指标价格?
• 计算与存储:永远使用“真实价格”来计算 MA5,并将结果存入数据库。这样历史指标是客观事实,无需因复权而重算。
• 展示与应用:在看盘或跑策略时,将数据库中的真实 MA5 乘以“当前的复权因子”,即可动态映射出完美的复权 MA5。
举个例子:某 6 天的真实价格是 20,21,22,23,24,12,其中最后一天进行了除权,且假设这天没涨没跌,掘金因子是24/12=2,这样的话,倒数据第 2 天的 MA5 是 (20+21+22+23+24)/5=22,最后一天的 MA5 是 (21/2+22/2+23/2+24/2+12)/5=11.4,所以数据库中这两天的 MA5 值分别是 22 和 11.4 。复权因子同样适用于 MA5 值,即从最后一天看,其前一天的前复权 MA5 值是 22/2=11。
五、如何解决复权因子与四舍五入叠加产生的偏差问题?
核心原则是 “真实价格负责算钱,复权价格负责算趋势” (实盘中):
• 交易与风控层:涉及真实盈亏、涨跌停价计算、下单挂单等,必须使用精确到两位小数的“真实价格”。
• 研究与回测层:涉及画K线图、计算 MA 等趋势指标时,才使用复权价格。此时允许存在极微小的尾数误差(如 1 分钱),因为技术指标看的是宏观趋势,微小偏差对信号毫无影响。
举个例子:真实价格 12.34(2位小数),复权因子 0.965678,前复权价格 12.34 × 0.965678 = 11.91646652(8 位小数)
如果你用这个 11.91646652 去算涨停价:11.91646652 × 1.1 = 13.108113172,四舍五入变成 13.11。
但是,真实的涨停价是 13.57,它的前复权价应该是:13.57 × 0.965678 = 13.10429046,四舍五入变成 13.10。
六、前复权与后复权在实际应用中该如何选择?
• 前复权:以当前最新价格为基准,向下平移历史价格。优点是最新价格与真实交易价格一致,适合看近期K线走势、分析短期技术形态。
• 后复权:以历史最早价格为基准,向上放大最新价格。优点是能真实反映上市以来的累计涨幅,适合计算长期累计收益率、评估长线投资价值。
附:复权因子计算实战案例(小白秒懂版)
T 日公司宣布“10 送 10”,股价直接“腰斩”变成 10元。假设 T 日当天市场不涨不跌,实际收盘价依然是 10元。
1. 复权因子怎么算?
• BaoStock算法:10 ÷ 20 = 0.5
• 掘金量化算法:20 ÷ 10 = 2
2. 前复权怎么算?
前复权的核心是:T 日的 10元 保持不变,把 T-1 日的价格乘以 BaoStock 的因子(0.5)。
• T-1 日前复权价 = 20 × 0.5 = 10元
• T 日前复权价 = 10元(因为T日是基准日,保持不变)最终结果:T-1 日是 10元,T 日是 10元。K 线图完美连续,没有缺口。
3. 后复权怎么算?
后复权的核心是:T-1 日的 20元 保持不变,把 T 日的价格乘以掘金的因子(2)。
• T-1 日后复权价 = 20元
• T 日后复权价 = 10 × 2 = 20元最终结果:T-1 日是 20元,T 日是 20元。K 线图同样连续,反映了你“虽然股价没涨,但手里股票翻倍了,总资产没变”的真实情况。
4. 技术指标(以 MA2 为例)怎么算?
• 数据库里存什么? 存真实价格算出来的指标。
◦ T-1 日前复权价格 = 20 × 0.5 = 10
◦ T 日前复权价格 = 10(前复权以当日为基准,保持真实价格不变)
◦ T 日真实 MA2 = (10 + 10) ÷ 2 = 10
复权只是数学游戏。真实价格负责算钱,复权价格负责看趋势;数据库里只存真实指标,看盘时再乘因子映射。
(AI 生成)
ASP.NET 10 网站在 VS 中运行正常,发布到 IIS 后,某个页面打开报 500 错误,在 Action 中整个套上 try-catch 捕获不到错误,怎么才能查看这个异常原因?
最直接的方法是:在 Windows 中打开“事件查看器”,导航到“Windows 日志” -> “应用程序”,查找来源为 IIS AspNetCore Module、.NET Runtime 或 IIS Express AspNetCore Module 的错误事件。
当然你也可以在 IIS 管理器中配置对应网站的错误页,或在 Program.cs 中启用了开发者异常页面,但是非常不建议在开发环境中开启这些。
Ollama 跑大模型生成太慢,未使用独立显卡 GPU 0 NVIDIA GPU,而 GPU 1 Intel Graphics 使用率 100%,内存几乎占满,CPU 使用率也异常高,怎么办?如何改为用英伟达独立显卡来跑?
打开 NVIDIA 控制面板(NVIDIA Control Panel),展开左侧菜单中的“3D 设置”,点击“管理 3D 设置”,切到“程序设置”选项卡,在下拉框中选择 llama-server.exe 这个程序,为此程序选择首选图形处理器改为“高性能 NVIDIA 处理器”,点击右下角的“应用”保存设置。

重启 Ollama。
使用 Ollama,即可在“NVIDIA GPU 活动”中看到 llama-server.exe。

问题复现
使用 .NET Framework 开发的网站项目,用 QQ 浏览器访问无法登录成功,用其它浏览器(如 Edge)没有问题。
只有访问 https 地址时出现问题。
原因
在 HTTPS 协议下,现代浏览器(特别是 QQ 浏览器)会强制执行安全策略。根据规范,当 Cookie 设置了 SameSite=None 时,必须同时设置 Secure 属性,否则浏览器会静默拒绝(丢弃)该 Cookie。
解决方案
方法一:如果您是通过 web.config 配置的,请确保 <system.web> 节点下的 <httpCookies> 设置正确,并且您的 .NET Framework 版本支持这些属性(4.7.2+)。
<system.web>
<httpCookies sameSite="None" requireSSL="true" />
<sessionState ... />
</system.web>方法二:在 Global.asax 文件的 Application_PostAuthenticateRequest 或 Application_EndRequest 事件中,强制为 Cookie 添加 Secure 属性。
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
// 仅在 HTTPS 环境下处理
if (Request.IsSecureConnection)
{
HttpCookie sessionCookie = Response.Cookies["ASP.NET_SessionId"];
if (sessionCookie != null)
{
// 强制设置 SameSite=None 和 Secure
sessionCookie.SameSite = SameSiteMode.None;
sessionCookie.Secure = true;
Response.Cookies.Set(sessionCookie);
}
}
}检验
确认 Set-Cookie 的值变为:
ASP.NET_SessionId=...; path=/; HttpOnly; SameSite=None; Secure安装虚拟声卡 VB-Cable 搞定。
若重启后未生效,在服务中启动 Windows Audio、Windows Audio Endpoint Builder 和 Multimedia Class Scheduler(如果有),并设置为自动启动。
如何希望使用 OBS 录制系统声音,在 OBS 菜单 - 文件 - 设置 - 音频 - 桌面音频 中选择正确的音源(如“远程音频”)。
如果你不会激活 Windows,本文可能不适用。
C盘满了如何清理?特别是 C:\Windows\WinSxS 占用大量磁盘空间,删又不敢删。
推荐一个比较完美又彻底有效的办法:
设置-系统-恢复-使用 Windows 更新修复问题。
或下载与原系统版本一致的 Windows 原版安装镜像,双击运行,选择保留个人文件和应用,等待约半个小时。
完成后,原来安装的应用程序和设置会保留,无用的系统文件会移至 C:\Windows.old。
若新系统运行没有问题,则可删除该目录(设置-系统-存储-清理建议),释放磁盘空间;若有问题,可还原到原系统(设置-系统-恢复)。
nginx 配置文件中不能随意嵌套 if,而且 if 中也没有 and 和 or 逻辑,不过可以借用变量来实现:
set $a "";
if ($request_uri ~* "action=postreview")
{
set $a "${a}1";
}
if ($http_referer !~* "^https?://([^/]+\.)?domains\.com([:/?#]|$)")
{
set $a "${a}1";
}
if ($a = '11')
{
return 403;
}
fastcgi...上例中实现了 url 中包含 action=postreview 且来源不是本站的情况拒绝访问。
一般放在 fastcgi 所在 location,譬如宝塔面板的 enable-php-xx.conf 文件中。
方法一:打开 事件查看器-> Windows 日志-> 应用程序。

方法二:启用ASP.NET Core Module Stdout 日志。
修改网站根目录下的 web.config 文件,在 <aspNetCore> 节点中启用标准输出日志。你需要先手动创建 logs 文件夹并确保有写入权限。
<aspNetCore processPath="dotnet"
arguments=".\YourAppName.dll"
stdoutLogEnabled="true"
stdoutLogFile=".\logs\stdout"
hostingModel="inprocess" />重现错误后,即可在 logs 目录下查看生成的日志文件。注意:出于性能考虑,问题解决后建议将 stdoutLogEnabled 设为 false。
一般地,应选择尺寸小于显存的大模型版本,且适当冗余。
譬如,显存 8GB,选择尺寸为 5.2GB 的 deepseek-r1:8b。
这样,整个大模型都能被完整地读取到显存中。
若选择 9.0GB 的 deepseek-r1:14b 则显存不足,Ollama 会自动调用系统内存和 CPU 来协同工作,导致推理速度显著下降。
显卡的算力影响生成的速度,模型的参数决定生成的质量。
另外经实测,在 /api/generate 接口的 format 参数中设置返回的 JSON 格式,会缩短生成时间,降低生成质量,可能的原因是强制格式限制了词汇选择空间。