尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
用Python pandas实现海龟交易法则:从ATR到仓位管理全解析
简介海龟交易法则的Python pandas实现是一套面向量化交易初学者、程序化交易爱好者和Python数据分析学习者的策略代码与示例数据整合包重点展示经典趋势跟踪策略在本地历史数据上的代码落地与回测方式。资源将唐奇安通道突破、N日高低点判断、ATR波动率止损、仓位管理与模拟成交等环节整合在一个Python脚本中配合两个CSV历史价格数据集即可运行。压缩包内共包含3个文件即一个Python策略脚本和两个CSV数据集整体仅有41KB非常轻量便于快速阅读和修改测试。目前已有1304人学习下载。通过运行脚本读者可以完整观察数据加载、指标计算、信号产生、交易执行到绩效统计的整个流程脚本还涉及pandas中滚动窗口、移动平均、条件筛选与DataFrame操作等常用数据分析方法既有助于理解海龟交易法则的核心逻辑也可以作为二次开发或扩展其他量化策略的代码起点并可在此基础上调整参数、扩展指标用于进一步探索和验证。1. 海龟交易法则用pandas落地先把“突破买入”的幻觉放下很多人拿到海龟交易法则的第一反应是把它简化成“二十日高点突破买入”然后直接拿行情跑一遍回测跑完得出一个“策略失效”的结论。我见过不少这类翻车问题几乎都不在法则本身而在只做了半套。标题里的“用Python的pandas库实现”其实是在提醒你海龟法则里入场通道只是三分之一剩下的 N 值仓位、2N 止损、0.5N 加仓、10 日退出才是真正决定盈亏的骨架。这篇笔记会把整个标题拆成一条完整落地路径先用 pandas 算好指标再生成交易计划表最后用事件循环执行仓位管理。适合已经有 Python 基础、想自己动手验证海龟法则而不是只看别人结论的人。2. 海龟法则的骨架与pandas选型先搞清楚要算什么再动手2.1 海龟法则不是突破指标而是一条完整的决策链海龟法则最容易被误读的地方是大家都盯着“突围入场”那个动作却忽略了它实际上是一套从建仓到离场的完整决策系统。拆开看一共四块入场用唐奇安通道突破价格突破前 20 日最高价做多、跌破前 20 日最低价做空仓位不用“买几手”来定而是用账户 1% 的风险除以当前 N 值也就是 ATR来计算单位大小入场后设置 2N 止损价格每朝有利方向波动 0.5N 就加仓一次单个方向最多持有 4 个单位最后用 10 日反向突破离场即多单收盘价跌破前 10 日最低价就退出。这四块是一体的。只做入场突破等于把止损、加仓、离场全部扔掉跑出来自然是一根很难看的资金曲线。真正让它能在趋势行情里赚钱的是“让盈利的单子拿得住、让亏损的单子亏得少”这套仓位和退出逻辑。用 pandas 实现时这四块分别对应滚动窗口计算、风险单位计算、状态循环和离场信号每块的代码形态都不一样提前在脑子里拆好后面才不会被绕晕。模块海龟规则pandas 对应操作入场价格突破前 20 日最高/最低价shift(1) rolling(20).max/min仓位账户 1% 风险 / N 值波动金额risk_per_trade / (atr * 合约乘数)风控2N 止损0.5N 加仓上限 4 单位事件循环里的状态机退出收盘跌破前 10 日低点shift(1) rolling(10).min2.2 为什么选pandasrolling、shift和groupby是趋势策略的地基如果你只是算一个指标用纯 Python 列表循环也能做但海龟法则涉及到多品种、滚动窗口、前值引用和缺失值处理这些恰恰是 pandas 的主场。一个典型的日线 DataFrame 至少包含 code、date、open、high、low、close 六列不同品种用 code 字段区分后续计算按 code 分组进行。rolling 窗口天然适合唐奇安通道这种“取过去 N 日极值”的逻辑shift 则能拿到前一交易日的收盘价和通道值用来回避未来函数。纯 numpy 也能算滚动极值但可读性差很多。pandas 的优势在于列名操作旁人看代码能直接看出你算的是哪条逻辑排查数据问题的时候也能用 DataFrame 的可视化一次性看完。几十个品种、十年日线也就是几十万行的规模pandas 完全吃得消。只有当你把这个策略压到分钟线、而且每天循环几千根 K 线的时候才需要考虑把核心循环改成 numpy 数组或 numba 加速。2.3 动手前的三个前置准备字段、复权和停牌处理第一步不是写指标而是把数据洗干净。我一般会先读一份 CSV然后按 code 和 date 去重、排序。这里有一个很多人会忽略的点如果同一品种出现重复日期rolling 的窗口会被错位数据污染前 20 日的最高价可能包含了两个相同日期的值信号全乱。import pandas as pd df pd.read_csv(daily.csv) # 至少包含 code, date, open, high, low, close df[date] pd.to_datetime(df[date]) df df.drop_duplicates(subset[code, date]).sort_values( [code, date] ).reset_index(dropTrue) print(df.tail())这段代码做了三件事读数据、把日期字符串转成 pandas 的 datetime 类型、按“品种加日期”去重并排序。reset_index(dropTrue) 很关键后面用 shift(1) 取前一日数据时索引必须是连续的否则会出现错位。复权方面建议全部分析周期统一用后复权价不要在样本中混用前复权和后复权否则通道值和 N 值会在复权切换点突变。停牌日要么直接删掉要么保留为 NaN 行但后续计算 ATR 时必须用 min_periods 做保护这个坑会在避坑章节展开。3. 用pandas算关键指标ATR、唐奇安通道与突破信号3.1 N值ATR的正确算法先shift再rolling海龟法则里的 N 值就是真实波幅的 20 日简单移动平均在代码层面对应两个动作先算每日真实波幅 TR再对 TR 取 20 日滚动平均。TR 的定义是三组差值的最大值当日最高价减最低价、当日最高价减前一日收盘价的绝对值、当日最低价减前一日收盘价的绝对值。这里必须先 shift(1) 把“前一日收盘价”单独取出来不能直接拿当前 close 去减。import pandas as pd def compute_atr(df: pd.DataFrame, period: int 20) - pd.DataFrame: # 前一交易日收盘价第一行会是 NaN prev_close df[close].shift(1) # 真实波幅 TR取三种波动路径的最大值 tr pd.concat([ df[high] - df[low], (df[high] - prev_close).abs(), (df[low] - prev_close).abs() ], axis1).max(axis1) # 海龟原版用的是简单移动平均不是指数平均 df[atr] tr.rolling(period, min_periodsperiod).mean() return df这段代码的核心是 pandas 的三个函数shift(1) 把整列下移一行保证计算 TR 时用的是“昨天收盘”而不是“今天收盘和今天最高价比较”rolling(20) 对 TR 序列开一个固定 20 日的滑动窗口min_periodsperiod 表示不足 20 个有效值时不输出结果。参数 period 默认 20对应海龟法则的标准设置如果你想做敏感性测试可以把它改成 10 或 30但要注意这已经不是原版规则了。为什么不直接用 ewm 指数平均因为海龟法则原始手册定义的就是简单移动平均指数平均会让 N 值对最近几天的波动反应过快导致同一段行情里的仓位数和止损位都和原版对不上。算完 ATR 后建议立刻 print 一段数据肉眼检查前 19 行是否为 NaN、第 20 行是否等于前 20 个 TR 的均值。3.2 唐奇安通道用前20天的最高价别把今天算进去唐奇安通道的代码只有几行但这里藏着全篇最容易犯的错通道值必须用前一日的滚动极值不能用当天的。也就是说今天能不能开多单要看“截至昨日为止的 20 日最高价”而不是把今天这根 K 线的最高价也包进窗口里。如果你直接写 high.rolling(20).max()那么今天只要没跌就天然满足“创 20 日新高”因为今天的最高价必然大于或等于自己这就是赤裸裸的未来函数。def add_donchian(df: pd.DataFrame, entry: int 20, exit_: int 10) - pd.DataFrame: # 先整体移动一格取得“昨日”的最高价和最低价 df[high_prev] df[high].shift(1) df[low_prev] df[low].shift(1) # 入场通道前20个交易日的极值注意是昨日极值 df[entry_high] df[high_prev].rolling(entry, min_periodsentry).max() df[entry_low] df[low_prev].rolling(entry, min_periodsentry).min() # 退出通道前10个交易日的极值 df[exit_low] df[low_prev].rolling(exit_, min_periodsexit_).min() df[exit_high] df[high_prev].rolling(exit_, min_periodsexit_).max() return df这里 shift(1) 的位置决定了整个策略是否成立。先 high.shift(1) 再 rolling窗口里装的都是昨天的数据今天的突破才有意义。参数 entry20、exit_10 是海龟 System 1 的标准配置System 2 则是 entry55、exit_20对应更慢的趋势跟踪。我一般默认跑 System 1因为它的交易次数更多回测样本更充足也更容易暴露逻辑漏洞。注意 exit_low 和 entry_high 用的都是 low_prev / high_prev也就是说退出信号同样避免了“今天跌破今天的 10 日最低点”这种自证陷阱。很多简化版把退出直接写成 close low.rolling(10).min()在震荡行情里会多出一堆本不该触发的离场信号。3.3 生成突破信号与过滤器System 1的入场与可选250日过滤有了通道值信号只是一次比较。做多信号是当日收盘价大于 entry_high做空信号是当日收盘价小于 entry_low。直接比较便能得到布尔序列。但实际回测中大部分突破信号发生在震荡期会带来连续的假突破亏损。海龟原版在 System 1 上有一个 250 日新高过滤器只有当价格同时创出 250 日新高时才允许入场目的是过滤掉大部分震荡假信号。df[long_signal] df[close] df[entry_high] df[short_signal] df[close] df[entry_low] # 可选过滤器250日新高/新低显著减少交易次数 df[filter_high] df[high_prev].rolling(250, min_periods250).max() df[filter_low] df[low_prev].rolling(250, min_periods250).min() df[long_signal] df[long_signal] (df[close] df[filter_high]) df[short_signal] df[short_signal] (df[close] df[filter_low])加上 250 日过滤器后策略风格会明显改变交易次数可能减少一半以上但单笔盈利会更厚。这个过滤器不是必须的如果你做的是小资金短线验证可以先不加等确认核心逻辑没问题后再加上看效果。这里有两个参数值得调entry 控制入场灵敏度filter 控制入场门槛两者作用完全不同不要混在一起调。信号生成后还有一个细节同一根 K 线既可能满足 long_signal 也可能满足 short_signal比如极端波动日价格既突破上轨又跌穿下轨。代码里应该定义一个优先级我的习惯是这种极端日直接跳过不开仓优先保证状态机不被双向信号搞乱后面避坑章节会专门说。4. 仓位管理与加仓逻辑pandas做计划表循环做执行4.1 仓位模型的起点账户1%风险与N值海龟法则的仓位管理用一句话概括每次入场把账户 1% 的资金作为风险预算除以当前 N 值对应的波动金额得到应该持有的单位数量。这里的“波动金额”等于 N 值乘以合约乘数如果做股票没有杠杆可以简单把乘数当成 1。这样 N 值大的时候仓位自动变小N 值小的时候仓位自动变大等于用波动率反过来调节仓位让每一笔交易承担的风险基本一致。risk_pct 0.01 # 账户1%风险预算 fixed_equity 1_000_000 # 回测用固定初始权益避免权益漂移 price_per_unit 1.0 # 合约乘数股票可理解为每波动1元对应的盈亏 def calc_unit_size(n_value: float) - int: # 波动一个N账户亏损约n_value*price_per_unit # 用1%风险除以N值波动金额得到单位数量 risk_amount fixed_equity * risk_pct unit int(risk_amount / (n_value * price_per_unit)) return max(unit, 1)参数说明risk_pct 固定为 0.01这是海龟法则的铁律不要轻易改成 0.02 或更高否则连续几次止损就可能把账户打趴fixed_equity 是回测口径先用固定初始权益保证结果可复现实盘要动态计算时再改为每笔入场时的最新权益price_per_unit 对期货是合约乘数对股票可以按 1 处理如果是做指数期货这个值会显著影响单位数量的量级。这里有一个回测一致性问题如果每天用“当日最新权益”重新计算 unit那么同样一段行情跑两次由于浮点误差和加仓顺序的耦合结果可能完全不一样。我个人的习惯是先固定权益跑通逻辑再改动态权益做敏感性对比两种口径的结果差异本身就值得写进报告里。4.2 把交易计划写成表入场价、加仓间距、止损位在写循环之前先用 pandas 把“计划表”生成好。计划表的价值是让每个交易日的入场价、加仓触发价、止损价都躺在同一行里循环逻辑只需要查表不需要重复计算。这既方便调试也方便后续加可视化。def build_plan(df: pd.DataFrame, atr_col: str atr) - pd.DataFrame: plan pd.DataFrame(indexdf.index) plan[entry_price] df[close] # 简化以信号日收盘价入场 plan[add_gap] 0.5 * df[atr_col] # 加仓间距 0.5N plan[first_stop] df[close] - 2 * df[atr_col] # 多单初始止损 plan[max_units] 4 # 单个方向最多4个单位 return plan这段代码有意的简化是入场价直接取信号日收盘价实际系统里你可以用突破价或次日开盘价但一旦改了入场价止损价和加仓价也必须跟着改。add_gap 是动态的因为 N 值每天在变所以加仓间距不能是固定数字。这里有一个常见误用有人把 0.5N 写成 0.5 * 首次入场时的 N然后在后面所有加仓都用同一个间距但行情波动率变化后这个间距就完全失真了。严谨做法是每根 K 线都用当天的 atr 计算间距这也是为什么 plan 表里每一行都有自己的 add_gap。4.3 事件循环执行路径依赖逻辑没法纯向量化唐奇安通道和 ATR 都可以用 pandas 向量化一次算完但“当前持仓几个单位、下一次加仓价在哪、止损价上移到哪”这些状态依赖前一根 K 线的持仓结果是典型的路径依赖逻辑。想用 shift 加向量化把加仓链条展开很快就会陷入“把状态表复制 N 份”的泥潭。我一般直接用一个事件循环遍历 K 线pandas 负责查表和取值循环只做状态转移。import pandas as pd def run_system1_long(df: pd.DataFrame, plan: pd.DataFrame, risk_pct: float 0.01, tcost: float 0.0003): cash 1_000_000.0 position 0 # 0 空仓1 持有多单 units 0 # 已加仓的单位数量 avg_price 0.0 # 加权平均持仓价 stop_price 0.0 # 当前止损价 next_add 0.0 # 下一次加仓触发价 trade_log [] def unit_size(atr: float) - int: return max(int(1_000_000 * risk_pct / (atr * 1.0)), 1) for i in range(len(df)): atr_now df.at[i, atr] if not pd.notna(atr_now): continue # 数据缺失直接跳过不触发任何交易 px_close df.at[i, close] px_high df.at[i, high] px_low df.at[i, low] # 空仓时检查多头入场信号 if position 0 and bool(df.at[i, long_signal]): sz unit_size(atr_now) position 1 units 1 avg_price px_close stop_price px_close - 2 * atr_now next_add px_close 0.5 * atr_now cash - sz * px_close * (1 tcost) continue if position 1: # 1) 止损盘中最低价跌破止损位 if px_low stop_price: fill stop_price if df.at[i, open] stop_price: # 跳空低开按开盘价成交 fill df.at[i, open] sz units * unit_size(atr_now) cash sz * fill * (1 - tcost) trade_log.append((stop, df.index[i], fill, units)) position 0 continue # 2) 加仓最高价突破下一个加仓价且未到4个单位 if units 4 and px_high next_add: sz unit_size(atr_now) units 1 cash - sz * next_add * (1 tcost) # 加权平均持仓成本 avg_price (avg_price * (units - 1) next_add) / units # 止损上移至最新加仓价减2N stop_price next_add - 2 * atr_now next_add next_add 0.5 * atr_now continue # 3) 趋势退出收盘跌破前10日低点 if px_close df.at[i, exit_low]: sz units * unit_size(atr_now) cash sz * px_close * (1 - tcost) trade_log.append((exit, df.index[i], px_close, units)) position 0 return trade_log, cash这个循环只写了多单路径空单逻辑完全对称入场看 short_signal入场价减 2N 作为止损位加仓价向下递减 0.5N退出看收盘价突破前 10 日最高价。循环里每个分支的顺序不能乱先判断止损再判断加仓最后判断趋势退出。如果先判断加仓价格在突破加仓价的同时也跌破了止损价代码会错误地加仓而不是止损这种极端行情在真实的期货日线里是出现过的。参数说明tcost0.0003 是单边千分之三的综合成本包含手续费和固定滑点止损成交价处理上如果当日开盘价低于 stop_price说明跳空低开止损单实际成交价只能是更差的开盘价否则回测会虚高。加仓时 stop_price 上移到最新加仓价减 2N不是简单地把原来的止损价加上一个 0.5N这是海龟原版“让止损跟着盈利走”的实现方式。trade_log 里我只记录了平仓原因、成交价和单位数实际项目里还要记录入场时间、持有天数、每笔盈亏方便后面统计盈利因子。5. 回测避坑指南未来函数、跳空成交与权益漂移5.1 通道窗口包含当天信号自带未来函数现象回测净值曲线漂亮得不像话绝大多数突破单都在赚钱但放到实盘里完全另一回事。原因rolling 窗口没有先 shift(1)当天的最高价参与了“20 日最高价”的计算使得突破条件形同虚设。解决所有通道值都先 shift(1) 再 rolling并抽几个信号日期手动验证——信号出现的那天它的 close 必须大于“前一天计算出的 entry_high”而不是大于包含自己在内的滚动极值。这个陷阱在写代码的前五分钟就会踩到我通常把它列为回测第一道安检。5.2 停牌和缺失值让N值变成NaN仓位函数直接崩溃现象回测跑到一半报错或者某些交易日志里出现单位数为 0 的诡异记录。原因股票停牌、新股上市前 20 日数据不足、CSV 里有空行导致 atr 或 entry_high 为 NaN而 int(NaN) 直接抛异常。解决计算时用 min_periodsperiod确保窗口不足时不产生半成品数据运行时在循环开头加一行if not pd.notna(atr_now): continue数据预处理阶段用 dropna(subset[“atr”, “entry_high”, “exit_low”]) 把前段无信号区直接截掉避免无效行进入回测。注意 dropna 会让索引变短如果做后期可视化最好保留原索引对齐。5.3 止损成交价太理想跳空低开直接打穿回测现象回测里单笔亏损都很小实盘一旦遇到反向跳空亏损比预期大接近一倍。原因止损代码里用 stop_price 作为成交价但价格是跳空开盘的你挂的止损单只能在开盘价附近成交不可能刚好在 stop_price 上成交。解决成交判断用if px_low stop_price成交价格写成fill min(df.at[i, open], stop_price)也就是开盘价低于止损价时按开盘价成交。更进一步还在每个成交价上乘以 (1 tcost) 或 (1 - tcost)把滑点和手续费放进每一笔交易不要等最后一次性扣费。5.4 加仓间距写成固定值波动率一变仓位逻辑就乱现象同一套参数跑不同品种有的品种很快就买满 4 个单位有的品种几个月都加不了仓。原因把 0.5N 写成了 0.5 * 入场时的 N或者干脆写死成固定百分比而不同品种、不同时段的 N 值可以差出好几倍。解决加仓间距必须跟随最新的 atr 计算也就是每次加仓后用next_add next_add 0.5 * atr_now而不是next_add next_add 固定值。同时注意加仓触发价和止损价要使用同一个 N 值口径否则止损会被加仓操作推来推去出现逻辑自相矛盾。5.5 权益漂移仓位单位数天天变回测不可复现现象同一段行情、同一套参数连续跑两次回测结果不一致或者把动态权益改成固定权益后策略从盈利变成亏损。原因unit_size 每天用最新账户权益计算盈利后仓位自动变大亏损后仓位自动缩小加仓决策的顺序跟着改变产生蝴蝶效应。解决回测阶段把fixed_equity固定在初始权益让单位数与回测过程中的浮盈浮亏解耦实盘再改成动态权益但必须在代码里写清楚口径。如果最终决定用动态权益就每次在加仓或入场那一刻记录当时的总权益作为该笔交易的风险基数不要在每根 K 线都重算。6. 最后一道关用四个指标决定要不要照着海龟策略投入6.1 指标拆分别被资金曲线的斜率骗了把回测跑通之后你手里会有一堆交易记录和一条资金曲线。我的习惯是忍住不看曲线形状先把四张表算出来年化收益率、最大回撤、盈利因子、交易次数。曲线是会骗人的尤其是行情好的年份任何趋势策略都可以画出像模像样的净值图但这四个指标能暴露策略的真实脾气。指标参考阈值判读要点年化收益率大于 15%扣除成本后仍有正收益才有继续投入的必要最大回撤小于 30%超过 30% 意味着实盘中大概率拿不住单盈利因子大于 1.5总盈利除以总亏损低于 1.2 基本是亏手续费交易次数每年 20 到 80 次太少则样本不足太多说明被震荡反复打脸海龟法则的典型特征是低频、单笔大赚、连续小亏。如果跑下来的交易次数每年超过 100 次大概率是入场信号被过滤条件搞得太敏感或者复用了当天的通道值产生大量假突破如果交易次数少于 10 次说明 250 日过滤器可能太严样本不足以证明策略有效。盈利因子低于 1.3 的版本我一般直接放弃调参因为再怎么优化参数交易成本也会吃掉那点微薄的优势。我自己的一个习惯是跑完第一轮后把 entry 参数从 20 改成 10 和 40 各跑一遍看结果是不是剧烈变化。如果 10、20、40 三条资金曲线形态完全不同说明策略过拟合到了某段行情不是真正的“海龟逻辑”在起作用如果三者差异不大只是收益和回撤略有增减那么这个方向才值得继续投入精力。永远不要拿单一参数的回测结果做决策海龟法则真正的价值在于仓位管理和退出纪律而不是某一个神奇的数字。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

