找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 股票 资源 源码
查看: 123|回复: 0

量化研究---基于东财的人气100排序自动导入通达信(附源码)

[复制链接]

934

主题

90

回帖

2万

积分

管理员

积分
28864
发表于 2025-3-23 09:03:25 | 显示全部楼层 |阅读模式


90b92ae64299466be96a232081ced2c5.jpeg

大家好,我是仓鼠哥,专注于指标评测及量化研究!
全自动量化工具,大数据选股,智能风控,AI盯盘,无需人工干预,每个人都能用量化交易!!!

关注仓鼠哥量化研究,围观机器人量化实盘:
量化研究:基于东财人气100排序自动导入通达信(附源码)
在量化交易中,实时追踪市场情绪与资金动向是制定策略的重要依据。东方财富网(EastMoney)的“人气100”榜单反映了当前A股市场关注度最高的个股排名,为我们提供了散户情绪的直观参考。
然而,手动记录并分析这些数据效率低下,因此,本文介绍一种基于Python的自动化解决方案,实现东财人气榜单的实时抓取、清洗,并一键导入通达信软件,助力投资者快速构建量化分析模型。
之前给老铁们分享过网页抓取人气股排名,今天研究了下,可以直接通过PY将人气股导入到通达信自定义板块,不用去充值会员生成了,当然有懂的朋友可以进一步研究衍生成其他的通达信结合方式。一、实现原理
  • 1. 数据抓取:通过Python的requests库模拟浏览器访问东财人气榜单页面(如:http://data.eastmoney.com/stock/lhb.html),利用`BeautifulSoup`或正则表达式解析HTML源码,提取股票代码、名称、人气值等关键字段。
  • 2. 通达信导入:通达信支持通过自定义数据格式(如.txt或特定目录的Excel)导入板块信息。通过脚本将清洗后的数据自动复制到通达信的自定义板块目录下(T0002/blocknew),实现实时同步。
二、应用场景
  • 1. 情绪监控:每日开盘前自动更新人气榜单,识别市场热点。
  • 2. 策略回测:结合历史人气数据与股价波动,验证“追涨”或“反转”策略的有效性。
  • 3. 盘中预警:通过通达信条件选股功能,实时监控榜单个股异动。
三、注意事项
  • 合规性:频繁爬取可能导致IP被封禁,建议控制请求频率或使用官方API(如有权限)。
  • 数据延迟:东财榜单更新存在分钟级延迟,需结合实时行情数据使用。
  • 路径配置:需根据本地通达信安装目录调整文件保存路径。
四、使用方法






1、解压缩下面文件夹后,打开分享配置文件
5cf12578eca70f1534dd3119e49b0bd0.png
2、设置配置文件中TDX地址,就可以了。
d5157ed5a6815dd19ca8fa799ada6bd9.png
3、然后在phyhon中运行“通达信自选股添加.py”即自动将东财人气股自动添加到了通达信自定义办卡中了!

本文提供的自动化脚本(附完整源码)打通了东财人气数据与通达信的量化分析链路,用户可在此基础上扩展更多功能(如自动选股、邮件通知等)。通过技术与策略的结合,大家能够更高效地捕捉市场机会,提升决策科学性。
详细源码打包见后获取附件:

通达信效果如下
ad7c0f75d1816d07dd4f43d9e3b8a76e.png
PY运行效果见下
ac66875e509fbba04eea02347eaaddc0.png

策略源代码可以自己测试看看

  1. from  dfcfrq import popularity
  2. from csg_tdx import tdx
  3. import schedule
  4. import time
  5. import json
  6. import requests
  7. import pandas as pd
  8. import akshare as ak
  9. class tdx_stock:
  10.     def __init__(self,path=r'E:/new_tdx/T0002/blocknew',name='CS'):
  11.         self.path=path
  12.         self.tdx=tdx(self.path)
  13.         self.rq=popularity()
  14.         self.name=name
  15.     def get_rq_data(self):
  16.         '''
  17.         获取人气数据
  18.         '''
  19.         df=self.rq.get_all_stock_rank_code()
  20.         
  21.         df['证券代码']=df['证券代码'].apply(lambda x: str(x).split('.')[-1])
  22.         print(df)
  23.         return df
  24.    
  25.     def get_upper_and_down_amount(self,x1=2,x2=-5):
  26.         '''
  27.         获取市场上涨和下单数据
  28.         大盘风控要求
  29.         大盘上涨2%以上家数大于500家
  30.         大盘下跌5%以上家数小于500家
  31.         当日跌停数量小于30家
  32.         (满足此条件才开始交易)
  33.         '''
  34.         url='https://push2ex.eastmoney.com/getTopicZDFenBu?cb=callbackdata8116174&ut=7eea3edcaed734bea9cbfc24409ed989&dpt=wz.ztzt&_=1700720695419'
  35.         res=requests.get(url=url)
  36.         text=res.text
  37.         text=text[20:len(text)-2]
  38.         json_text=json.loads(text)
  39.         result=json_text['data']['fenbu']
  40.         #print(result)
  41.         #跌停
  42.         down_amount=result[2]['-11']
  43.         #涨停
  44.         up_amount=result[-9]['11']
  45.         #下跌数量
  46.         amount_dowm=0
  47.         #上涨数量
  48.         amount_up=0
  49.         for i in result:
  50.             for j in range(x1,12):
  51.                 j=str(j)
  52.                 amount_up+=i.get(j,0)
  53.         for i in result:
  54.             for j in range(-11,x2):
  55.                 j=str(j)
  56.                 amount_dowm+=i.get(j,0)
  57.         return up_amount,down_amount,amount_up,amount_dowm
  58.    
  59.     def stock_board_concept_name_em(self):
  60.         '''
  61.         概念板块
  62.         '''
  63.         df=ak.stock_board_concept_name_em()
  64.         return df
  65.     def stock_board_concept_cons_em(self,name='昨日涨停'):
  66.         '''
  67.         -概念板块-板块成份
  68.         '''
  69.         df=ak.stock_board_concept_cons_em(symbol=name)
  70.         return df
  71.     def stock_board_industry_name_em(self):
  72.         '''
  73.         行业板块
  74.         '''
  75.         df=ak.stock_board_industry_name_em()
  76.         return df
  77.     def stock_board_industry_cons_em(self,name='教育'):
  78.         '''
  79.         行业板块-板块成份
  80.         '''
  81.         df=ak.stock_board_industry_cons_em(symbol=name)
  82.         return df
  83.    
  84.     def get_concept_industry_analysis(self,n1=5,n2=10):
  85.         '''
  86.         行业概念选股分析
  87.         '''
  88.         with open('分析配置.json','r+',encoding='utf-8') as f:
  89.             com=f.read()
  90.         text=json.loads(com)
  91.         trader_list=text['选择股票开头']
  92.         data=pd.DataFrame()
  93.         concept=self.stock_board_concept_name_em()[:n1]
  94.         print('排名前{}的行业'.format(n1))
  95.         print(concept)
  96.         for symbol in concept['板块名称']:
  97.             df=self.stock_board_concept_cons_em(name=symbol)
  98.             df['选择']=df['代码'].apply(lambda x:'是' if str(x)[:2] in trader_list else '不是')
  99.             df=df[df['选择']=='是']
  100.             data=pd.concat([data,df[:n2]],ignore_index=True)
  101.         return data
  102.    
  103.     def get_trader_stock(self):
  104.         '''
  105.         获取交易的股票池
  106.         '''
  107.         with open('分析配置.json','r+',encoding='utf-8') as f:
  108.             com=f.read()
  109.         text=json.loads(com)
  110.         n1=text['选择板块前N']
  111.         n2=text['板块成分股前N']
  112.         n3=text['人气选股前N']
  113.         data=self.get_concept_industry_analysis(n1=n1,n2=n2)
  114.         print(data)
  115.         df=self.get_rq_data()[:n3]
  116.         print(df)
  117.         stock_list=df['证券代码'].tolist()
  118.         for stock in data['代码'].tolist():
  119.             stock_list.append(stock)
  120.         return stock_list
  121.    
  122.     def add_all_stock(self):
  123.         '''
  124.         添加全部股票
  125.         '''
  126.         with open('分析配置.json','r+',encoding='utf-8') as f:
  127.             com=f.read()
  128.         text=json.loads(com)
  129.         up_ratio=text['大盘上涨N%以上']
  130.         up_amount_1=text["大盘上涨N%以上家数大于"]
  131.         down_ratio=text['大盘下跌N%']
  132.         down_amount_1=text["大盘下跌N%以上家数小于"]
  133.         amount_dowm_1=text["当日跌停数量小于"]
  134.         up_amount,down_amount,amount_up,amount_dowm=self.get_upper_and_down_amount(x1=up_ratio,x2=down_ratio)
  135.         #if amount_up>=up_amount_1 and amount_dowm<=down_amount_1 and down_amount<=amount_dowm_1:
  136.         aa=1
  137.         if aa>0:
  138.             print('开启模型涨停数量{} 跌停数量{} 大盘上涨{}%以上家数大于数量{} 大盘下跌{}%以上家数{}'.format(up_amount,down_amount,up_ratio,amount_up,down_ratio,amount_dowm))
  139.             stock_list=self.get_trader_stock()
  140.             self.tdx.add_tdx_stock_list(name=self.name,user_stock_list=stock_list)
  141.         else:
  142.             print('不选股')
  143.             print('不开启模型涨停数量{} 跌停数量{} 大盘上涨{}%以上家数大于数量{} 大盘下跌{}%以上家数{}'.format(up_amount,down_amount,up_ratio,amount_up,down_ratio,amount_dowm))

  144. if __name__=='__main__':
  145.     with open('分析配置.json','r+',encoding='utf-8') as f:
  146.         com=f.read()
  147.     text=json.loads(com)
  148.     path=text['通达信路径']
  149.     name=text['操作通达信自选股']
  150.     cycle_buy_time=text['循环选股时间']
  151.     models=tdx_stock(path=r'{}'.format(path),name=name)
  152.     #df=models.add_all_stock()
  153.     schedule.every(cycle_buy_time).minutes.do(models.add_all_stock)
  154.     while True:
  155.         schedule.run_pending()
  156.         time.sleep(1)
  157.    
复制代码


xg_tdx_stock-master.zip

15.59 KB, 下载次数: 3

售价: 1 金币  [记录]

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋| 股指标网 ( 渝ICP备2024026571号-1 )

GMT+8, 2025-4-4 05:08 Powered by Discuz! X3.5

股指标