FMZ上使用富途证券SDK选股范例与讲解

Author: 雨幕, Created: 2022-02-07 11:44:30, Updated: 2023-11-21 21:21:50

img

FMZ上使用富途证券SDK选股范例与讲解

在FMZ上如何进行条件选股呢?今天我们来做一个简单的讲解,带领各位同学实践一下简单的股票池条件选股。

准备工作

和之前文章:在FMZ.CN获取股票市场股票代码集合的实践一样。我们使用富途的python SDK包的功能。所以需要事先准备以下内容。

  • 部署托管者

  • 下载运行FutuOpenD软件

  • 托管者所在设备系统必须已经安装python

  • python上已经安装了futu的SDK软件包

编写选股代码

对于编程基础比较薄弱的同学,我这里详细说明每行代码的作用,直接写在注释上。

选股条件:

  • 1、盈利性,资产回报率 roa_ttm。
  • 2、股价:有些投资者不会碰股价低于10元的公司。因为买1手只需1000元,准入门槛太低,股东构成鱼龙混杂,目的各不相同,投资、投机、短线、长线都有,这会给股价上行带来阻力。

筛选出ROA大于30%(即0.3),股价大于100,小于1000的股票。

策略地址:https://www.fmz.cn/strategy/343918

from futu import *   # 导入富途的SDK软件开发包
import time          # 导入time包用于时间控制
import json          # 导入json包用于JSON字符串的处理

def stockFilter():
    SetErrorFilter("[0-9]{4}")      # 设置错误过滤,过滤掉没必要显示的报错信息
    try:
        quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)   # 创建和Futu OpenD软件的连接
        
        # ROA过滤器,构造根据ROA选股的条件结构,注意ROA仅支持年度数据,所以使用FinancialFilter()函数构造
        filter_roa = FinancialFilter()
        filter_roa.filter_min = 0.3       # 设置符合条件的最小ROA
        filter_roa.stock_field = StockField.ROA_TTM   # 设置筛选的数据,这里设置ROA_TTM即针对股票的ROA基本面指标进行筛选
        filter_roa.is_no_filter = False
        filter_roa.quarter = FinancialQuarter.ANNUAL  # 设置为年度数据
    
        # CUR_PRICE过滤器,构造根据当前价格作为选股条件的结构
        filter_curPrice = SimpleFilter()
        filter_curPrice.filter_min = 100    # 设置价格最小
        filter_curPrice.filter_max = 1000   # 设置价格最大
        filter_curPrice.stock_field = StockField.CUR_PRICE   # 设置筛选的数据,这里设置根据当前最新价格筛选
        filter_curPrice.is_no_filter = False
            
        nBegin = 0   # 设置数据起始点
        last_page = False
        ret_list = list()
        # 初始化空的表格结构,用于当前函数返回
        tbl = {
            "type" : "table", 
            "title" : "roa",
            "cols" : ["股票代码", "股票名称", "ROA", "当前价格"],
            "rows" : []
        }
        while not last_page:
            nBegin += len(ret_list)
            # 根据上面构造的 filter_roa 条件、filter_curPrice 条件进行选股,注意market=Market.HK指定市场为港股市场
            ret, ls = quote_ctx.get_stock_filter(market=Market.HK, filter_list=[filter_roa, filter_curPrice], begin=nBegin)  # 根据条件筛选            
            if ret == RET_OK:
                last_page, all_count, ret_list = ls
                for item in ret_list:
                    # 将筛选出来的股票写入tbl结构
                    tbl["rows"].append([item.stock_code, item.stock_name, item[filter_roa], item[filter_curPrice]])
            else :
                Log("error:", ls)
            time.sleep(3)
            
        quote_ctx.close()  # 结束后记得关闭当条连接,防止连接条数用尽
        return tbl        # 返回结果
    except Exception as e:
        Log(e)
    Log("exit")
    
def main():
    # 调用筛选函数
    tbl = stockFilter()
    
    # 将筛选出的股票信息以表格形式显示出来
    LogStatus("`" + json.dumps(tbl) + "`")

实盘运行

程序筛选出来了基于以上设置条件的股票,以表格形式显示出来。

img

此次筛选,从港股股票池中筛选出共计21支股票。

我们稍作修改:

filter_curPrice.filter_min = 10     # 设置价格最小

把价格最小值100调整成10。也就是股价大于10作为其中一个符合条件,再次运行。

img

这次得出的符合条件的股票就更多了。

当然还可以增加更多的选股条件,或者把选股代码集成到某个策略里选出需要操作的股票池进行程序化交易。


更多内容