A股日线/快照本地自动落库,开机自启
系列·本地复盘篇 02 — 自选股行情每天自动进库,断电漏跑开机补上,复盘数据从此不断档
📖 本篇是《本地 AI 复盘系统》第 2 篇,前置:本地 Python 环境与 SQLite 准备; 数据接口的细节(限频/复权/中文列名)同站akshare 数据实操讲得更深,可对照读。
01 · 脚本:读自选清单,增量落库
先建一个自选清单 D:/quant/scripts/stocks.txt,一行一个代码,写你真正持有的和盯着的票 (几十只以内最舒服):
# update_daily.py — 每天收盘后跑一次
import sqlite3, time
from pathlib import Path
import akshare as ak
import pandas as pd
ROOT = Path("D:/quant")
DB = ROOT / "astock.db"
codes = [c.strip() for c in (ROOT / "scripts/stocks.txt").read_text().splitlines() if c.strip()]
conn = sqlite3.connect(DB)
for code in codes:
# 库里最新日期的下一天接着拉,天然增量
row = conn.execute("SELECT MAX(date) FROM daily WHERE code=?", (code,)).fetchone()
start = (pd.Timestamp(row[0]) + pd.Timedelta(days=1)).strftime("%Y%m%d") if row[0] else "20240101"
df = ak.stock_zh_a_hist(symbol=code, period="daily",
start_date=start, end_date="20991231", adjust="qfq")
if df is None or df.empty:
continue
df = df.rename(columns={"日期": "date", "开盘": "open", "最高": "high",
"最低": "low", "收盘": "close", "成交量": "volume"})
for _, r in df.iterrows():
try:
conn.execute("INSERT INTO daily VALUES(?,?,?,?,?,?,?)",
(code, str(r["date"])[:10], r["open"], r["high"],
r["low"], r["close"], r["volume"]))
except sqlite3.IntegrityError:
pass # 已存在 -> 跳过(幂等)
time.sleep(0.5) # 限频礼貌
conn.commit(); conn.close()
print("done", len(codes))手动跑一次 python -X utf8 update_daily.py,用 DB Browser 打开库确认有数据。
02 · 挂 Windows 任务计划程序
先用一条命令注册(管理员 PowerShell),想用图形界面就搜"任务计划程序"照同样的参数点:
schtasks /Create /TN "astock-daily" /SC WEEKLY /D MON,TUE,WED,THU,FRI /ST 18:00 ^
/TR "D:\quant\.venv\Scripts\python.exe -X utf8 D:\quant\scripts\update_daily.py" ^
/F注册完在"任务计划程序"里打开这条任务的属性,改三个默认值:
- "不管用户是否登录都要运行" — 默认"只在登录时"会导致你没登录就不跑。
- "如果错过计划开始时间,尽快启动任务" — 关机/重启错过的任务开机补跑,数据不断档。
- "如果任务运行超过 X 小时,停止" — 脚本几分钟就完,默认值无所谓,但别设成 1 分钟。
macOS 用户等价方案:crontab -e 加一行0 18 * * 1-5 /Users/you/quant/.venv/bin/python /Users/you/quant/scripts/update_daily.py。
03 · 日志:出了问题看这里
任务计划程序不会告诉你脚本崩没崩,把输出重定向到日志文件(改 /TR 参数, 或直接用 bat 包装):
@rem run_update.bat
@echo off
cd /d D:\quant
.venv\Scripts\python.exe -X utf8 scripts\update_daily.py >> logs\update_%date:~0,4%%date:~5,2%%date:~8,2%.log 2>&1任务的 /TR 改成指向这个 bat。每次改任务后右键"运行"实测一次,别等收盘才发现没跑。
04 · 验证与日常维护
- ☐ 挂任务后第一个交易日 18:00 后看日志有
done N。 - ☐ 抽一只票,库里的最新日期 = 最新交易日(节假日顺延,属正常)。
- ☐ 每隔几个月做一次全量刷新(删库重跑或清空重拉):前复权价会随分红漂移,增量数据久了会失真。
05 · 避坑清单
- 任务"上次运行结果"是 0x1 或没跑 — 十有八九是"只在用户登录时运行"没改;或路径含空格没加引号。
- 睡眠时不跑 — 笔记本合盖=睡眠,任务不会唤醒电脑;电源设置里把"睡眠"改"从不"或接受开机补跑。
- 杀毒软件拦 python — 定时任务偶发被静默拦截,把
.venv目录加白名单。 - 盘中别跑这个任务 — 盘中拉日线,当天那根 K 线是半成品;固定 18:00 之后。