3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在股票市场中,主力资金(超大单和大单)的动向往往对短期价格走势具有较强的指示作用。通过监控主力净额(net_amount_main),量化投资者可以识别机构资金跟进的标的,从而构建高效的资金流选股策略。
本文将详细介绍如何在 JoinQuant(聚宽)平台上,使用 get_money_flow API 获取资金流数据,并编写一个定期调仓的主力资金动量选股策略。
聚宽提供了 get_money_flow 函数,用于获取沪深 A 股的每日资金流向数据。
from jqdata import *
get_money_flow(security_list, start_date=None, end_date=None, fields=None, count=None)
security_list: 股票代码或股票代码列表(例如 '000001.XSHE' 或股票池列表)。end_date: 查询截止日期(默认为今天)。count: 取 end_date 前 count 个交易日的数据。fields: 返回字段列表。核心指标如下:
net_amount_main: 主力净额(万元),计算公式为:超大单净额 + 大单净额。net_pct_main: 主力净占比(%),主力净额 / 总成交额。net_amount_xl: 超大单净额(≥50万股或100万元)。net_amount_l: 大单净额(10万-50万股或20万-100万元)。注意:在回测中,为避免未来函数,通常查询截至
context.previous_date的历史数据。
net_amount_main)**最大的前 10 只股票。use_real_price),设置真实的滑点与手续费。# 导入聚宽数据库
from jqdata import *
def initialize(context):
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 设置基准
set_benchmark('000300.XSHG')
# 设置手续费:买入佣金万分之三,卖出佣金万分之三加千分之一印花税
set_order_cost(OrderCost(open_tax=0, close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
# 选股参数设置
g.stock_num = 10 # 持仓股票数
g.lookback_days = 5 # 计算资金流的回看天数
# 设置定时运行函数:每周第一个交易日 09:30 执行调仓
run_weekly(my_trade, weekday=1, time='09:30')
def my_trade(context):
# 1. 获取股票池(以沪深300成分股为例)
stocks = get_index_stocks('000300.XSHG', date=context.current_dt)
# 2. 过滤停牌、ST及未上市新股
current_data = get_current_data()
stocks = [s for s in stocks if not current_data[s].paused and not current_data[s].is_st]
# 3. 获取资金流数据,提取主力净额
df_money = get_money_flow(stocks, end_date=context.previous_date, count=g.lookback_days, fields=['sec_code', 'net_amount_main'])
if df_money is None or df_money.empty:
return
# 4. 按股票汇总过去 N 天的主力净额总和
main_sum = df_money.groupby('sec_code')['net_amount_main'].sum()
# 5. 排序并按主力净额最大选取前 N 只股票
target_stocks = main_sum.sort_values(ascending=False).head(g.stock_num).index.tolist()
# 6. 执行卖出:不在目标池中的股票清仓
for stock in context.portfolio.positions:
if stock not in target_stocks:
order_target(stock, 0)
log.info("卖出非目标股: %s" % stock)
# 7. 执行买入:等权重买入目标股票
if len(target_stocks) > 0:
# 获取可用资金并等分
cash_per_stock = context.portfolio.available_cash / len(target_stocks)
for stock in target_stocks:
if stock not in context.portfolio.positions:
order_value(stock, cash_per_stock)
log.info("买入股票: %s, 预算资金: %.2f" % (stock, cash_per_stock))
net_pct_main)正交化/标准化:直接使用绝对净额可能偏向市值较大的股票,引入 net_pct_main 可以剔除市值影响,更客观反映资金控盘程度。handle_data 或 run_daily 中加入移动止损,可有效规避主力资金“假拉高真出货”的风险。