
为什么需要Python操作同花顺自选股
做股票和期货交易的人,电脑里几乎都装着同花顺。自选股列表是每天盯盘的第一站,但手动翻看、记录、导出数据效率太低。用Python把自选股数据抓出来,可以接上自己的分析脚本、做预警、跑回测,甚至和期货持仓合并监控。问题在于同花顺没有公开的API接口,得绕点路。
先搞清楚同花顺自选股存在哪
同花顺客户端把自选股保存在本地文件里,路径通常在安装目录下的 userdata 文件夹中。具体位置和你的资金账号有关,一般是 C:\同花顺软件\同花顺\userdata\你的账号\selfstock.dat 或者类似结构。这个文件是二进制格式,但里面的股票代码是以明文或简单编码形式存放的,用十六进制编辑器打开就能看到 600519、000001 这样的代码片段。
知道位置之后,Python读取的思路就清晰了:找到文件、按规则提取代码、清洗成标准列表。
方法一 直接解析本地文件
最轻量的做法是用Python的 open 函数以二进制模式读取 selfstock.dat,然后用正则表达式匹配六位数字代码。同花顺的文件里代码之间夹杂着分隔符和标志位,直接匹配连续六位数字可能会把日期、价格等误抓进来。更稳妥的方式是观察文件结构:自选股代码通常成段出现,每段前面有固定的标记字节。

写代码时先用 os.path 定位用户目录,再用 glob 找到所有 selfstock*.dat 文件。读取后用 re.findall(rb'\d{6}', data) 粗筛,再根据股票代码前两位(60、00、30、68)过滤掉非股票代码。期货代码格式不同,比如 IF2406、rb2410,需要单独匹配字母加数字的组合。
这种方法的优点是零依赖、速度快,缺点是同花顺版本更新可能改变文件结构,需要定期维护正则规则。
方法二 用pywinauto模拟客户端操作
不想碰二进制文件的话,可以用 pywinauto 控制同花顺窗口,模拟点击自选股页面,再读取控件里的文本。思路是启动同花顺、登录、切换到自选股标签、遍历列表控件抓取每一行的代码和名称。
代码骨架大致是这样:用 Application(backend="win32").connect(path=同花顺exe路径) 连接进程,用 window.child_window(title="自选股") 找到标签页,再用 ListViewWrapper 遍历条目。每个条目能拿到股票名称和代码文本,存进列表后交给pandas处理。
这个方法的好处是不依赖文件格式,客户端能看到什么就能抓什么。短板也很明显:同花顺启动慢、登录可能弹窗、控件ID随版本变动,脚本稳定性不如直接读文件。适合偶尔导出一次数据的场景,不适合高频定时任务。
数据拿到之后怎么用
自选股列表只是起点。拿到代码列表后,用 akshare 或 tushare 拉取行情数据,拼成DataFrame,就能做均线监控、涨跌幅排序、期货基差跟踪。做期货的读者可以把商品期货主力合约代码和股票自选放在同一张表里,用颜色区分品种,每天开盘前跑一次脚本生成监控面板。
需要注意两个坑。同花顺自选股文件在客户端运行时可能被占用,读取前最好确认同花顺已经关闭,或者用 shutil.copy 先复制一份再解析。编码方面,股票名称可能包含GBK字符,用 decode('gbk', errors='ignore') 处理避免报错。
更省事的替代路径
如果只是想要自选股数据,未必非得从同花顺抠。同花顺网页版的自选股页面可以用 requests 加 cookie 直接请求,返回的是JSON格式,解析成本低得多。登录网页版后从浏览器开发者工具里复制请求头,用Python复现请求,分页拉取自选股列表。缺点是cookie会过期,需要定期更新。
对于期货交易者,很多期货公司的交易软件自带自选股导出功能,导出的CSV直接用pandas读取,比逆向同花顺文件省力。选哪种方式取决于你的使用频率和对稳定性的要求。
落地建议
先用方法一快速验证,花十分钟写个脚本把自选股代码打印出来。确认能跑通后,把代码列表接入行情接口,做成每日自动运行的定时任务。同花顺升级导致脚本失效时,退回方法二应急。两条路都走一遍,你对本地数据的掌控力会明显上一个台阶。