聚宽策略一 价值选股股票池策略

价值选股股票池策略

基于价值选股股票池策略(第一个量化策略,基于聚宽平台,之后会改进)

代码如下:

import jqdata
import pandas as pd
import numpy as np
import math
import talib as tl
from jqlib.technical_analysis import *
import statsmodels.api as sm
from pandas.stats.api import ols

def initialize(context):
    g.stocksnum = 100  # 持有最小市值股票数
    g.period = 10  # 轮动频率
    log.set_level('order', 'error')
    run_daily(daily, time='before_open')  # 周期循环daily
    run_daily(mktopen, time='every_bar')
    g.days = 1  # 记录策略进行到第几天,初始为1
    g.holdpct = 1

    g.buylist=[]
    
def trade(context, buylist):
    # 对于每个当下持有的股票进行判断:现在是否已经不在buylist里,如果是则卖出
    for stock in context.portfolio.positions:
        if stock not in buylist:  # 如果stock不在buylist
            order_target(stock, 0)  # 调整stock的持仓为0,即卖出

    # 将总资产(现金+股票)除以持股数g.stocksnum
    position_per_stk = g.holdpct * context.portfolio.total_value / g.stocksnum
    # 调整buylist中的每个股票持仓价值为position_per_stk
    for stock in buylist:
        order_target_value(stock, position_per_stk)


# 止损
def stop(context):
    # 循环查看持仓的每个股票
    for stock in context.portfolio.positions:
        # 如果股票最新价格除以平均成本小于0.8,即亏损超过20%
        if context.portfolio.positions[stock].price / context.portfolio.positions[stock].avg_cost < 0.8:
            # 调整stock的持仓为0,即卖出
            order_target(stock, 0)
            # 输出日志:股票名 止损
            print ("\n%s 止损" % stock)


def pick(context):
    # 获取股票池
    df = get_fundamentals(query(valuation.code, valuation.pb_ratio, indicator.roe))
    # 进行pb,roe大于0筛选
    df = df[(df['roe'] > 0) & (df['pb_ratio'] > 0)].sort('pb_ratio')
    # 以股票名词作为index
    df.index = df['code'].values
    # 取roe倒数
    df['1/roe'] = 1 / df['roe']
    # 获取综合得分
    df['point'] = df[['pb_ratio', '1/roe']].rank().T.apply(f_sum)
    # 按得分进行排序,取指定数量的股票
    df = df.sort('point')[:g.stocksnum]
    
    
    # 取出前g.stocksnum名的股票代码,并转成list类型,buylist为选中的股票
    g.buylist = list(df['code'][:g.stocksnum])
    return g.buylist
def f_sum(x):
    return sum(x)
    
def mktopen(context):
    # 每分钟止损
    stop(context)

def mkt_index(context):
    mktindex = history(count=1, field='close', security_list=['000300.XSHG'])
    mktindex = mktindex.ix[-1, '000300.XSHG']

    date =context.current_dt.strftime("%Y-%m-%d")
    ma20 = MA(['000300.XSHG'], check_date=date, timeperiod=20)
    ma20 = ma20['000300.XSHG']

    if mktindex > ma20:
        return 1
    return 0.5
   
def daily(context):
    # 判断策略进行天数是否能被轮动频率整除余1
    if g.days % g.period == 1:
        buylist = pick(context)
        g.holdpct = mkt_index(context)
        trade(context, buylist)
    else:
        pass  # 什么也不做
    g.days = g.days + 1  # 策略经过天数增加1
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多因子选股是一种投资策略,它使用多个因子来选择股票。每个因子都是一种衡量股票价值或价格的方法,例如市盈率、市净率、股息收益率等。多因子选股策略的目标是通过选择具有良好基本面的股票来实现稳定的长期收益。 多因子选股策略通常包括以下步骤: 1. 确定因子:选择一组有意义的因子,并为每个因子定义一个具体的计算方法。这些因子可以是基本面因子、技术分析因子或其他类型的因子。 2. 数据获取:从可靠的数据源获取股票数据,并计算每个因子的值。这可能需要使用一些计算工具和技术。 3. 因子排名:对每个因子进行排名,并将每个股票的排名得分组合成一个总得分。这可以通过简单地将每个因子的排名百分比加权相加来实现。 4. 股票选择:根据总得分选择排名前若干的股票,构成投资组合。 5. 投资组合管理:定期监控投资组合中的股票,并根据需要进行调整。这可以包括增加新的股票、减少原有的股票或重新分配权重。 多因子选股策略的优点是可以减少单一因子选股策略的风险,增加投资组合的稳定性。同时,通过组合多个因子,多因子选股策略可以更全面地评估股票价值和价格,提高选股的准确性。 当然,多因子选股策略也有一些挑战,例如如何选择最优的因子组合、如何处理数据和计算误差、如何消除市场噪音和极端值等。因此,多因子选股策略需要仔细的研究和测试,以确保其有效性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值