Warning: file_exists(): open_basedir restriction in effect. File(/www/wwwroot/com.xiximiao.oa/com.cmstop/public/www/wp-content/db.php) is not within the allowed path(s): (/www/wwwroot/com.xiximiao.oa/com.cmstop/public/www/:/tmp/:/proc/:/var/log/nginx/:/www/wwwroot/com.xiximiao.oa/com.cmstop/public/:/www/wwwroot/com.xiximiao.oa/com.cmstop/vendor/:/www/wwwroot/com.xiximiao.oa/com.cmstop/ppk/) in /www/wwwroot/com.xiximiao.oa/com.cmstop/public/www/wp-includes/load.php on line 707
2079 【多因子选股模型框架】(单因子各项指标评分细则).py » 轻知量化 QMT、PTrade、聚宽策略分享交流平台

2079 【多因子选股模型框架】(单因子各项指标评分细则).py

# 标题:【多因子选股模型框架】(单因子各项指标评分细则)

# 导入函数库
from jqdata import *
import numpy as np 
import pandas as pd 
from jqfactor import *

# 初始化函数,设定基准等等
def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 输出内容到日志 log.info()
    log.info('初始函数开始运行且全局只运行一次')
    # 过滤掉order系列API产生的比error级别低的log
    # log.set_level('order', 'error')

    ### 股票相关设定 ###
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')

      # 开盘时运行
    run_monthly(market_open, -1,time='open', reference_security='000300.XSHG')
    
    # 购买股数
    g.num = 30

def market_open(context):
    log.info(context.current_dt)
    # 直接调用即可
    get_stocks_filtered()
    
    # 获取前一天因子数据
    q = query(
        valuation.code,
        income.operating_profit / income.operating_revenue, 
        indicator.roa,
        indicator.gross_profit_margin,
        income.net_profit,
        indicator.gross_profit_margin * income.operating_revenue / balance.total_assets,
        valuation.pb_ratio,
        valuation.ps_ratio,
        valuation.pe_ratio,
        valuation.turnover_ratio,
        ).filter(
            valuation.code.in_(g.stocklist)
            )
            
    df = get_fundamentals(q).set_index('code')
    df = clean_factor(context,df)
    
    score_select(context,df)
    rebalance(context)
    

def score_select(context,df):
    """
    打分选股函数:
    这里前四个因子是正相关,后五个是负相关
    """
    for i in range(len(df.columns)):
        # 前五个正向打分
        if i < 5 :
            df.iloc[:,i] = df.iloc[:,i].rank()
        # 后四个逆向打分
        else:
            df.iloc[:,i] = df.iloc[:,i].rank(ascending=False)

    g.buylist = list(df.sum(axis=1).sort_values(ascending=False)[:g.num].index)
    
def rebalance(context):
    """调仓函数,先卖后买"""
    # 卖出
    for stock in context.portfolio.positions.keys():
        if stock not in g.buylist:
            order_target_value(stock,0)
    
    # 买入
    cash = context.portfolio.total_value / len(g.buylist)
    for stock in g.buylist:
        order_target_value(stock,cash)
        

def get_stocks_filtered(indexID='000300.XSHG'):
    """
    获取筛选后的股票池
    """
    '''
    获取某一天筛选后的指数成份股
    :param tradedate: 指定某一天
    :param indexID:
    :return:
    '''
    stocklist = []
    # 获取当天指数成份股列表
    stock_index = get_index_stocks(indexID)
    # 判断当天是否是st,返回的是df
    for stock in stock_index:
        curr_dt = get_current_data()[stock]
        # 判断是否是st或者停牌
        if not (curr_dt.is_st or curr_dt.paused):
            stocklist.append(stock)
    
    g.stocklist = stocklist


2025-02-21
⚠️
本站资源大多来自网络,仅供网友学习交流,未经作者或上传书面授权,请勿作他用。
站长 vx: xiangyin615 或者 留言反馈 ,我们将尽快处理。
Notice: When you of the legal rights be violate, please stir to vx: xiangyin615
个人中心
购物车
优惠劵
搜索