【AI选股】如何通过python调用通达信-小达实现AI选股(量化又多了一个选股工具)

news2024/11/24 23:55:15

文章目录

  • 前言
  • 一、通达信-小达是什么?
  • 二、使用步骤
    • 1. 引入browser_cookie3库
    • 2. 通达信-小达 AI选股源代码
  • 总结


前言

ChatGPT火遍网络,那么有没有可以不用写公式就可以实现AI选股的方法?答案是有,今天我们就来试试通达信的小达,让小达按我们的要求去进行选股。


一、通达信-小达是什么?

通达信-小达是一款操作简单,输入检索语句即可实现用户智能选股、资讯检索、答疑解惑等需求的投资系统,让投资成为一句话的事。
小达通过人工智能技术,汇集行情、资讯、数据库以及各大功能组件于一体,具备语义解析、信息聚合以及机器学习在内的多项功能的智能
服务产品,支持自有内容的服务对接。

通达信-小达功能包含:智能选股、股海神搜、全文检索等
官网地址:https://wenda.tdx.com.cn/
在这里插入图片描述

二、使用步骤

这里主要是使用requests,系统应该都自带,而且我将其修改成类的方式,调用会更方便。
其实之前有人已经写了代码,我也是参考修改下。只是每次要更新cookie,否则将无法访问,对各位量化朋友不太友好,所以这里攻克了一下,以后就可以方便的使用了。

1. 引入browser_cookie3库

browser_cookie3可以读取电脑浏览器(例如Chrome Firefox Opera Edge Chromium Brave)本身已经缓存的cookie。使用前先安装下,方便后面操作。当然你手动会操作,也可以不用这个库。不过为方便使用,推荐安装,毕竟每天登录提取已cookie也够麻烦的。

pip install browser-cookie3 

2. 通达信-小达 AI选股源代码

首先是完成注册,请自行搞定。本文同时支持以下两种方法访问。推荐方法2,因为只要电脑用浏览器登录一下即可完成自动访问。

方法1:使用任意浏览器登录https://wenda.tdx.com.cn/,并按F12查看网络,找到Cookie复制后替换这里ASPSessionID后数值即可使用。
xd = TDX_xiaoda(cookie = ‘ASPSessionID=xxxxxxxxxxx’)
在这里插入图片描述

方法2:使用Chrome浏览器登录https://wenda.tdx.com.cn/后,无需手工查找Cookie,程序会自动获取ASPSessionID,并实现访问。但必须使用Chrome浏览器。
xd = TDX_xiaoda()

# -*- coding: utf-8 -*-
'''
通达信-小达
'''
import requests
import browser_cookie3
import pandas as pd
import json,os,random


