python、talib选股:自动工具介绍以及倒锤头形态搜索并可视化显示

本文主要是介绍python、talib选股:自动工具介绍以及倒锤头形态搜索并可视化显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1 前言

2 工具介绍

1.1 界面

 3 测试搜索倒锤头形态


1 前言

本来想研究金融,可是看到代码就烦,难道还要特意去学习python编程?那样岂不浪费好多发cai的时间?估计很多股友跟我的经历很相似。想从网上找个好的python工具,但是在网上找来找去都没找到特别中意的,全都是一堆代码,没法直接拿来主义。没办法还是边学习编程边炒gu养家吧。

2 工具介绍

这个工具的特点是,一是不用安装,直接运行;二是后台集成了python,功能强大;三是扩展性强,后面需要什么功能模块直接安装就行;四是不用敲代码,一行代码都不用敲,点几下鼠标就出结果了;五是后面会不断扩充功能,因为我要用它炒gu挣钱养家糊口,功能不强大不行;六是增加了功能我会马上发布新程序来。股友们拿来主义随便用;七是。。。。。。

1.1 界面

刚开始界面有点简陋啊,将就吧。

 

 3 测试搜索倒锤头形态

选中一个已经导出的代码,然后点击“搜:倒锤头”,几秒钟后浏览器显示结果。下面的滑块可以左右平移、放大缩小。

 

记录一下实际使用的python代码:

