✏️ 编者按:
在股市里,光是一支股票,其 K 线、形态、指标就已经含有丰富的信息,更何况股市里有大几千支股票,各种信息令人眼花缭乱。普通散户到底如何全盘分析,选出一支潜力股?
向量搜索领域的技术大牛、业余股民老莫给出了他的答案:他尝试将复杂的数组转化成向量,然后使用开源向量数据库 Milvus 辅助分析股票,为「选股」这一世纪难题给出了量化分析选股的思考角度。当今时代,各个领域的数据体量和种类呈几何式增长,为了分析海量的结构化与非结构化数据,将数据转化成高维向量并进行向量相似度分析已逐渐成为一种行之有效的方式。
本文转载自知乎用户 @yhmo,已获得原作者授权。
原理
日期 | 开盘价 | 最高价 | 最低价 | 收盘价 |
20.82 | 21.54 | 20.53 | 21.15 | |
21.28 | 21.37 | 21.01 | 20.67 | |
20.73 | 21.35 | 20.67 | 21.25 |
日期 | 开盘价 | 最高价 | 最低价 | 收盘价 |
6.32 | 6.58 | 6.28 | 6.56 | |
6.3 | 6.53 | 6.26 | 6.36 | |
6.18 | 6.39 | 6.13 | 6.31 |
准备工作

import tusharedef fetch_stock(dir, stock_id, date):current_path = dir + str(date) + "/"if not os.path.exists(current_path):os.mkdir(current_path)data = tushare.get_hist_data(stock_id, start='2010-01-01', end=str(date))# print(data)csv_path = current_path + stock_id + ".csv"if os.path.exists(csv_path):os.remove(csv_path)data.to_csv(csv_path, encoding="utf-8", index=True, mode='a')print('save csv:', csv_path)
提取数据
下一步就是开始提取“历史上发生大涨之前的 n 天形态”了。笔者这里把 n 设为 100,也就是 100 个交易日,大约是 5 个月时间。然后把“大涨”的标准定义一下,笔者是这么定义的:在 5 个交易日里股价上涨了 40%,就认为是“大涨”,并且在大涨之前 100 天里最后 10 天的均价低于头 10 天的均价(这是因为笔者希望得到那些从底部涨起的股票)。根据这个定义,笔者在历史数据中一共找出了将近 3000 个股票,这里笔者忽略掉了 ST 股(Special treatment,财务状况或其它状况出现异常的上市公司股票股票)。


选股
===== 300207 : 欣旺达 ===== 1id: 6008440020050422 distance: 101.06045532226562===== 600340 : 华夏幸福 ===== 2id: 0026950020170608 distance: 118.332275390625===== 688313 : 仕佳光子 ===== 3id: 6002730020120717 distance: 124.2621841430664===== 603283 : 赛腾股份 ===== 4id: 0008760020100722 distance: 134.43807983398438===== 603920 : 世运电路 ===== 5id: 0026280020180719 distance: 135.54197692871094它们的盈利情况是:
No.1 300207 欣旺达5 days growth: 9.86 (-0.47, 1.82, -4.4, 5.89, 7.02, )10 days growth: 11.709999999999999 (-0.47, 1.82, -4.4, 5.89, 7.02, 3.16, 0.69, -2.0, )No.2 600340 华夏幸福5 days growth: 4.450000000000001 (10.05, -1.74, -0.29, -0.59, -2.98, )10 days growth: 6.040000000000001 (10.05, -1.74, -0.29, -0.59, -2.98, -0.61, -1.08, 3.28, )No.3 688313 仕佳光子5 days growth: -5.04 (-0.23, -0.29, 0.59, -4.2, -0.91, )10 days growth: 2.1700000000000004 (-0.23, -0.29, 0.59, -4.2, -0.91, 5.65, 1.16, 0.4, )No.4 603283 赛腾股份5 days growth: -12.1 (-0.42, -2.85, -2.57, -2.11, -4.15, )10 days growth: -7.239999999999999 (-0.42, -2.85, -2.57, -2.11, -4.15, 0.69, 1.72, 2.45, )No.5 603920 世运电路5 days growth: -9.040000000000001 (-0.18, -1.58, 1.49, -4.29, -4.48, )10 days growth: 2.0599999999999987 (-0.18, -1.58, 1.49, -4.29, -4.48, 10.03, -2.28, 3.35, )对于第一名的 300207,结果显示它跟 600844 的 2005 年 4 月 22 日的前100天相似度距离为 101,后续 5 到 10 天的盈利为 10% 左右。我们先看一下 600844 的 2005 年 4 月 22 日的前 100 天(笔者使用 Python 的 mpl_finance 库以及 Matplotlib 库来绘制蜡烛图):
再来看看 300207 的 2021 年 4 月 6 号之前 100 天的行情:
简直神似,对不对?在回溯实验中也看到不少排名靠前,但后期却还继续下跌的股票。比如,上面第 4 名的 603283,在后续 10 个交易日里又继续下跌了 10% 左右。我们可以想到,虽然和历史上的大涨形态相似,但这只股票还没跌够,还处于下跌趋势中,我们需要根据其他的因素来判断,比如量价的变化,基本面的变化等等。
结论
总体来说,笔者的做法大致是以下几个步骤:以某种条件定义股票大涨,根据这些条件在历史数据中提取特征 4n 维向量,输入 Milvus 数据库中;从最新的股票行情里遍历每只股票,构建近期的 4n 维向量,大约 4000 条(剔除 ST 股);对第 2 步得到的 4000 条向量,在 Milvus 数据库中搜索最相似的 Top1,只取距离最小的前若干名;对第 3 步得到的前几名若干只股票,做进一步研判。
对股票感兴趣的朋友,希望这篇文章能够对他们有帮助,同时也希望 Milvus 能在这个领域有所帮助。笔者虽然研究过一段时间的股票,不过属于三脚猫的那种水平,如有不当请多担待。注:Milvus 数据库
应用面非常广泛,可以解决很多日常生活中的数字问题,不仅限于辅助选股
。需要注意的是,本文
写于约半年前,文中推荐的五支股票现在有两支跌得很惨,所以本文并不是财经指导类文章,而是一个采用数据分析方法进行的炒股实验。
欢迎大家一起探索更多 Milvus 数据库的打开方式!
解锁更多应用场景最后修改时间:2021-11-09 08:22:10
文章转载自ZILLIZ,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