class TDX_xiaoda:
    '''
    通达信-小达,使用chrome浏览器登录后,此工具可以自动获取ASPSessionID,并实现访问。
    '''
    def __init__(self,cookie=''):
        # 如果类传送Cookie则使用传参
        if cookie=='': 
            self.cookie = self.get_cookie_tdx()
        else:
            self.cookie = cookie

    def set_headers(self):
        # 增加UserAgent,防止被反爬虫拦截
        user_agent_list = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
                            "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
                            "Mozilla/5.0 (Windows NT 10.0; WOW64) Gecko/20100101 Firefox/61.0",
                            "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
                            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
                            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
                            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
                            "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
                            ]
        headers = {
            'Cookie': self.cookie,
            'User-Agent': random.choice(user_agent_list)}
        return headers

    def _get_cookie_tdx(self):
        # 查找指定域名的制定Cookie值
        cookies = browser_cookie3.chrome(domain_name='wenda.tdx.com.cn')
        for item in cookies:
            if item.name == "ASPSessionID" :
                # print('%s = %s' % (item.name, item.value))
                cookie_tdx = 'ASPSessionID=' + item.value + ';'
                return cookie_tdx

    def get_data_option(self,word='涨停股票'):
        '''
        获取提示参考
        :param word:
        :return:
        '''
        data = [{"op_flag":1,"question":word,"POS":0,"COUNT":10,"RANG":"AG"}]
        url = 'https://wenda.tdx.com.cn/TQL?Entry=NLPSE.QuestionImagine&RI='
        headers = self.set_headers()
        res = requests.post(url=url,data=json.dumps(data),headers=headers)
        res_json = res.json()
        return res_json
        
    def get_word_code(self,name='换手率2.8~15,量比2~20,OBV指标创新高,涨幅2~7,股价2~30'):
        '''
        :param name:
        :return:
        '''
        data = [{"message":name,"TDXID":"","wdbk":"","RANG":"AG"}]
        url = 'https://wenda.tdx.com.cn/TQL?Entry=NLPSE.StockSelect&RI='
        headers = self.set_headers()
        res = requests.post(url=url,headers=headers,data=json.dumps(data))
        res_json = res.json()
        code = res_json[-1][0]
        return code
        
    def get_all_option_data(self):
        '''
        获取全部参考
        :return:
        '''
        url = 'https://wenda.tdx.com.cn/TQL?Entry=NLPSE.SmartQuery&RI='
        headers = self.set_headers()
        data = [{"op_flag":1,"order_field":"","order_flag":1,"cond_json":"","POS":0,"COUNT":-1,"RANG":"AG"}]
        res = requests.post(url=url,headers=headers,data=json.dumps(data))
        res_json = res.json()
        df = pd.DataFrame(res_json)
        df = df.iloc[1:]
        df2 = df.rename(columns=df.iloc[0])
        df3 = df2.iloc[1:]
        return df3
        
    def get_word_result(self,word='今日涨停',try_times = 30):
        '''
        根据关键字分析后获取数据
        :param word:关键字
        :return:字典,包含状态和数据
        '''
        while try_times>0:
            url = 'https://wenda.tdx.com.cn/TQL?Entry=NLPSE.NLPQuery&RI=6BFD'
            code = self.get_word_code(name=word)
            headers = self.set_headers()
            data = [{"nlpse_id":code,"POS":0,"COUNT":100000,"order_field":"","dynamic_order":"","order_flag":"","timestamps":0,"op_flag":1,"screen_type":1,"RANG":"AG"}]
            res = requests.post(url=url,headers=headers,data=json.dumps(data))
            text = res.content.decode('utf-8')
            res_json = json.loads(text)
            if len(res_json[1])<4:
                try_times -= 1
                print('获取信息失败,剩余'+str(try_times)+'次尝试机会,再次尝试连接......')
            else:
                # print(text)
                df = pd.DataFrame(res_json)
                df = df.iloc[1:]
                df2 = df.rename(columns=df.iloc[0])
                df3 = df2.iloc[2:]
                return {
                        "success": True,
                        "df_data":df3.round(3)
                    }
        return {
            "success": False,
            "msg": '获取行情信息结果为None'
        }


# ===============表格美化输出===============
def df_table(df,index):
    import prettytable as pt
    #利用prettytable对输出结果进行美化,index为索引列名:df_table(df,'market')
    tb = pt.PrettyTable()
    # 如果为trade_time为index转换为日期类型,其它不用管。
    if index == "trade_time":
        df = df.set_index(index)
        df.index = pd.DatetimeIndex(df.index)
    # df.reset_index(level=None, drop=True, inplace=True, col_level=0, col_fill='')
    df = df.reset_index(drop = True)
    tb.add_column(index,df.index)#按date排序
    for col in df.columns.values:#df.columns.values的意思是获取列的名称
        # print('col',col)
        # print('df[col]',df[col])
        tb.add_column(col, df[col])
    print(tb)


if __name__=='__main__':
    # 以下两种方法均可以,推荐方法2。注册请自行搞定。
    # 方法1:使用任意浏览器登录https://wenda.tdx.com.cn/,并按F12查看网络,找到Cookie复制后替换这里ASPSessionID后数值即可使用。注意不要带分号。
    # xd = TDX_xiaoda(cookie = 'ASPSessionID=xxxxxxxxxx') 
    # 方法2:使用Chrome浏览器登录https://wenda.tdx.com.cn/后,无需手工查找Cookie,程序会自动获取ASPSessionID,并实现访问。但必须使用Chrome浏览器。
    xd = TDX_xiaoda() 
        
    if 0:
        #可能获取不到
        ret = xd.get_data_option(word='沪深A股,换手率1%~5%')
        print(ret)
        #获取问题转代码
        ret = xd.get_word_code(name='沪深A股,换手率1%~5%')
        print(ret)
        #获取全部的参考,具体看通达信
        ret = xd.get_all_option_data()
        # print(ret)
        df_table(ret,'df')
    
    if 1:
        #获取问题的结果
        words = '沪深A股,周线MACD持续向上,今日涨停' # 连板 3连板 今日涨停 20230201涨停 北向资金 板块 大单抢筹 MACD背离
        ret = xd.get_word_result(word=words)
        if ret['success']:
            df = ret['df_data']
            # print(df)
            df_table(df,'df')
            filename = os.path.dirname(__file__)+'\\'+'通达信-小达选股_'+words+'.xlsx'
            df.to_excel(filename)
            print('选股完成,结果写入:',filename)
            