from typing import List, Union
import talib
from pyecharts import options as opts
from pyecharts.charts import Kline, Line, Bar, Grid
import os
import pandas as pd'''
def net_split_data(data):category_data = []values = []volumes = []for i, tick in enumerate(data):category_data.append(tick[0])values.append(tick)volumes.append([i, tick[4], 1 if tick[1] > tick[2] else -1])return {"categoryData": category_data, "values": values, "volumes": volumes}def net_get_data():response = requests.get(url="https://echarts.apache.org/examples/data/asset/data/stock-DJI.json")json_response = response.json()# 解析数据return net_split_data(data=json_response)
'''def split_data(data):category_data = []values = []volumes = []# flags = []for i, tick in enumerate(data.values.tolist()):category_data.append(tick[0])values.append(tick)volumes.append([i, tick[5], 1 if tick[1] > tick[2] else -1])# flags.append([i, 0])open_p = pd.DataFrame(values)[1]close_p = pd.DataFrame(values)[2]low_p = pd.DataFrame(values)[3]high_p = pd.DataFrame(values)[4]array_cdl2c = talib.CDLINVERTEDHAMMER(open_p, high_p, low_p, close_p) # 倒锤头# l_array_cdl2c = array_cdl2c.values.tolist()# 由于不知道如何在k线图中叠加标记,使用这种变通方法,即替换成交量图中# 的成交量为乌鸦标记# 即:用 array_cdl2c 的值替换 df_volumes 中的成交量# 列表转化为DataFrame方便列操作df_volumes = pd.DataFrame(volumes)df_volumes[1] = array_cdl2cdf_volumes[2] = 1 # 2只乌鸦标志颜色统一设置为绿色volumes = df_volumes.values.tolist()return {"categoryData": category_data, "values": values, "volumes": volumes}def get_data(code):# df_tdx = pd.read_feather(r'./dataout/tdx/'+code+r'.day.feather')# df_tdx.index=pd.to_datetime(df_tdx.Date, format = '%Y%m%d')# df_tdx_b=df_tdx.truncate(before=start_date, after = end_date)# df_tdx_b['Openinterest']=0# df_tdx_b.rename(columns={'vol':'volume'}, inplace = True)# df_tdx_b=df_tdx_b[['Open','High','Low','Close','Volume','Openinterest']]# return split_data(data=df_tdx_b)df_tdx = pd.read_feather(r'./data/tdx/'+code+r'.day.feather')df_tdx.drop('Amout', axis=1, inplace=True)df_tdx.Date=pd.to_datetime(df_tdx.Date, format = '%Y%m%d')df_tdx.Date=df_tdx.Date.map(lambda x:x.strftime('%Y-%m-%d'))# df_tdx.index=pd.to_datetime(df_tdx.Date, format = '%Y%m%d')# 调整列顺序df_tdx = df_tdx.loc[:,['Date', 'Open', 'Close', 'Low', 'High', 'Volume']]# df_tdx_b=df_tdx.truncate(before=start, after = end)# df_tdx_b['Openinterest']=0# df_tdx.rename(columns={'vol':'Volume'}, inplace = True)# df_tdx_b=df_tdx_b[['Open','High','Low','Close','Volume','Openinterest']]return split_data(data=df_tdx)def calculate_ma(day_count: int, data):result: List[Union[float, str]] = []for i in range(len(data["values"])):if i < day_count:result.append("-")continuesum_total = 0.0for j in range(day_count):sum_total += float(data["values"][i - j][1])result.append(abs(float("%.3f" % (sum_total / day_count))))return resultdef draw_charts():kline_data = [data[1:-1] for data in chart_data["values"]]kline = (Kline().add_xaxis(xaxis_data=chart_data["categoryData"]).add_yaxis(series_name="stock index",y_axis=kline_data,itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"),).set_global_opts(legend_opts=opts.LegendOpts(is_show=False, pos_bottom=10, pos_left="center"),datazoom_opts=[opts.DataZoomOpts(is_show=False,type_="inside",xaxis_index=[0, 1],range_start=98,range_end=100,),opts.DataZoomOpts(is_show=True,xaxis_index=[0, 1],type_="slider",pos_top="85%",range_start=98,range_end=100,),],yaxis_opts=opts.AxisOpts(is_scale=True,splitarea_opts=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)),),tooltip_opts=opts.TooltipOpts(trigger="axis",axis_pointer_type="cross",background_color="rgba(245, 245, 245, 0.8)",border_width=1,border_color="#ccc",textstyle_opts=opts.TextStyleOpts(color="#000"),),visualmap_opts=opts.VisualMapOpts(is_show=False,dimension=2,series_index=5,is_piecewise=True,pieces=[{"value": 1, "color": "#00da3c"},{"value": -1, "color": "#ec0000"},],),axispointer_opts=opts.AxisPointerOpts(is_show=True,link=[{"xAxisIndex": "all"}],label=opts.LabelOpts(background_color="#777"),),brush_opts=opts.BrushOpts(x_axis_index="all",brush_link="all",out_of_brush={"colorAlpha": 0.1},brush_type="lineX",),))line = (Line().add_xaxis(xaxis_data=chart_data["categoryData"]).add_yaxis(series_name="MA5",y_axis=calculate_ma(day_count=5, data=chart_data),is_smooth=True,is_hover_animation=False,linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),label_opts=opts.LabelOpts(is_show=False),).add_yaxis(series_name="MA10",y_axis=calculate_ma(day_count=10, data=chart_data),is_smooth=True,is_hover_animation=False,linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),label_opts=opts.LabelOpts(is_show=False),).add_yaxis(series_name="MA20",y_axis=calculate_ma(day_count=20, data=chart_data),is_smooth=True,is_hover_animation=False,linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),label_opts=opts.LabelOpts(is_show=False),).add_yaxis(series_name="MA30",y_axis=calculate_ma(day_count=30, data=chart_data),is_smooth=True,is_hover_animation=False,linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),label_opts=opts.LabelOpts(is_show=False),).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")))bar = (Bar().add_xaxis(xaxis_data=chart_data["categoryData"]).add_yaxis(series_name="Volume",y_axis=chart_data["volumes"],xaxis_index=1,yaxis_index=1,label_opts=opts.LabelOpts(is_show=False),).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category",is_scale=True,grid_index=1,boundary_gap=False,axisline_opts=opts.AxisLineOpts(is_on_zero=False),axistick_opts=opts.AxisTickOpts(is_show=False),splitline_opts=opts.SplitLineOpts(is_show=False),axislabel_opts=opts.LabelOpts(is_show=False),split_number=20,min_="dataMin",max_="dataMax",),yaxis_opts=opts.AxisOpts(grid_index=1,is_scale=True,split_number=2,axislabel_opts=opts.LabelOpts(is_show=False),axisline_opts=opts.AxisLineOpts(is_show=False),axistick_opts=opts.AxisTickOpts(is_show=False),splitline_opts=opts.SplitLineOpts(is_show=False),),legend_opts=opts.LegendOpts(is_show=False),))# Kline And Lineoverlap_kline_line = kline.overlap(line)# Grid Overlap + Bargrid_chart = Grid(init_opts=opts.InitOpts(width="1400px",height="800px",animation_opts=opts.AnimationOpts(animation=False),))grid_chart.add(overlap_kline_line,grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="50%"),)grid_chart.add(bar,grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="63%", height="16%"),)grid_chart.render("render.html")# 打开网页os.system("render.html")if __name__ == "__main__":'''df_tdx = pd.read_feather(r'./dataout/tdx/bj871396.day.feather')df_tdx.drop('Amout', axis=1, inplace=True)df_tdx.Date=pd.to_datetime(df_tdx.Date, format = '%Y%m%d')df_tdx.Date=df_tdx.Date.map(lambda x:x.strftime('%Y-%m-%d'))# df_tdx.index=pd.to_datetime(df_tdx.Date, format = '%Y%m%d')# df_tdx.Date = df_tdx.astype({'Date':'str'})# df_tdx.Date = df_tdx.Date.map(lamda x:)# df_tdx.rename(columns={'vol':'Volume'}, inplace = True)# df_tdx_b=df_tdx_b[['Open','High','Low','Close','Volume','Openinterest']]# print(df_tdx.dtypes)# print(list(df_tdx))df_tdx = df_tdx.loc[:,['Date', 'Open', 'Close', 'Low', 'High', 'Volume']]# print(list(df_tdx))d_category_data = []d_values = []d_volumes = []# d_flags = []for i, tick in enumerate(df_tdx.values.tolist()):d_category_data.append(tick[0])d_values.append(tick)d_volumes.append([i, tick[5], 1 if tick[1] > tick[2] else -1])# d_flags.append([i, 0])open_p = pd.DataFrame(d_values)[1]close_p = pd.DataFrame(d_values)[2]low_p = pd.DataFrame(d_values)[3]high_p = pd.DataFrame(d_values)[4]array_cdl2c = talib.CDLINVERTEDHAMMER(open_p, high_p, low_p, close_p)# array_cdl2c 与 d_volumes合并,# 然后用 array_cdl2c 的之替换 df_volumes 中的成交量# 列表转化为DataFrame方便列操作df_volumes = pd.DataFrame(d_volumes)df_volumes[1] = array_cdl2c# l_array_cdl2c = array_cdl2c.values.tolist()''''''response = requests.get(url="https://echarts.apache.org/examples/data/asset/data/stock-DJI.json")json_response = response.json()# 解析数据category_data = []values = []volumes = []for i, tick in enumerate(json_response):category_data.append(tick[0])values.append(tick)volumes.append([i, tick[4], 1 if tick[1] > tick[2] else -1])# return {"categoryData": category_data, "values": values, "volumes": volumes}'''# net_chart_data = net_get_data()chart_data = get_data('bj430198')# chart_data = net_get_data()draw_charts()

程序有点大,近90M:

谁想用用试试程序就在评论区留下邮箱吧,我直接发你邮箱。

有什么建议请在评论区留言,不接受其他交流方式,有合适的建议我就加到程序里。

这篇关于python、talib选股:自动工具介绍以及倒锤头形态搜索并可视化显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/278085

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问