用聚类算法计算股票的支撑位和阻力位

Python --相似K线匹配--实现股票走势预测 Tushare Python --相似K线匹配–实现股票走势预测 Tushare 前言 同花顺和东方财富都提供了一个免费的功能可以查找相似走势的K线,提供参考。差不多,东方财富可以选择分析的周期,同花顺是固定120日的分析周期。我们可以通过tushare的数据源获取历史交易数据自己实现一个类似功能。 一、获取历史交易数据 1.引入库,读取历史交易数据 Tushare是一个免费、开源的python财经数据接口包。注册用户后到个人中心改一下名字获取积分,基本的功能都可以用了。大家可以用我的邀请码注册 ①首先要安装tus 阅读详情

本文将向您展示如何使用不同的聚类算法计算股票支撑位和阻力位。

股票数据 - 我在 mongoDB 数据库中有股票数据。您还可以免费从雅虎财经获取这些数据。

Python 连接 MongoDB 设置

In [1]:
import pymongo
from pymongo import MongoClient
client_remote = MongoClient('mongodb://localhost:27017')
db_remote = client_remote['stocktdb']
collection_remote = db_remote.stock_data

从 MongoDB 获取股票数据

我将使用过去 60 天的 Google 公司股票 数据进行分析。

In [2]:
mobj = collection_remote.find({'ticker':'GOOGL'}).sort([('_id',pymongo.DESCENDING)]).limit(60)

为数据分析准备数据

我将使用 Pandas 和 Numpy 进行数据操作。让我们首先从 Mongo Cursor 对象获取数据到 Python 列表。

In [3]:
prices = []
for doc in mobj:
    prices.append(doc['high'])

K-means聚类计算股票支撑位和阻力位

In [4]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering

对于 K-means聚类,我们需要将数据转换为 Numpy 数组格式。

In [5]:
X = np.array(prices)

对于K-means聚类来说,K-means聚类的数量非常重要。我们可以使用膝图找到最佳 K值,如下所示。

In [6]:
from sklearn.cluster import KMeans
import numpy as np
from kneed import KneeLocator

sum_of_sq_distances = []
K = range(1,10)
for k in K:
    km = KMeans(n_clusters=k)
    km = km.fit(X.reshape(-1,1))
    sum_of_sq_distances.append(km.inertia_)
kn = KneeLocator(K, sum_of_sq_distances,S=1.0, curve="convex", direction="decreasing")
kn.plot_knee()

让我们使用 kn.knee 检查 K 的值

In [7]:
kn.knee
Out[7]:
3
In [8]:
kmeans = KMeans(n_clusters= kn.knee).fit(X.reshape(-1,1))
c = kmeans.predict(X.reshape(-1,1))
min_and_max = []
for i in range(kn.knee):
    min_and_max.append([-np.inf,np.inf])
for i in range(len(X)):
    cluster = c[i]
    if X[i] > min_and_max[cluster][0]:
        min_and_max[cluster][0] = X[i]
    if X[i] < min_and_max[cluster][1]:
        min_and_max[cluster][1] = X[i]

让我们检查聚类的最小值和最大值。

In [9]:
min_and_max
Out[9]:
[[2461.9099, 2365.55], [2687.98, 2508.0801], [2357.02, 2239.4399]]

上面显示了3个簇,每个簇都有最大值和最小值。

在写本文的时候,谷歌的股价是2687.98(当日最高点),正好也是52周来的最高点。因此,基于上述聚类,我们可以说2687.98是阻力位,下一个支撑水平是2508.0801。下一个支持级别是2461.9099、2365.55、2357.02、2239.4399。

记住,这些支撑位和阻力位将根据数据范围和聚类参数K的值而变化。

用层次聚类计算股票支撑位和阻力位

In [10]:
mobj = collection_remote.find({'ticker':'GOOGL'}).sort([('_id',pymongo.DESCENDING)]).limit(60)
prices = []
for doc in mobj:
    prices.append(doc['high'])

另一种可以使用的方法是凝聚聚类,即层次聚类。

凝聚聚类是一种自底向上的方法,它将子聚类合并以找出大的数据聚类。

层次聚类对股票滚动数据很有用。

