3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在基本面量化选股策略中,流通股本(Float Volume)与总市值/流通市值是极其重要的因子。例如在小市值因子策略中,投资者需要筛选出流通股本较小或流通市值较低的标的进行构建组合。
在 QMT(迅投 QMT)量化平台中,我们可以通过全局上下文对象 ContextInfo 提供的 get_last_volume() 接口快速获取指定股票的最新流通股本。
ContextInfo.get_last_volume(stockcode)
string 类型,股票代码,格式必须为 '代码.市场'(例如 '000002.SZ', '600000.SH')。ContextInfo.get_last_volume(stockcode) 获取最新流通股本。ContextInfo.get_market_data_ex() 或 get_history_data() 获取股票最新的收盘价。流通市值 = 流通股本 × 最新收盘价。以下是一个基于 QMT 的小市值选股示例代码:
#encoding:gbk
import pandas as pd
def init(ContextInfo):
# 1. 设置股票池(以沪深300成份股为例,也可通过 get_stock_list_in_sector 获取全市场)
ContextInfo.stocks = ContextInfo.get_stock_list_in_sector('沪深300')
ContextInfo.set_universe(ContextInfo.stocks)
# 设置调仓持股数量
ContextInfo.hold_count = 5
# 设置定时器:每周一开盘后 09:31 运行策略
ContextInfo.run_time("rebalance", "1nDay", "2023-01-01 09:31:00", "SH")
def rebalance(ContextInfo):
print("--- 开始进行小市值选股调仓 ---")
market_cap_dict = {}
# 2. 获取股票最新价格
price_data = ContextInfo.get_market_data_ex(['close'], ContextInfo.stocks, period='1d', count=1)
for stock in ContextInfo.stocks:
# 跳过停牌股
if ContextInfo.is_suspended_stock(stock):
continue
# 3. 获取最新流通股本(股)
float_volume = ContextInfo.get_last_volume(stock)
# 获取最新收盘价
if stock in price_data and not price_data[stock].empty:
latest_price = price_data[stock]['close'].iloc[-1]
# 4. 计算流通市值(元)
float_market_cap = float_volume * latest_price
market_cap_dict[stock] = float_market_cap
# 5. 按流通市值升序排序,选择市值最小的前 N 只股票
sorted_stocks = sorted(market_cap_dict.items(), key=lambda x: x[1])
target_stocks = [stock for stock, cap in sorted_stocks[:ContextInfo.hold_count]]
print(f"本日筛选出的目标小市值股票: {target_stocks}")
# 6. 执行简单买入/调仓逻辑(回测模式)
# 实际交易中可结合 passorder 或 order_target_percent 等交易函数进行下单
for stock in target_stocks:
order_target_percent(stock, 1.0 / ContextInfo.hold_count, ContextInfo)
def handlebar(ContextInfo):
pass
get_last_volume 时,传入的代码必须带有市场后缀(如 '000002.SZ'),否则可能无法正确读取。ContextInfo.is_suspended_stock() 函数过滤停牌股票,避免因无法交易影响策略执行。ContextInfo.get_financial_data() 函数共同使用。