总结

这次写了通达信的AI选股,之前写过使用同花顺的问财AI选股,下面是传送门。需要的小伙伴自行学习。

【AI选股】如何通过python调用wencai包实现AI选股(小白也能学会)https://blog.csdn.net/popboy29/article/details/126336227

同花顺的问财也很方便,不过每次检索限制了200条。个人看情况调用。通达信目前还未发现限制。另外就是这个不用安装,代码透明,方便调用。

搞了一天,肩膀有些酸痛,写作不易,关键是不停的调试代码,很是费事儿。各位如果觉得有帮助,不妨点个赞再开始调试使用,顺祝大家发财!

同时,这里对通达信及之前写作代码的大虾一并表示感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/499554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试面试常见问题【含答案】

一、面试技巧题(主观题) 序号面试题1怎么能在技术没有那么合格的前提下给面试官留个好印象&#xff1f;2面试时&#xff0c;如何巧妙地避开不会的问题&#xff1f;面试遇到自己不会的问题如何机智的接话&#xff0c;化被动为主动&#xff1f;3对于了解程度的技能&#xff0c;被…

鸿蒙学习总结

控件 button 源码所在路径&#xff0c;小编也只是猜测&#xff0c;还没搞懂鸿蒙上层app到底层的玩法&#xff0c;网上也没相关资料&#xff0c;找源码真是费劲(不是简单的下载个源码的压缩包&#xff0c;而是找到里面的控件比如Button&#xff0c;或者UIAbility实现的源码&…

探索qrc,rcc和CMAKE_AUTORCC

前导知识&#xff1a;解决qt中cmake单独存放 .ui, .cpp, .h文件 前言 我们的Qt程序可以加载一些资源&#xff0c;比如程序窗口的图标。 像下面这样的原始图标&#xff0c;很丑。 可以给它加上图标&#xff0c;一个小海豚。 一、直接加载资源 这是最简单直接的方式。 …

IntersectionObserver API实现虚拟列表滚动

前言 在本篇文章你将会学到&#xff1a; IntersectionObserver API 的用法&#xff0c;以及如何兼容。如何在React Hook中实现无限滚动。如何正确渲染多达10000个元素的列表。 无限下拉加载技术使用户在大量成块的内容面前一直滚动查看。这种方法是在你向下滚动的时候不断加…

keil MDK5软件包介绍、下载、安装与分享

前言 本文介绍了Keil MDK5软件包的分类、作用、下载、安装与更新。软件包下载可通过Keil自带的Pack Installer、进入Keil Pack下载网站手动下载、去芯片厂家官网下载三种方式。同时分享了一个小技巧&#xff0c;可以直接分享已安装好的软件包给别人。 一. Keil MDK软件包介绍 K…

《Netty》从零开始学netty源码(五十五)之InternalThreadLocalMap

InternalThreadLocalMap 前面介绍PoolThreadLocalCache中了解到netty的线程缓存变量值是存在InternalThreadLocalMap中的&#xff0c;它相对于java原生的map优点在于使用数组来管理变量值而不是map&#xff0c;它的数据结构如下&#xff1a; 在它的变量中与PoolThreadLocalCac…