让我们创建一个20天的滚动数据,用于计算最大值和最小值。

In [11]:
df = pd.DataFrame(prices)
max = df.rolling(20).max()
max.rename(columns={0: "price"},inplace=True)
min = df.rolling(20).min()
min.rename(columns={0: "price"},inplace=True)

需要以下步骤以两列格式准备数据。

In [12]:
maxdf = pd.concat([max,pd.Series(np.zeros(len(max))+1)],axis = 1)
mindf = pd.concat([min,pd.Series(np.zeros(len(min))+-1)],axis = 1)    
maxdf.drop_duplicates('price',inplace = True)
mindf.drop_duplicates('price',inplace = True)

让我们使用n_clusters=3值来表示聚类数量。

In [13]:
F = maxdf.append(mindf).sort_index()
F = F[ F[0] != F[0].shift() ].dropna()

# Create [x,y] array where y is always 1
X = np.concatenate((F.price.values.reshape(-1,1),
                    (np.zeros(len(F))+1).reshape(-1,1)), axis = 1 )

cluster = AgglomerativeClustering(n_clusters=3,
          affinity='euclidean', linkage='ward')
cluster.fit_predict(X)
F['clusters'] = cluster.labels_

F2 = F.loc[F.groupby('clusters')['price'].idxmax()]

# Plotit
fig, axis = plt.subplots()
for row in F2.itertuples():

    axis.axhline( y = row.price, 
            color = 'green', ls = 'dashed' )

axis.plot( F.index.values, F.price.values )
plt.show()

现在让我们绘制聚类。如下图所示,找到了两个聚类。如果考虑到谷歌今天的收盘价2638.00,我们可以说2687.98是阻力位,2357.02是支撑位。

In [14]:
F2
Out[14]:

这里需要注意的一点是,只有2个聚类的价格是2357.02,这并不是很多。要查看是否可以找到更多的聚类,我们必须增加源数据中的价格点数量,或者增加聚类数量,或者缩小滚动窗口。

让我们将聚类的数量增加到5,看看会发生什么。

In [15]:
F = maxdf.append(mindf).sort_index()
F = F[ F[0] != F[0].shift() ].dropna()

# Create [x,y] array where y is always 1
X = np.concatenate((F.price.values.reshape(-1,1),
                    (np.zeros(len(F))+1).reshape(-1,1)), axis = 1 )

cluster = AgglomerativeClustering(n_clusters=5,
          affinity='euclidean', linkage='ward')
cluster.fit_predict(X)
F['clusters'] = cluster.labels_

F2 = F.loc[F.groupby('clusters')['price'].idxmax()]

# Plotit
fig, axis = plt.subplots()
for row in F2.itertuples():

    axis.axhline( y = row.price, 
            color = 'green', ls = 'dashed' )

axis.plot( F.index.values, F.price.values )
plt.show()

In [16]:
F2
Out[16]:

好的,这次我们以2239.43的价格获得了更多的聚类,这与今天2638的收盘价相去甚远。然而,基于3个聚类,阻力值看起来不错,为2687.98。

让我们把滚动窗口缩小一点。与其说是20天,不如说是10天。

In [17]:
df = pd.DataFrame(prices)
max = df.rolling(10).max()
max.rename(columns={0: "price"},inplace=True)
min = df.rolling(10).min()
min.rename(columns={0: "price"},inplace=True)
maxdf = pd.concat([max,pd.Series(np.zeros(len(max))+1)],axis = 1)
mindf = pd.concat([min,pd.Series(np.zeros(len(min))+-1)],axis = 1)    
maxdf.drop_duplicates('price',inplace = True)
mindf.drop_duplicates('price',inplace = True)
F = maxdf.append(mindf).sort_index()
F = F[ F[0] != F[0].shift() ].dropna()

# Create [x,y] array where y is always 1
X = np.concatenate((F.price.values.reshape(-1,1),
                    (np.zeros(len(F))+1).reshape(-1,1)), axis = 1 )

cluster = AgglomerativeClustering(n_clusters=5,
          affinity='euclidean', linkage='ward')
cluster.fit_predict(X)
F['clusters'] = cluster.labels_

