简介:六神算法34版本纯算源码包整合了抖音算法核心加密与签名生成逻辑,面向有Python基础的算法研究者、爬虫工程技术人员,兼顾算法学习、签名逆向与二次开发场景,并非开箱即用的现成工具,更适合需要深入理解内部实现的人群。包内共58个文件,涵盖32个pyc编译产物、21个py源码、3个dll动态库与2个txt说明,压缩包约12.59MB;py文件保留AES_V3类、branch_2等实现,可查看SM3、MD5、query_sm3/body_md5等数据处理细节,pyc便于在对应Python环境下直接运行或对照阅读,dll补充滑块相关能力,txt更新说明辅助版本对照。已有1883人学习下载,适合需要分析抖音签名流程、研究加密算法实现或排查签名生成问题的读者。借助完整源码与模块化工具函数(旋转、加密、哈希等),可快速理解整体调用链,省去逆向整理时间;资源内还包含签名API示例、环境依赖文件与测试脚本,便于直接验证算法结果,整体目录按功能模块组织,也能按需修改、调试并集成到自身项目中。
1. 六神算法34版本纯算源码:从“能跑”到“敢用”,差的是你自己拆一遍
股票量化圈里,“六神算法34版本纯算源码”是个自带流量的话题。有人说它是选股神器,有人拿它当黑匣子,跑出一张清单就直接买。我的建议是反过来:先别急着信结果,先把它拆开看一遍。这个标题里真正值钱的不是“六神”这个名字,而是“纯算源码”这四个字——它意味着没有隐藏的数据库调用、没有行情软件插件、没有闭环黑盒,只有一堆可以逐行读的数学逻辑。六神算法本质上是一套基于六个独立计算链路的规则评分系统,版本34代表它在参数和边界处理上已经迭代了很多轮。它解决的核心问题很明确:只用日线级别数据,在无第三方依赖的条件下,生成一个可解释、可复现的候选股票池。适合谁?适合那些已经能导出日线数据、想自己掌控因子逻辑的从业者,不适合只想抄作业、不想看代码的人。
2. 拆开“六神”这个词:六条计算链路与纯算边界
2.1 所谓“六神”,是六条独立计算链路而不是一个黑箱模型
“六神”这名字听着玄学,代码里其实一点都不玄。它就是把选股逻辑拆成了六个维度,每个维度是一段独立的计算链路,最后做加权求和。这六个链路我按源码里的常规定义整理如下:
- L1 趋势位置:计算收盘价相对短期均线和长期均线的位置,判断当前价格处于趋势的什么阶段。
- L2 动量强度:用 ROC(变动率指标)衡量一段时间内的涨跌加速度,分值越高代表动量越强。
- L3 量能配合:比较当日成交量与近期均量的关系,再结合当日涨跌方向,确认放量是否有效。
- L4 波动收缩:用近期振幅或 ATR 的百分比变化衡量波动是在收窄还是放大,收窄通常被视为蓄势。
- L5 流动性质量:对成交金额的绝对值与稳定性打分,过滤掉日成交额过低、容易被资金操控的标的。
- L6 相对强度:把个股的区间涨幅放在全体股票里做分位数比较,衡量它相对市场其他股票是强是弱。
这六个模块在代码里各自是一个函数,输入是同一份 OHLCV 数据,输出是一个 0 到 100 之间的子分。源码的骨架结构通常长这样:
def score_trend(closes, period_short=5, period_long=20): """L1 趋势位置打分:收盘价在均线系统中的相对位置""" ma_short = sum(closes[-period_short:]) / period_short ma_long = sum(closes[-period_long:]) / period_long if ma_long == 0: return 50.0 # 价格在短均线上方、短均线在长均线上方时给高分 pos_score = (closes[-1] - ma_short) / ma_short * 100.0 align_score = (ma_short - ma_long) / ma_long * 100.0 return max(0.0, min(100.0, 50.0 + pos_score * 2.0 + align_score * 2.0))这里每个参数后面都必须说清楚:period_short和period_long是均线周期,直接影响趋势判断的敏感度;返回值被钳制在 0 到 100 之间,防止极端行情把子分拉爆。六神算法 34 版本里最核心的设计就是:六个子分独立计算,最后按权重汇总,而不是像神经网络那样把特征全部揉在一起。这样做的好处是每个环节都能单独验证,坏处是权重设置会直接影响最终排序。
2.2 “纯算”在代码层面意味着什么:无库依赖的数值实现
“纯算”这两个字,我在源码里读到的意思是:只用基础数学函数完成全部计算,不做绘图、不连数据库、不依赖任何第三方金融库。你拿到这份源码之后,不需要安装 TA-Lib、不需要调通达信接口,只要能把日线数据从任何行情软件里导出成 CSV,就能跑。
为了验证这一点,我通常会把计算均线的部分从 pandas 写法改成纯 Python 写法,这样更容易移植到不支持 pandas 的环境里。比如某段量能模块的代码,常见做法是:
def score_volume(volumes, window=5): """L3 量能配合打分:当日量 / 前 N 日均量""" if len(volumes) < window + 1: return 50.0 avg_vol = sum(volumes[-window-1:-1]) / window if avg_vol == 0: return 0.0 ratio = volumes[-1] / avg_vol if ratio >= 2.0: return 100.0 if ratio >= 1.5: return 80.0 if ratio >= 1.0: return 60.0 return 30.0逻辑说明:窗口一般取 5,代表对比前 5 个交易日的平均成交量;volumes[-window-1:-1]取的是当日之前的那 5 天,目的是排除当日量对均值的干扰。ratio是当日量相对均量的倍数,倍数越高说明放量越明显,但这个模块只负责打分,最终要不要买入还要看其他模块的配合。纯算源码里大量使用这种分段打分,参数都集中在文件头部的配置区里,改起来非常直接。
2.3 版本34相对旧版的变化,以及为什么它反而难移植
版本 34 这套东西,我拿它和网上流传的一些老版本对过,发现最大的改动不在因子本身,而在两个地方:一是边界条件处理,二是参数默认值。
旧版本里经常出现上市不足 60 天的股票因为数据量不够而计算出极端分数,版本 34 在代码里加了最小样本量判断,比如趋势模块至少需要 25 根 K 线,不足就直接给中性分 50,不让它参与排名。另一个改动是流动性模块的阈值,从固定的“成交额大于 5000 万”改成了按全市场分位数动态计算,这样在不同市况下不会出现要么全是股票、要么全被过滤掉的情况。
这里有一个表,是我整理的两个版本之间比较明显的变化:
| 参数/逻辑 | 旧版本(常见) | 版本34 | 影响方向 |
|---|---|---|---|
| 最小K线数量 | 无,直接计算 | 各模块按需检查 | 减少次新股误报 |
| 流动性阈值 | 固定成交额 | 全市场分位数 | 适应不同市值环境 |
| 波动收缩 | 只看ATR绝对值 | 看ATR百分比变化 | 适配不同价格区间个股 |
| 权重配置 | 散落在各函数 | 集中在顶部配置区 | 调参搜索更方便 |
版本 34 难移植的点在于:它虽然“纯算”,但数据预处理必须在调用前完成。比如复权处理、停牌过滤、ST 过滤,这些都不在源码里,需要你在外层先处理好。很多人把源码直接拿去跑,跑出来的结果跟帖子对不上,十有八九是数据预处理这一步的口径不一致。
3. 把六神算法34跑出第一张选股清单:最小数据与最小流程
3.1 准备数据:最少需要的字段和格式
六神算法 34 版对数据的要求很克制,不需要分钟线、不需要资金流、不需要龙虎榜,只要日线的 OHLCV 加上成交额。我一般会把数据整理成 CSV 格式,字段顺序固定如下:
| 字段名 | 类型 | 说明 | 是否必须 |
|---|---|---|---|
| date | string | 日期,格式 YYYY-MM-DD | 是 |
| code | string | 股票代码 | 是 |
| open | float | 开盘价 | 是 |
| high | float | 最高价 | 是 |
| low | float | 最低价 | 是 |
| close | float | 收盘价(复权后) | 是 |
| volume | int | 成交量(股) | 是 |
| amount | float | 成交额(元) | 是 |
这里最容易踩坑的是复权。我建议在导出数据时直接选择前复权,并且所有股票用同一套复权方式,不要把一部分用前复权、一部分用后复权。源码没有帮你处理除权跳空,它默认你喂进去的价格序列是连续的。
3.2 最小运行脚本:从CSV到打分输出
假设你的数据已经整理成上面的格式,下面的脚本就是一个最小可运行的六神算法打分流程。它不依赖 pandas,只用 Python 标准库,正好符合“纯算”的定位:
import csv import math from collections import defaultdict def load_csv(path): rows = [] with open(path, 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for r in reader: rows.append({ 'code': r['code'], 'date': r['date'], 'close': float(r['close']), 'high': float(r['high']), 'low': float(r['low']), 'volume': float(r['volume']), 'amount': float(r['amount']) }) return rows def score_trend(closes, short=5, long=20): if len(closes) < long + 1: return 50.0 ma_s = sum(closes[-short:]) / short ma_l = sum(closes[-long:]) / long if ma_l == 0: return 50.0 score = 50.0 + (closes[-1] - ma_s) / ma_s * 100 * 2 + (ma_s - ma_l) / ma_l * 100 * 2 return max(0.0, min(100.0, score)) def score_momentum(closes, period=12): if len(closes) <= period: return 50.0 rate = (closes[-1] - closes[-period-1]) / closes[-period-1] * 100 return max(0.0, min(100.0, 50.0 + rate * 5)) def main(): rows = load_csv('daily_data.csv') by_code = defaultdict(list) for r in rows: by_code[r['code']].append(r) results = [] for code, bars in by_code.items(): if len(bars) < 30: continue closes = [b['close'] for b in bars] trend = score_trend(closes) momentum = score_momentum(closes) total = trend * 0.4 + momentum * 0.6 results.append({'code': code, 'trend': trend, 'momentum': momentum, 'total': total}) results.sort(key=lambda x: x['total'], reverse=True) for item in results[:20]: print(f"{item['code']} total={item['total']:.2f} " f"trend={item['trend']:.2f} momentum={item['momentum']:.2f}") if __name__ == '__main__': main()这段代码的逻辑说明:main()先把 CSV 读进来,然后按股票代码分组,每组至少要有 30 根 K 线才开始计算;score_trend和score_momentum分别是 L1 和 L2 模块的最简实现,返回值永远落在 0 到 100 之间;最终总分是趋势和动量的加权和。这里的权重 0.4 和 0.6 只是演示,真正用六神算法 34 版本时,要在配置区把所有六个模块的权重都加进去,并且权重要归一化。
参数说明:short=5和long=20是均线周期,短线交易可以把short调到 3,趋势交易可以调到 10;momentum的period=12是动量回看周期,周期越短越敏感,但误报也会越多。
3.3 输出结果字段解读:total分、子分、排名分别意味着什么
运行完上面的脚本后,你会得到类似下面的输出:
600519 total=78.32 trend=82.10 momentum=74.50 000858 total=76.11 trend=70.33 momentum=80.00每一行代表一只股票在当天的六神综合评分。total是最关键的排序字段,它决定股票最终出现在清单的哪个位置;trend和momentum是子分,用来定位这只股票到底强在哪个维度。我在实际操作中不会只看 total,而是会把子分也记录下来。如果一只股票 total 很高但动量分很低,说明它是靠趋势位置撑起来的,这种票往往已经涨了一大段,追高风险大。
源码里还有一个 output_mode 参数,常见做法有三种:normal 输出全部股票、top_n 只输出排名前 N 只、threshold 输出 total 大于某个值的股票。版本 34 默认使用 top_n 模式,N 通常设在 20 到 50 之间。需要注意的是,这里输出的清单只是“候选池”,不是买卖信号本身,买入决策还要结合大盘环境、板块归属和止损规则。
4. 六神算法34的核心参数:调参顺序与敏感度记录
4.1 权重参数:六个子分的相对地位不能拍脑袋
六神算法 34 版本把六个模块的权重全部集中在一个配置区里,这是它比旧版好用的重要原因。我见过很多人调参是觉得哪个模块“高级”就给它高权重,这是典型的直觉陷阱。正确顺序是先确定你要选的是什么风格的股票:做趋势跟随就把 L1 和 L2 权重调高;做强势股回调就调高 L4 波动收缩权重;小资金怕流动性问题就调高 L5。
一份常用的权重模板如下:
| 模块 | 权重 | 适用场景 |
|---|---|---|
| L1 趋势位置 | 0.20 | 趋势跟随 |
| L2 动量强度 | 0.25 | 强势股筛选 |
| L3 量能配合 | 0.15 | 放量确认 |
| L4 波动收缩 | 0.15 | 横盘蓄势 |
| L5 流动性质量 | 0.10 | 过滤小票 |
| L6 相对强度 | 0.15 | 全市场横向对比 |
这组权重加起来等于 1,源码在读取配置时会做归一化检查,如果你给的权重和不为 1,它不会报错,但会强制归一化。这里有个我踩过的坑:权重设得太接近会导致排名分差很小,比如 top 20 里第一名和第十名只差 0.3 分,这种结果不稳定,第二天可能大幅变动。解决办法是人为拉开差异,把你看中的那个模块权重加高至少 0.1。
4.2 周期参数:快线、慢线和动量回看窗口
除了权重,第二类关键参数是周期。版本 34 里的周期参数主要有四组:短期均线周期short_ma、长期均线周期long_ma、动量回看窗口mom_period、量能对比窗口vol_window。
我自己的调参习惯是:先用默认参数跑一遍,记录结果;然后单独把short_ma从 5 改成 3、7、10,其他不动,再跑一遍,看 top 20 名单的变化幅度。如果变化非常剧烈,说明这个参数敏感度很高,需要多测几个值取稳定区间。
下面是敏感度记录模板:
| 参数 | 尝试值 | 观察指标 | 我的记录 |
|---|---|---|---|
| short_ma | 3 / 5 / 7 / 10 | top20重合度 | 7和10重合度超80%,3明显偏低 |
| mom_period | 6 / 12 / 24 | 上榜股票持股周期 | 12更适合周线级别持有 |
| vol_window | 3 / 5 / 10 | 放量信号频率 | 10频率过低,3噪声大 |
周期参数没有绝对正确,只有适合不适合你的交易周期。做短线、持股 3 到 5 天的人,mom_period用 6 或 12;做波段、持股 1 到 3 个月的人,用 24 更合适。源码里默认 12,属于中间值。
4.3 手工网格调参:不写复杂框架也能做
这一部分非常重要。我不建议一开始就上自动寻优工具,因为六神算法是规则模型,子分不是平滑的,小参数变化可能导致结果跳变。手工网格调参更可控。
一个常见的做法是写一个两层循环,分别遍历权重和周期,每次运行后把 top20 的股票代码存成文本文件:
import itertools def run_with_params(short_ma, long_ma, mom_period, w1, w2, w3, w4, w5, w6): # 这里调用六神算法源码的主入口,返回 top20 代码列表 pass # 只固定遍历两组参数,避免组合爆炸 for short_ma in [3, 5, 7]: for mom_period in [6, 12, 24]: top20 = run_with_params(short_ma, 20, mom_period, 0.20, 0.25, 0.15, 0.15, 0.10, 0.15) file_name = f"top20_sm{short_ma}_mp{mom_period}.txt" with open(file_name, 'w') as f: f.write("\n".join(top20))逻辑说明:这里故意只遍历两个维度,因为同时遍历四五个参数会导致组合数爆炸,而且结果难解释。每次跑完把 top20 存成文件,最后比对各文件的名单重合度;重合度高的参数区间说明稳定,重合度低的参数值就要警惕过拟合。参数调优这件事,罗马不是一天建成的,没有人能一次调对。
5. 六神算法34运行与移植的常见坑:看现象、找原因、给修复
5.1 复权口径不一致导致选股漂移
现象:同样一份源码、同样一段时间,别人跑出来的 top20 和我的完全对不上,差异不是一两只,而是大面积不同。
原因:数据源在导出时用了不同的复权方式。我用的前复权,对方用的后复权,除权除息日前后计算的均线和动量值完全不同。六神算法里的趋势和动量模块对价格连续性极其敏感,一个跳空就能改变评分。
解决:统一复权口径,并且统一复权基准日。推荐使用前复权,因为它更贴近当下真实价格。导出数据后做一个检查:随机找一只近期除权过的股票,看它的复权后价格是否为连续曲线,如果有明显断崖,说明数据源有问题。注意:如果你做的是历史回测,前复权数据在回测区间的早期段会出现不真实的负价格或极低价格,这时候要改用后复权做回测,实盘选股时再换回前复权。
5.2 浮点精度在 Windows 和 Linux 下不一致
现象:在 Windows 上跑出的 total 分是 78.3214,在 Linux 服务器上跑出 78.3216,排名靠后的股票因为这两分差距出现顺序变动。
原因:底层浮点运算的精度舍入在不同操作系统上存在微小差异,六神算法里大量使用乘法和除法,误差被逐步累积。
解决:在源码的汇总环节增加一次四舍五入,例如所有子分保留 2 到 4 位小数,再参与加权;输出 total 时统一用round(score, 4)。另外,尽量避免用x / y * z这种顺序,改成x * z / y,乘除顺序的改变在浮点计算里会产生不同结果。这不是玄学,是 IEEE 754 浮点标准下的真实差异。
5.3 全量加载导致内存占用过高
现象:跑全市场 5000 只股票时,程序一开始就占掉几个 GB 内存,跑了几百只之后开始卡顿,甚至被系统杀掉。
原因:很多人会把整个 CSV 一次性读进内存,再用groupby分组,相当于同一个数据对象在内存里存了两份。六神算法本身不复杂,但这种错误写法会让它变成一个内存黑洞。
解决:按股票代码流式处理,每读入一只股票的完整数据就立即计算并释放。我在实际代码里是先把 CSV 中的 code 字段遍历一遍,得到去重后的代码列表,再逐只读取对应行。这样内存占用峰值不到全量加载的十分之一。如果数据文件太大,就直接用 SQLite 按 code 索引查询,效果一样。
5.4 参数过拟合到历史极端行情
现象:在某一段牛市数据上调出的参数特别漂亮,选股胜率超过 70%,换到震荡市立刻失效,胜率掉到 30%。
原因:参数搜索时只用了同一段历史数据,六神算法里的趋势和动量模块天然在单边行情中表现好,一旦行情风格切换,原来的阈值就会误判。
解决:调参时必须把数据分成至少两段,一段用于参数搜索,一段用于样本外验证。具体做法是取 2019 到 2021 年做训练段,取 2022 到 2024 年做验证段,两组数据都表现稳定的参数才值得保留。另外,不要追求历史最优参数,要选一段相对平庸行情里仍然能跑的参数。
5.5 停牌股和上市不足N日的新股导致计算异常
现象:某只股票停牌三个月后复牌,当天的收盘价和成交量异常放大,直接冲进 top20,但它的动量指标已经失真。
原因:源码默认你喂进去的数据是连续的,停牌期间没有行情数据,复牌首根 K 线的动量计算会把停牌前的价格当成基准,算出一个极端值。
解决:停牌股的典型特征是当日成交量为 0 或日期不连续,数据处理阶段直接过滤掉当天成交量为 0 的股票。另外,对每个上市不足 60 日的股票,在计算时强行跳过,或给它一个低流动性标签,避免它靠极端波动打进榜单。版本 34 源码里已经有最小 K 线数量判断,但我通常在外层再做一道过滤,双重保险。
6. 验证六神算法34的产出是否可靠:分年分组回测与样本外检查
6.1 分年分组,判断收益来源是算法还是行情
验证六神算法 34 是否有效,我常用的方法是把回测结果按年份和股票风格分组,对比每一组的超额收益。光看总收益没有意义,要分清收益来自算法本身的选股能力,还是单纯因为那一年赶上普涨行情。
分年对比表格的做法如下:
| 年份 | 六神top30平均涨幅 | 全市场平均涨幅 | 超额收益 |
|---|---|---|---|
| 2021 | 23.5% | 18.2% | +5.3% |
| 2022 | -8.4% | -12.1% | +3.7% |
| 2023 | 11.2% | 9.5% | +1.7% |
| 2024 | 15.8% | 13.4% | +2.4% |
如果超额收益在每一年都为正,说明算法有效;如果只在单边上涨年份为正,在震荡年份为负,那它本质上不是选股能力,只是顺势暴露。我自己的判断标准是:样本外年份至少要有两年超额收益为正,才值得把参数固化下来。
6.2 一个值得长期保留的验证习惯
在把六神算法 34 版本投入实盘之前,最后一步要把验证日期固定住。也就是每次选股,都要记录当时的参数版本号、数据截止日期、top 名单,留到最后做复盘。这里我自己的教训是:参数不能频繁改。改一次要重新做一整轮样本外验证,否则你根本搞不清到底是行情好了,还是参数确实变好了。如果你今天调一次、明天调一次,最终结果就是每次都对着历史数据优化,实盘永远在追赶行情。
六神算法 34 版本不是圣杯,它只是一个规则透明的选股工具。真正让它产生价值的,是你对它的每一次修改都有据可查、每一个参数都经过样本外检验。希望这个拆解和踩坑记录能帮到你,让你在拿到任何一套“纯算源码”时,不再依赖别人贴出来的结果,而是敢自己动手跑通、验证,并把它变成自己的东西。
本文还有配套的精品资源,点击获取