springboot+vue在线BLOG网站(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线BLOG网站闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&…

我与猫头鹰的故事——得到学习的阶段总结

目录 一、背景二、过程三、总结四、升华 一、背景 记忆中已经模糊了加入得到的时间&#xff0c;但是现在它却成了我生活的一部分 每天就像有几位高人在给我细细道来他们的经验&#xff0c;给我前行的路上指引方向。 参与得到学习中不仅仅让我个人见识得到提升&#xff0c;最终…

Spring Cloud Gateway 限流

在高并发的应用中&#xff0c;限流是一个绕不开的话题。限流可以保障我们的 API 服务对所有用户的可用性&#xff0c;也可以防止网络攻击。 一般开发高并发系统常见的限流有&#xff1a;限制总并发数&#xff08;比如数据库连接池、线程池&#xff09;、限制瞬时并发数&#xf…

【C++】类和对象(初阶认识)#中篇#

上篇讲到对象的实例化 这里我们接着来探讨对象 目录 类域及成员函数在类域外的声明方法 内联 构造函数 先来看前三点&#xff1a; 无参调用格式 第四点函数重载 最后一点&#xff1a;没写构造时 自动生成 默认构造 并调用 《坑和补丁篇》 默认构造 析构函…

SETUNA2简介、下载和使用方法(截图贴图工具)

如果你在寻找一个可以截图并将截图置顶显示在桌面的工具&#xff0c;那么本文介绍的工具可以满足你的需求&#xff0c;但是我还是建议你移步&#xff1a; Snipaste介绍、安装、使用技巧&#xff08;截图贴图工具&#xff09;_西晋的no1的博客-CSDN博客 &#xff0c;Snipaste工具…

Illustrator如何使用符号与图表之实例演示?

文章目录 0.引言1.使用Microsoft Excel数据创建图表2.修改图表图形及文字 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对Illustrator进行了学习&#xff0c;本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文…

校园网自动登陆(河南科技学院)

1. 介绍 河南科技学院校园网自动登陆&#xff08;新乡的很多系统相似&#xff0c;可能也可以用&#xff1f;&#xff09;&#xff0c;java版。可以实现电脑&#xff0c;路由器&#xff0c;软路由的自动认证wifi,后续会上传docker版本的。 源码地址 github&#xff1a;https://…

C嘎嘎的运算符重载基础教程以及遵守规则【文末赠书三本】

博主名字&#xff1a;阿玥的小东东 大家一起共进步&#xff01; 目录 基础概念 优先级和结合性 不会改变用法 在全局范围内重载运算符 小结 本期送书&#xff1a;盼了一年的Core Java最新版卷Ⅱ&#xff0c;终于上市了 基础概念 运算符重载是通过函数重载实现的&#xf…

visual studio code安装c语言编译环境

目录 &#xff08;一&#xff09;Windows下安装GCC&#xff0c;下载并安装MinGW 安装MinGW 配置GCC环境变量 电脑使用CMD命令行输入 gcc -v ,查看gcc当前版本号以此判断gcc是否安装成功​编辑 &#xff08;一&#xff09;Windows下安装GCC&#xff0c;下载并安装MinGW 下载…

索引合并,能不用就不要用吧!

文章目录 1. 问题重现2. 索引合并2.1 Using intersect(...)2.2 Using union(...)2.3 Using sort_union(...)2.4 索引合并原理 3. 索引合并的问题 在前面的文章中&#xff0c;松哥和小伙伴们分享了 MySQL 中&#xff0c;InnoDB 存储引擎的数据结构&#xff0c;小伙伴们知道&…

HTB-OpenKeyS

HTB-OpenKeyS 信息收集80端口立足于JenniferJennifer -> root 信息收集 80端口 对其进行简单的SQL注入测试和NoSQL注入测试后进行目录扫描。 auth.swp文件内容如下&#xff1a; 代码不是很完整&#xff0c;只能大致了解意思&#xff08;请原谅我脑子抽了没注意是个swp交换…

USB 连接检测

文章目录 连接检测连接状态的检测带 Vbus 检测功能的 USB 设备不带 Vbus 检测功能的 USB 设备 连接前的初始化设备端主机端 建立连接过程手册规定检测时间及电平标准 连接检测 USB 协议支持热插拔的特性决定了 USB 主机必须能够动态地检测 USB 设备的连接和断开&#xff0c;这…

linux【网络编程】之网络基础

linux【网络编程】之网络基础 一、网络协议与协议分层1.1 为什么要分层1.2 OSI七层模型1.3 TCP/IP五层(或四层)模型 二、网络传输流程2.1 了解局域网2.2 同一网段内的两台主机进行文件传输2.3 跨网段的主机的文件传输 三、数据包封装和分用四、网络中的地址管理4.1 IP地址4.2 M…

【Simulink】0基础入门教程 P1 搭建自己的第一个模型 实现加减乘除四则运算

目录 工作路径的设置&#xff1a; Simulink的两种打开方式 模块的基本操作 建立一个新的空白模型&#xff0c;创建模型 加减乘除模块的名称 模块之间连线的两种方法 显示模块 Display 搭建子系统subsystem 将加法模块Add更改为多输入模块 本文记录Simulink学习&#x…