F2 = F.loc[F.groupby('clusters')['price'].idxmax()]

# Plotit
fig, axis = plt.subplots()
for row in F2.itertuples():

    axis.axhline( y = row.price, 
            color = 'green', ls = 'dashed' )

axis.plot( F.index.values, F.price.values )
plt.show()

In [18]:
F2

好的,这个数据看起来好多了。Google的阻力值约为2687.98,支撑位约为2399.03和2412.8799,这与支撑位约为2400相当接近。


觉得还不错就给我一个小小的鼓励吧!


python波峰波谷算法_利用“偏度系数”进行“低买高卖”择时(附Python代码) 点及财经,股票期货专业投机者。前言“低买高卖”,是每一位交易者内心一直所追寻的。有的人认为,“抄底摸顶”是完全不可能的事情,因为如果每个人都去“低买高卖”,那价格走势应该是一种什么状态?无法想象!这样的思想也不无道理,只是忽略了一些东西。虽然,策略做不到每笔都能够“抄底摸顶”成功,但是,只要“概率”上能站在我们这边,就可以尽可能“接近”这一目标。因为,交易最终的目的是赚钱,过程真的不重要!“抄底摸... 阅读详情

相关推荐

通达信主图指标实战:如何用精准线+黑马信号捕捉强势股(附源码)

本文深入解析了如何利用通达信主图指标,结合精准线与黑马信号捕捉强势股的实战方法。通过详细拆解指标源码,阐述了精准线识别关键支撑阻力、黑马信号确认趋势动能的核心理念,并提供了完整的参数优化、实战决策流程及风险控制指南,帮助交易者构建高胜率的短线交易系统。

rgv234567的博客 918

python量化交易第四章

一.数据准备:本地化股票数据 1.1为什么要创建股票数据库 数据费用->按数据量收费,每日更新增量数据 获取速度->本地直接获取>远程访问服务器 1.2如何创建,更新股票数据库 存储方式->股票代码.csv,MySql,MangoDB等数据库 实现思路: 1.获取股票列表 2.依次存储股票数据 3.每天以增量形式更新数据 每天以增量形式更新数据 -> 如何追加数据:df.to_csv(mode=‘a’) 重复获取了怎么办:df.drop_duplicat

weixin_43853077的博客 2178

【Python】用A股当天收盘价去计算下一个交易日涨停价格

A股涨停的价格,不一定正好是10%,而是最靠近10%的数值,因为股价只精确到0.01,没有0.001这个数值,所以,经常会出现不是10%的情况,如下图所示: Python里的… round这个函数,说实话是真的坑…,第三位小数为5的时候,round(x,2),会出现比如 PS C:\Users\Yu> python3 Python 3.6.0 (v3.6.0:41df79263a11, De...

10相濡以沫 3545

python计算股票波动率_构建防御性票组合----利用波动率选股

weixin_39902472的博客 818

Python对股票模型数据分析实例

一、交易准则 在开始之前,我们应该了解最基础的交易系统是什么样,明白自己的交易准则是什么,确定一个自己的交易依据。比如以下六个方面: 1)市场----买卖什么 2)头寸规模----买卖多少 3)入市----何时买入 4)止损----何时退出亏损的头寸 5)止盈----何时退出盈利的头寸 6)离市----何时离市 二、简单的示例 1)买卖A股 2)全仓 3)当日涨幅超过3%买入。 4)当持有头寸亏损超过3%,平仓 5)当日跌幅大于3%或者三个连续阴线 ...

weixin_56537083的博客 4825

python计算股票趋势_量化交易之股票选股因子——走势线性回归

Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待4999元包邮去购买 >前言“回归”一词是由英国著名统计学家Francils Galton提出来的。1889年,他在研究祖先与后代身高之间的关系时发现,身材较高的父母,他们的孩子也较高,但这些孩子的平均身高并没有他们父母的平均身高高;身材较矮的父母,他们的孩子也较矮,但这些孩子的平均身高却比他们父...

weixin_39806603的博客 970

使用Python计算股票K线图缺口

