共 16 条
量化投资
4 条数据口径决定回测结论,先把这几个概念钉死。
前复权与后复权该怎么选?
两者都修正了除权除息造成的价格跳空,区别在于基准点不同。
- 前复权:以最新价为基准向前调整,历史价格被改写。适合看盘、看形态,价格与当前真实价格一致。
- 后复权:以上市首日为基准向后调整。历史价格固定不变,适合回测与长期收益计算。
结论:回测用后复权,看图用前复权。同一份序列里绝不能混用两种复权方式。
为什么时间轴必须用交易日历而不是自然日?
自然日里有周末与节假日,市场并不交易。用自然日对齐会出现大量空行,指标窗口(如 MA20)会被无效数据占位,算出来的值全部偏移。
- 所有窗口类指标按"交易日计数",第 20 个交易日才是 MA20
- 跨市场或跨品种对齐时,以各市场日历的交集为准
- 停牌日不应计入窗口,否则长期停牌股会污染因子
常用技术指标的默认参数与口径
- MA:简单移动平均,常用 5/10/20/60。注意是"收盘价序列"的均值。
- BOLL:20 日、2 倍标准差;中轨是 MA20,上下轨为中轨 ± 2σ。
- MACD:EMA12 与 EMA26 之差为 DIF,DIF 的 EMA9 为 DEA,柱体为 2×(DIF−DEA)。
- KDJ:RSV 取 9 日高低收盘,K/D 为 3 日平滑,J = 3K − 2D。
注意:EMA 的初值处理各平台不同,短序列上差异明显,跨平台比对要先统一初值。
最大回撤与区间收益的正确算法
两者都必须基于逐日净值序列,不能用首尾价格直接算。
- 区间收益 = 期末净值 / 期初净值 − 1
- 最大回撤 = max(1 − 当前净值 / 历史最高净值),即每个点相对此前峰值的跌幅最大值
- 换仓造成的现金流需按时间加权(TWR),否则收益被资金进出污染
后端工程
4 条个人项目也能有工程化,关键在几处容易翻车的地方。
FastAPI 同时托管静态站点与 API 的挂载顺序
挂载点按注册顺序匹配,一旦命中就不再往下找。
- API 路由先注册,再注册静态挂载
- 子路径(如
/quant)的挂载要早于根路径/ - 根路径挂载会吞掉所有未匹配的 URL,放在最后才不会误伤
排查:接口莫名返回 HTML 或 404,先检查是不是被根挂载截走了。
SQLite 用在个人项目里要注意什么?
- 开启 WAL 模式(
journal_mode=WAL),读写并发明显改善 - 写入用单连接、串行化,避免
database is locked - 按业务主键建唯一索引,用
INSERT OR IGNORE实现幂等写入 - 定期
VACUUM,长期删改后文件不会自动收缩
外部 API 限速与重试的通用套路
- 客户端令牌桶把速率压到配额的 50%–70%,留出重试余量
- 只重试超时、连接错误、5xx;业务错误(权限、参数)立即失败
- 指数退避叠加随机抖动,防止多任务同时重试形成尖峰
- 失败计数入库,达到阈值直接熔断并降级到缓存数据
个人应用选 JWT 还是 Session?
区别在于"状态存在哪"和"怎么失效"。
- JWT 无状态、跨服务方便,但签发后无法立即吊销,只能靠短过期时间
- Session 存在服务端,能随时踢人下线,但需要存储与共享
- 单机个人项目:Session 更简单可靠;多端登录、无状态扩展:JWT
实践:短期 access token + 服务端 refresh token,兼顾无状态与可吊销。
前端工程
4 条静态资源与缓存的博弈,是这个站最花心思的部分。
静态资源缓存指纹该怎么设计?
- 给每个资源 URL 加版本参数(
style.css?v=25),内容变更就升版本 - 带指纹的资源设长缓存(一年 + immutable),不带指纹的设 no-cache
- HTML 本身永远 no-cache,它是"版本开关",缓存住就再也换不了
顺序:先保证 HTML 不被缓存,指纹机制才有意义。
Service Worker 的三种缓存策略怎么选?
- 缓存优先:最快,但内容更新要等新 SW 激活。适合图标、字体等不变资源。
- 网络优先:始终取最新,断网回退缓存。适合应用外壳与页面。
- Stale-While-Revalidate:先给缓存、后台更新。适合可容忍短暂过期的数据。
坑:
skipWaiting() 配合客户端状态会导致新旧代码混跑,最好让用户主动刷新。ECharts 多图联动的实现要点
- 单个实例内多 grid:用
axisPointer.link同步十字光标 - 多个实例之间:通过
group+connect联动 - 容器尺寸变化后必须调用
resize(),CSS 变化不会自动生效 - 面板增删时重算各 grid 的
top/height,比隐藏显示更稳
PWA manifest 的关键字段
start_url与scope必须匹配,子路径部署要带前缀display: standalone才会去掉浏览器地址栏- 图标至少 192 与 512 两档,提供
maskable可避免被系统裁切 - 需要 HTTPS 或 localhost,否则"添加到主屏幕"不会出现
运维部署
4 条把服务放到公网上,真正麻烦的从来不是代码。
systemd 常驻服务的最小配置
比 nohup 可靠的地方在于:崩溃自动重启、开机自启、日志统一进 journald。
ExecStart用绝对路径的虚拟环境解释器Restart=always+RestartSec=3WorkingDirectory必须设置,否则相对路径全部失效- 用独立系统用户运行,不要用 root
调试:
journalctl -u 服务名 -n 50 --no-pager 看最近日志。Caddy 反向代理与自动 HTTPS
- 站点地址写域名,Caddy 自动申请并续期 Let's Encrypt 证书
reverse_proxy 127.0.0.1:8000一行即可,WebSocket 默认透明支持- 80 端口自动跳转 443,无需手写重定向
- 证书申请要求域名已解析到本机且 80/443 可被外部访问
云服务器防火墙有两层
- 第一层:云厂商控制台的防火墙/安全组规则
- 第二层:服务器系统内的 ufw / firewalld
- 端口不通时两层都要查,只开一层等于没开
- 临时排查可用
ss -lntp确认服务确实在监听
域名 ICP 备案的流程与常见退回原因
- 流程:填资料 → 云厂商初审(会电话核实)→ 工信部短信核验 → 管局审核
- 网站名称不得含金融、投资、证券、交易所等经营性词汇
- 个人备案服务内容与网站实际内容要一致,审核会看页面
- 未备案期间域名访问可能被网关重置,用 IP 直连兜底
经验:"服务器本机 200、外部被重置"基本可判定为未备案被阻断。
没有匹配的条目,换个关键词试试。