open-code-review:本地优先、可插拔的轻量级代码评审工具实践

open-code-review:本地优先、可插拔的轻量级代码评审工具实践

1. 从“代码评审”这件事说起:为什么我又造了一个轮子代码评审这件事,做过几年开发的人大概都有话说。团队里推行评审制度,初衷是好的——早发现问题、统一代码风格、促进知识共享。但实际跑起来,往往变成两种极端:要么…

📅 2026/10/12 13:03:51
天池二手车价格预测实战:从数据清洗到模型融合全流程

天池二手车价格预测实战:从数据清洗到模型融合全流程

简介:这份资源面向数据挖掘与机器学习学习者,围绕天池「二手车交易价格预测」赛题提供一套完整的建模实践材料,适合希望系统掌握回归预测流程、提升特征工程与模型融合能力的中高级选手。压缩包共22个文件,约65.01MB,涵…

📅 2026/10/12 13:03:51
一人公司全链路AI内容获客工作流实战指南

一人公司全链路AI内容获客工作流实战指南

1. 项目概述:为什么“一人公司”必须重构内容获客的底层逻辑“必备 AI 工具:一人公司全链路内容获客实战工作流”——这个标题里没有一个生僻词,但每个词都踩在当下真实创业者的神经末梢上。“一人公司”不是浪漫主义的自由职业幻想&#xff…