​缺口,本人理解就是高开或者低开。高开就是跳高缺口,低开就是跳低缺口。不过从技术面上说有一套比较完整的缺口理论,感兴趣的可以手动百度。之所以形成缺口,之前本人另一篇博客《使用Python统计股票高开后的走势》提及过,股票的开盘价是由集合竞价机制决定的,当开盘前有一帮人愿意以高出昨日收盘价的价格购买股票,且数量比开盘前想要卖出股票的人多,那么股票价格就会高开。但是,有趣的不是缺口的形成,而是大A另一个不成文的规矩:缺口必补。当股价出现缺口,经过几天,甚至更长时间的变动后,然后反转过来,回到原来缺

XL-STUDIO 1257

用 Python 算法识别股价支撑位和阻力位

支撑位和阻力位是技术分析的基石。在本文中,我们深入研究了各种方法,从传统的枢轴点到更先进的技术,例如 K 均值聚类和多项式回归。这些方法的多功能性使交易者能够全面了解潜在的价格障碍。

探索人工智能领域 2304

利用tushare获取股票数据进行一元线性回归-基于Python

基于Pyhton-用tushare进行线性回归

m0_53789767的博客 1632

股票分析系统设计方案大纲与细节

数据采集:全面、实时地采集股票市场的各类数据,包括股票价格、成交量、财务数据、新闻资讯等。数据预处理:对采集的数据进行清洗、去重、缺失值填充、异常值处理等预处理操作,确保数据的准确性和可靠性。数据分析与挖掘:运用相关性分析、趋势分析、预测模型、聚类分析、分类分析等方法,对股票市场进行深度分析和挖掘。数据可视化:将分析和挖掘的结果以图表、报告等形式进行可视化展示,便于用户理解和分析。智能选股与风险提示:根据用户设定的条件,自动筛选符合条件的股票,并提供风险提示和投资建议。

MrLi的博客 655

36、金融与机器学习知识整合

本文整合了金融与机器学习的核心知识,涵盖金融市场基础概念如交易立场、技术指标、交易信号与策略、价格模式及期权交易,并介绍了金融数据来源。文章进一步探讨了机器学习算法分类、模型评估、过拟合与正则化等关键概念,详细解析了K-均值聚类、隐马尔可夫模型、神经网络、遗传算法和强化学习等具体算法及其在金融领域的应用。同时,介绍了线性代数与优化技术、数据处理方法以及常用软件工具与库,结合实际应用案例展示了机器学习在期权交易和文本挖掘中的潜力。最后推荐了相关在线课程,帮助读者系统掌握金融与机器学习交叉领域的理论与实践。

qsc9012345的博客 118

python金融量化——股票数据分割+计算单支股票利益率曲线(代码)

【代码】python金融量化——股票数据分割+计算单支股票利益率曲线(代码)

长弓同学的python学习笔记 1054

Linux CentOS7文件系统(/dev/var)的容量扩充

原因是之前安装docker后,再想安装Nessus,系统说home、var文件系统的内存都不够。

JHoanna的博客 3226

python2.7 实现的实时监控指定股票价格的小程序

本文介绍一个简单的股票价格获取小工具的实现,该工具会根据输入的股票代码显示当前时间的股票价格,定时刷新,间隔时间为1s,实现思路为分析股票网站的内容,利用爬虫技术获取股票价格信息,之后编码实现GUI界面,最后打包成可执行文件。 主要涉及到的python 库有 Tkinter ,urllib2,sys,time以及Python 打包工具pyinstaller

henry的专栏 1万+

Shopee 虾皮API接口:商品详情采集的实践

随着电商行业的蓬勃发展,数据采集和分析在商业决策中扮演着越来越重要的角色。Shopee作为东南亚领先的电商平台,拥有大量的商品数据。通过Shopee的API接口,我们可以方便地获取商品详情,为数据分析和市场研究提供有力支持。本文将介绍如何使用Shopee API接口采集商品详情,并分享一些实践技巧。提供了丰富的数据接口,包括商品详情、店铺信息、订单数据等。通过API接口,开发者可以轻松地获取Shopee平台上的数据,进行进一步的处理和分析。Shopee API接口:商品详情采集的实践与技巧。

An4480的博客 1889

华为海思IC设计岗位笔试全解析:物理、电路与工艺三大方向备考指南

