☰
六神算法34版纯算源码拆解:量化选股与参数调优实战
2026/10/3 10:51:47 网站建设 项目流程

简介:六神算法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 所谓“六神”,是六条独立计算链路而不是一个黑箱模型

“六神”这名字听着玄学,代码里其实一点都不玄。它就是把选股逻辑拆成了六个维度,每个维度是一段独立的计算链路,最后做加权求和。这六个链路我按源码里的常规定义整理如下:

  1. L1 趋势位置:计算收盘价相对短期均线和长期均线的位置,判断当前价格处于趋势的什么阶段。
  2. L2 动量强度:用 ROC(变动率指标)衡量一段时间内的涨跌加速度,分值越高代表动量越强。
  3. L3 量能配合:比较当日成交量与近期均量的关系,再结合当日涨跌方向,确认放量是否有效。
  4. L4 波动收缩:用近期振幅或 ATR 的百分比变化衡量波动是在收窄还是放大,收窄通常被视为蓄势。
  5. L5 流动性质量:对成交金额的绝对值与稳定性打分,过滤掉日成交额过低、容易被资金操控的标的。
  6. 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 格式,字段顺序固定如下:

字段名类型说明是否必须
datestring日期,格式 YYYY-MM-DD是
codestring股票代码是
openfloat开盘价是
highfloat最高价是
lowfloat最低价是
closefloat收盘价(复权后)是
volumeint成交量(股)是
amountfloat成交额(元)是

这里最容易踩坑的是复权。我建议在导出数据时直接选择前复权,并且所有股票用同一套复权方式,不要把一部分用前复权、一部分用后复权。源码没有帮你处理除权跳空,它默认你喂进去的价格序列是连续的。

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_ma3 / 5 / 7 / 10top20重合度7和10重合度超80%,3明显偏低
mom_period6 / 12 / 24上榜股票持股周期12更适合周线级别持有
vol_window3 / 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平均涨幅全市场平均涨幅超额收益
202123.5%18.2%+5.3%
2022-8.4%-12.1%+3.7%
202311.2%9.5%+1.7%
202415.8%13.4%+2.4%

如果超额收益在每一年都为正,说明算法有效;如果只在单边上涨年份为正,在震荡年份为负,那它本质上不是选股能力,只是顺势暴露。我自己的判断标准是:样本外年份至少要有两年超额收益为正,才值得把参数固化下来。

6.2 一个值得长期保留的验证习惯

在把六神算法 34 版本投入实盘之前,最后一步要把验证日期固定住。也就是每次选股,都要记录当时的参数版本号、数据截止日期、top 名单,留到最后做复盘。这里我自己的教训是:参数不能频繁改。改一次要重新做一整轮样本外验证,否则你根本搞不清到底是行情好了,还是参数确实变好了。如果你今天调一次、明天调一次,最终结果就是每次都对着历史数据优化,实盘永远在追赶行情。

六神算法 34 版本不是圣杯,它只是一个规则透明的选股工具。真正让它产生价值的,是你对它的每一次修改都有据可查、每一个参数都经过样本外检验。希望这个拆解和踩坑记录能帮到你,让你在拿到任何一套“纯算源码”时,不再依赖别人贴出来的结果,而是敢自己动手跑通、验证,并把它变成自己的东西。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询