📅 2026/10/12 13:03:51
MORE NEWS

更多资讯

📰

游戏引擎基础系统搭建:内存管理与容器设计实战

1. 引擎基础系统到底在搭什么架子很多人第一次翻引擎源码,看到一堆Core、Foundation、Base之类的目录就头大,觉得这些代码跟“把画面渲染出来”这件事八竿子打不着。但真做过项目的人都知道,一个引擎能不能扛住长期迭代,八成取决于…

📰

Windows下Tesseract OCR库:编译验证与C++/Python接入实战

简介:Windows 平台下,开源光学字符识别引擎 Tesseract 功能强大,但自行编译往往需要配置各类依赖库,过程繁琐且容易出错。这份已编译完成的 64 位版本,免去上述工作,压缩包内同时提供了用于图像预处理的 Le…

📰

代码审查最佳实践:从流程设计到审查清单的落地指南

代码审查这件事,值得每个团队认真做一次先聊聊为什么我会写 open-code-review 这个主题。干开发这些年,我见过不少项目死在“代码没人看”上——上线前靠一个人熬夜兜底,出了问题在群里互相甩锅,新人写的代码和老架构完全不搭调&a…

📰

LL(1)语法分析器实验详解:First集、Follow集与预测分析表构建

简介:面向编译原理课程 LL(1) 语法分析器实验的完整资源包,适合计算机专业本科生完成课程设计、实验报告撰写或考前复习。资源围绕输入 LL(1) 文法后构造预测分析表、判定输入串是否为文法句子这一核心任务,提供了从语法分析程序设计思想、源…

📰

FastAPI实现软删除:从字段设计到查询过滤的完整实践

刚入行做后端的时候,我写DELETE端点那叫一个痛快,一句话await db.delete(obj)直接把数据从表里抹掉。直到有次在生成环境误删了一张业务表的关键记录,客户那边又拿不出备份,从那以后我给项目做删除功能就再也没敢“硬删过”。在Fa…

📰

豆瓣影评情感分析:朴素贝叶斯文本分类实战

简介:面向人工智能与自然语言处理初学者的情感分析实践项目,聚焦豆瓣Top250影评数据,基于朴素贝叶斯分类器完成正负面情感判别。资料涵盖Scrapy爬虫采集的约5万条影评语料,好评差评比例均衡,并按照4:1划分训练集与测试…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