本文全面解析华为海思IC设计岗位笔试的物理、电路与工艺三大方向备考要点。针对物理设计方向,重点讲解半导体能带理论、载流子输运机制等核心考点;电路设计方向涵盖Verilog语法、UVM验证等关键技术;工艺方向则深入探讨FinFET工艺、光刻技术等前沿知识。提供高效备考策略和应试技巧,助力考生提升通过率。

weixin_29196613的博客 1089

[Pytorch系列-55]:循环神经网络 - 使用LSTM网络对股票走势进行预测

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_优快云博客 本文网址: 目录 第1章 LSTM神经网络理论基础 第2章 业务说明 2.1 业务说明 2.2 环境准备 第3章 构建训练和测试数据集 3.1 下载并查看股票数据 3.2根据序列的长度, 把数据集,构建成序列数据集 3.3划分训练集,验证集 3.4构造数据迭代器dataloader 第4章 构建LSTM网络 4.1 定义网络 4.2 实例化网络 4.3 loss和优化器 第5章 ...

文火冰糖(王文兵)的博客 3750

Matlab+Matpower实战:手把手教你生成IEEE14节点FDIA攻击数据集(附完整代码)

本文提供了一份基于Matlab与Matpower工具构建IEEE14节点FDIA攻击数据集的完整实战指南。通过动态负荷数据模拟、潮流计算、状态估计及隐蔽攻击向量注入,手把手教你生成可用于电力系统网络安全研究的仿真数据集,并附有核心代码与调试技巧。

bean的博客 399

Python股票量化投资课学习—单均线双均线策略

当前天的15日均价大于昨天的15日均价,且昨天的15日均价小于今天的15日均价时,出现买入信号。# 当前天的15日均价小于昨天的15日均价,且昨天的15日均价大于今天的15日均价时,出现卖出信号。# 买入信号出现时,发送买入指令,系统自动执行买入交易。# 卖出信号出现时,发送卖出指令,系统自动执行卖出交易。# 卖出信号出现时,发送卖出指令,系统自动执行卖出交易。# 买入信号出现时,发送买入指令,系统自动执行买入交易。# 判断是否持仓,如果持仓,则判断是否是否卖出信号。具体内容:金叉买进死叉卖出。...

可爱是名词吗? 1769

实战解析:利用Python requests库高效抓取京东商品评论并构建结构化数据集

本文详细介绍了如何利用Python requests库高效抓取京东商品评论并构建结构化数据集。通过分析京东评论接口、处理反爬机制以及数据解析存储,帮助开发者快速获取电商数据,适用于竞品监控、用户画像构建等商业场景。

weixin_42526415的博客 838

AI 帮我写单测:pytest 覆盖率提升 40% 的协作日志

AI助力pytest测试覆盖率提升40%的实践总结 本文分享了作者通过AI协作提升Python项目测试覆盖率的实践经验。初始测试覆盖率仅45%的电商后端项目,通过系统化的AI协作策略(代码分析、场景矩阵设计、迭代优化)实现了显著改进。AI不仅生成312个高质量测试用例,更提供了测试设计思路和最佳实践建议。最终覆盖率提升至85%,发现并修复23个潜在bug,效率提升3倍。文章详细展示了用户服务、订单服务等核心模块的测试案例,以及分层Fixture设计、参数化测试等高级技巧。关键成功因素包括明确的协作边界、迭代

摘星编程的博客 3283

Python 量化(一)分析股票上涨的重现周期

import tushare as ts df=ts.get_hist_data('002230') #df1=ts.get_hist_data('000002',start='2017-04-25',end='2017-06-30') print(df.columns) df2=df[df['p_change']&gt;3] df3=df2[['open','high','clos...

luoganttcc的博客 2707

conda upgrade出现Solving environment:failed CondaValueError Malformed version string invalid chars解决方案

本文主要介绍了conda install出现Solving environment:failed、CondaValueError: Malformed version string invalid character(s),希望能对使用conda的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 步骤一 2.2 步骤二

weixin_43178406的博客 8万+
上一篇: 从软到硬,这届年轻人都经历了什么?
下一篇: 【干货人生篇】过早优化的陷阱!
Wang_AI
博客等级 码龄12年 997粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值