示例#1
0
def callback(ch, method, properties, body):
    #print("[X] Received %r" % (body.decode('utf-8'),))
    message = body.decode('utf-8')
    #message = body.decode()
    jsonobj = json.loads(message)
    task_model_name = jsonobj["mn"]
    task_service_name = jsonobj["sn"]
    task_service_file = jsonobj["sf"]

    indicatorId = ""
    if ("indicator_id" in jsonobj):
        indicatorId = jsonobj["indicator_id"]
    print("准备执行service层%r的%r方法" % (task_service_file, task_service_name))
    uuid = uuid_util.gen_uuid()
    task_model_name = getattr(TaskModel, task_model_name)
    service_class_name = importlib.import_module('fof.service.' +
                                                 task_service_file)
    off_line_service = getattr(service_class_name, task_service_name)
    if indicatorId == "":
        model = OfflineTaskModel(task_model_name, off_line_service, "", uuid)
    else:
        model = OfflineTaskModel(task_model_name, off_line_service, "", uuid,
                                 indicatorId, "1")
    logic_processor.doLogic(model, )
    print("消费完成")
    ch.basic_ack(delivery_tag=method.delivery_tag)
示例#2
0
def other_indicator(request):
    """
    离线计算其他指标
    :param request:
        : indicatorId: 指标Id
    :return:
    """

    req = request.data

    try:
        bun = Bunch(req)

        indicatorId = bun.indicatorId
    except:
        raise Error("indicatorId 不能为空")

    uuid = uuid_util.gen_uuid()
    model = OfflineTaskModel(TaskModel.qitazhibiao, offline_value_service.other_indicator, request, uuid,
                             extVal=indicatorId)

    ThreadTool.pool.submit(logic_processor.doLogic, (model,))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#3
0
def indicator_score_rank(request, format=None):
    """
    指标打分
    :param request:
           indicatorId    : 指标id
           {"indicatorId": "1"}
    :return:
    """

    req = request.data
    logger.info("req:", req)

    try:
        m = Bunch(req)
        indicatorId = m.indicatorId
    except Exception as ae:
        raise Error("参数验证异常", ae)

    uuid = uuid_util.gen_uuid()

    model = OfflineTaskModel(TaskModel.zhibiaodafen,
                             offline_score_service.indicator_score_rank,
                             request, uuid, indicatorId, "1")

    ThreadTool.pool.submit(logic_processor.doLogic, (model, ))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#4
0
def hand_turn_over(model):
    # 能力分析 - 持股集中度、换手率
    # fof_fund_stock_porfolio

    if not del_data('fof_fund_stock_porfolio'):
        raise Error("删除历史数据失败,任务结束")

    fundSymbols = getData_fundSymbols(['股票型', '混合型'])

    btParms = {
        'symbol': fundSymbols,
        'startDate': '20020101',
        'endDate': datetime.strftime(datetime.today(), '%Y%m%d')
    }
    self = fundTurnOver(btParms)
    output = self.output
    for i in output:
        val = output[i]
        for k, v in val.items():
            dt = k  # 时间
            value = v  # 值
            symbo = i  # 基金
            id_ = uuid_util.gen_uuid()
            ls = []
            ls.append(id_)
            ls.append(symbo)
            ls.append(dt._short_repr.replace("-", ""))
            ls.append(transformFloatIfAvaliable3(value))
            ls.append("sys")
            ls.append(datetime.now())
            ls.append("sys")
            ls.append(datetime.now())
            sql = "INSERT INTO `fof`.`fof_fund_stock_porfolio`(`OBJECT_ID`, `J_WINDCODE`, `TRADE_DT`, `CHANGE_RATE`, `CREATE_USER_ID`, `CREATE_TIME`, `UPDATE_USER_ID`, `UPDATE_TIME`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
            mysqlops.insert_one(MysqlConf.DB.fof, sql, tuple(ls))
示例#5
0
def compute_manager_product(model: OfflineTaskModel):
    if not del_data('fof_manager_product'):
        raise Error("删除历史数据失败,任务结束")

    test = managerAnnualReturn()
    mgrDF = test.output.fillna("999999999.9999")
    # mgrDF.to_csv("C:\\Users\\futanghang\\Desktop\\nn.csv")
    # mgrDF = pd.read_csv("C:\\Users\\futanghang\\Desktop\\mgr.csv")
    for hls in mgrDF.values.tolist():
        objId = uuid_util.gen_uuid()
        ls = [transformFloatIfAvaliable3(l) for l in hls]
        lst = []
        lst.append(objId)
        lst.append(ls[0])
        lst.append(ls[1])
        lst.append(ls[2])
        lst.append(ls[5])
        lst.append(ls[3])
        lst.append(ls[4])
        lst.append(ls[6][0:-2])
        lst.append('sys')
        lst.append(datetime.now())
        lst.append("sys")
        lst.append(datetime.now())
        lst.append(0)
        sql = "insert into fof_manager_product values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
        # fs = sql % tuple(lst)
        mysqlops.insert_one(MysqlConf.DB.fof, sql, tuple(lst))
示例#6
0
def callback(ch, method, properties, body):
    # print("[X] Received %r" % (body.decode('utf-8'),))
    message = body.decode('utf-8')
    jsonobj = json.loads(message)
    task_model_name = jsonobj["mn"]
    task_service_name = jsonobj["sn"]
    task_service_file = jsonobj["sf"]

    indicatorId = ""
    if ("indicator_id" in jsonobj):
        indicatorId = jsonobj["indicator_id"]

    print("准备执行service层%r" % task_service_name)
    uuid = uuid_util.gen_uuid()
    task_model_name = getattr(TaskModel, task_model_name)
    service_class_name = __import__(task_service_file)
    off_line_service = getattr(service_class_name, task_service_name)
    if indicatorId == "":
        model = OfflineTaskModel(task_model_name, off_line_service, "", uuid)
    else:
        model = OfflineTaskModel(task_model_name, off_line_service, "", uuid,
                                 indicatorId, "1")
    #启动长时间的任务线程执行
    # worker = threading.Thread(target=thread_func, args=(ch, method, body,model))
    logic_processor.doLogic(model)
    # time1 = time.time()
    # flag = True
    # while flag:
    #     time2 = time.time()
    #     span = time2 - time1
    #     if span > 28800:
    #         flag = False
    # print("退出任务")
    ch.basic_ack(delivery_tag=method.delivery_tag)
示例#7
0
def return_weight(model):
    if not del_data('fof_fund_excess_return_weight'):
        raise Error("删除历史数据失败,任务结束")
    # fof_fund_excess_return_weight
    # 一次性调取需要用到的公共数据
    stockIndus, stockRet, indusRet, crIndus = publicData_stockAndIndustry()
    # 批量生成基金经理任职区间信息
    '''
    首次存入数据库时需要全部运行,后续更新维护时只需更新在任基金经理信息即可.
    选股能力仅针对于股票型与混合型基金
    '''
    managerInfo = getData_fundManagerInfo_all()
    fundSymbols = getData_fundSymbols(['股票型', '混合型'])
    tmp = []
    for row in managerInfo.index:
        if managerInfo.loc[row, 'fund'] in fundSymbols:
            tmp.append(managerInfo.loc[row].to_dict())
    managerInfo = pd.DataFrame(tmp, columns=managerInfo.columns)

    output_all = []
    for i in range(len(managerInfo)):
        btParms = {
            'symbol': managerInfo.loc[i, 'fund'],
            'manager': managerInfo.loc[i, 'manager']
        }
        try:
            test = stockPickingAbility_manager(btParms, stockIndus, stockRet,
                                               indusRet, crIndus)
            output = test.output
            # output['compareReturnIndustry'].to_csv("c:\\users\\futanghang\\desktop\\compareReturnIndustry.csv")
            # output['excessReturnIndustry'].to_csv("c:\\users\\futanghang\\desktop\\excessReturnIndustry.csv")
            # output['excessReturnQuarter'].to_csv("c:\\users\\futanghang\\desktop\\excessReturnQuarter.csv")
            # output['mainStcokReturn'].to_csv("c:\\users\\futanghang\\desktop\\mainStcokReturn.csv")
            dda = output['excessReturnQuarter']
            for k, v in dda.items():
                # k time,v :value

                wCode = output['symbol']  # 基金Wind代码
                managerName = output['manager']  # 基金经理名称

                managerId = output['managerId']  # 基金经理id

                id_ = uuid_util.gen_uuid()  # objId
                lst = []
                lst.append(id_)
                lst.append(wCode)
                lst.append(managerId)
                lst.append(managerName)
                lst.append(k._short_repr.replace("-", ""))
                lst.append(v)
                lst.append("sys")
                lst.append(datetime.now())
                lst.append("sys")
                lst.append(datetime.now())
                ls = [transformFloatIfAvaliable4(i) for i in lst]
                sql = "INSERT INTO `fof`.`fof_fund_excess_return_weight`(`OBJECT_ID`, `J_WINDCODE`, `MANAGER_ID`, `MANAGER_NAME`, `TRADE_DT`, `EXCESS_RETURN`, `CREATE_USER_ID`, `CREATE_TIME`, `UPDATE_USER_ID`, `UPDATE_TIME`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
                mysqlops.insert_one(MysqlConf.DB.fof, sql, tuple(ls))
        except Exception as e:
            pass
示例#8
0
def risk_multiple(model):
    # 风险因子业绩归因模块
    # fof_multi_attr_riskmodel
    if not del_data('fof_multi_attr_riskmodel'):
        raise Error("删除历史数据失败,任务结束")

    stockIndus, indusReturn, factorExposure, factorReturn = publicData_riskModel(
    )

    # 批量运行
    '''
    跨期归因结果需要存储多个周期值
    单期归因结果仅存储成立以来的值即可
    跨期归因和单期归因可以用两张表来存储数据
    '''
    # dataframe 周期类型和数据库周期类型映射关系
    cyleFormula = {'1': '1', '2': '2', '3': '3', '5': '4', '成立以来': '5'}
    fundSymbols = getData_fundSymbols(['股票型', '混合型'])
    cycleList = ['1', '2', '3', '5', '成立以来']
    holdingTypeList = ['mainStockHolding', 'allStockHolding']
    for holdingType in holdingTypeList:
        for symbol in fundSymbols:
            for cycle in cycleList:
                btParms = {
                    'symbol': symbol,
                    'cycle': cycle,
                    'holdingType': holdingType
                }
                self = attribution_riskModel(btParms, stockIndus, indusReturn,
                                             factorExposure, factorReturn)
                output = self.output
                tp = "1" if holdingType == 'mainStockHolding' else '2'  # 持仓类型
                param = output['multiAttr']
                if len(param) == 0:
                    continue
                for idx in param.index:
                    di = param.loc[idx].to_dict()
                    indexName = idx  # 因子名称
                    indexType = di['factorType']  # 因子分类
                    indexAttr = di['multiAttr']  # 因子贡献收益
                    cyleTp = cyleFormula[cycle]  # 周期类型
                    lsd = []
                    id_ = uuid_util.gen_uuid()
                    lsd.append(id_)
                    lsd.append(output['symbol'])
                    lsd.append(tp)
                    lsd.append(cyleTp)
                    lsd.append(indexType)
                    lsd.append(indexName)
                    lsd.append(indexAttr)
                    lsd.append("sys")
                    lsd.append(datetime.now())
                    lsd.append("sys")
                    lsd.append(datetime.now())
                    lsd = [transformFloatIfAvaliable4(l) for l in lsd]

                    sql = 'INSERT INTO `fof`.`fof_multi_attr_riskmodel`(`OBJECT_ID`, `S_INFO_WINDCODE`, `DATA_TYPE`, `CYCLE_TYPE`, `FACTOR_TYPE`, `FACTOR_NAME`, `FACTOR_VALUE`, `CREATE_USER_ID`, `CREATE_TIME`, `UPDATE_USER_ID`, `UPDATE_TIME`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
                    mysqlops.insert_one(MysqlConf.DB.fof, sql, tuple(lsd))
示例#9
0
def risk_single(model):
    # 风险因子业绩归因模块
    # fof_single_attr_riskmodel
    if not del_data('fof_single_attr_riskmodel'):
        raise Error("删除历史数据失败,任务结束")

    stockIndus, indusReturn, factorExposure, factorReturn = publicData_riskModel(
    )

    # 批量运行
    '''
    跨期归因结果需要存储多个周期值
    单期归因结果仅存储成立以来的值即可
    跨期归因和单期归因可以用两张表来存储数据
    '''

    fundSymbols = getData_fundSymbols(['股票型', '混合型'])
    cycleList = ['成立以来']  # 这个程序跟之前的程序有一点特殊,就是多期归因要存多个周期的结果,单期归因只存成立以来的结果
    holdingTypeList = ['mainStockHolding', 'allStockHolding']
    for holdingType in holdingTypeList:
        for symbol in fundSymbols:
            for cycle in cycleList:
                btParms = {
                    'symbol': symbol,
                    'cycle': cycle,
                    'holdingType': holdingType
                }
                self = attribution_riskModel(btParms, stockIndus, indusReturn,
                                             factorExposure, factorReturn)
                output = self.output
                tp = "1" if holdingType == 'mainStockHolding' else '2'  # 持仓类型
                param = output['singleAttr']
                if len(param) == 0:
                    continue
                for idx in param.index:
                    dt = idx  # time
                    di = param.loc[idx].to_dict()
                    style = di['style']  # 风格因子归因
                    industry = di['industry']  # 行业因子归因
                    idiosyn = di['idiosyn']  # 特质因子归因
                    fundRet = di['fundRet']  # 基金当月收益率
                    lsd = []
                    id_ = uuid_util.gen_uuid()
                    lsd.append(id_)
                    lsd.append(output['symbol'])
                    lsd.append(dt._short_repr.replace("-", ""))
                    lsd.append(tp)
                    lsd.append(style)
                    lsd.append(industry)
                    lsd.append(idiosyn)
                    lsd.append(fundRet)
                    lsd.append("sys")
                    lsd.append(datetime.now())
                    lsd.append("sys")
                    lsd.append(datetime.now())
                    lsd = [transformFloatIfAvaliable4(l) for l in lsd]
                    sql = 'INSERT INTO `fof`.`fof_single_attr_riskmodel`(`OBJECT_ID`, `S_INFO_WINDCODE`, `TRADE_DT`, `DATA_TYPE`, `STYLE`, `INDUSTRY`, `IDIOSYN`, `FUND_RETURN`, `CREATE_USER_ID`, `CREATE_TIME`, `UPDATE_USER_ID`, `UPDATE_TIME`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
                    mysqlops.insert_one(MysqlConf.DB.fof, sql, tuple(lsd))
示例#10
0
def other_indicator(model: OfflineTaskModel):
    # 离线计算其他指标

    indicatorInfo = model.taskModel

    indicatorId = model.extVal

    if del_data(sqlPa="delete from fof_index_value where INDICATOR_ID = '%s'" % indicatorId) == False:
        raise Error("删除历史数据失败,任务结束")

    if indicatorId not in INDEX_CODE_NAME_CACHE.keys():
        raise Error("指标id不存在:{}".format(indicatorId))

    indexName = INDEX_CODE_NAME_CACHE[indicatorId]

    # fundAdjNav = getPublicData(['股票型', '混合型'])
    fundAdjNav = getPublicData()
    fundSymbols = list(fundAdjNav.columns)
    updatedType = []
    fundClass_1 = pd.Series('混合型基金', index=fundSymbols)
    fundClass_tmp = getData_fundInformation(fundSymbols)['FUND_INVESTTYPE']
    fundClass_1[fundClass_tmp.index] = fundClass_tmp
    for symbol in fundSymbols:
        allIndicators = []
        fundType = fundClass_1[symbol]
        if fundType not in updatedType:
            for cycle in n_cycle_tp:
                btParms = {'indexName': indexName, 'cycle': cycle, 'symbol': symbol, 'sample': '一级',
                           'marketIndex': '',
                           'otherPar': ''}
                self = indexScore_fund(btParms, fundAdjNav, 'auto')
                op = self.output
                val = op['factorValue']
                allIndicators.append(val)
                updatedType.append(fundType)
        df = pd.DataFrame(allIndicators).fillna(bus_const.blank)
        cols = df.columns.tolist()
        for col in cols:
            res = df[col]
            lst = res.values.tolist()
            lst = [transformFloatIfAvaliable(l) for l in lst]
            objId = uuid_util.gen_uuid()
            lst.insert(0, str(objId))
            lst.insert(1, str(indicatorId))
            lst.insert(2, col)
            date = formatDate2yyyymmdd()
            lst.insert(3, str(date))
            lst.append("sys")
            lst.append(datetime.datetime.now())
            lst.append("sys")
            lst.append(datetime.datetime.now())

            tp = tuple(lst)
            sql = "INSERT INTO fof_index_value (`OBJECT_ID`, `INDICATOR_ID`, `J_WINDCODE`, `TRADE_DT`, `THISYEAR_VALUE`, `QUARTER_VALUE`, `HALFYEAR_VALUE`, `YEAR_VALUE`, `TWOYEA_VALUE`, `THREEYEAR_VALUE`, `FIVEYEAR_VALUE`, `N1_VALUE`, `N2_VALUE`, `CREATE_USER_ID`, `CREATE_TIME`, `UPDATE_USER_ID`, `UPDATE_TIME`, `DELETE_FLAG`) VALUES ( %s, %s, %s, %s, %s, %s,%s,%s,  %s,%s, %s, %s, %s, %s, %s, %s, %s,0)"

            mysqlops.insert_one(MysqlConf.DB.fof, sql, tp)
        allIndicators.clear()
示例#11
0
def volatility(model: OfflineTaskModel):
    # 离线计算年化波动率
    if del_data('fof_variance') == False:
        raise Error("删除历史数据失败,任务结束")

    indicatorInfo = model.taskModel
    taskName = indicatorInfo.value[0]

    indiId = get_indicator_id(taskName)

    # fundAdjNav = getPublicData(['股票型', '混合型'])
    fundAdjNav = getPublicData()
    fundSymbols = list(fundAdjNav.columns)
    fundClass_1 = pd.Series('混合型基金', index=fundSymbols)
    fundClass_tmp = getData_fundInformation(fundSymbols)['FUND_INVESTTYPE']
    fundClass_1[fundClass_tmp.index] = fundClass_tmp
    halfs = indicatorInfo.value[1]
    for half in halfs:
        updatedType = []
        allIndicators = []
        for symbol in fundSymbols:
            fundType = fundClass_1[symbol]
            if fundType not in updatedType:
                for cycle in n_cycle_tp:
                    btParms = {'indexName': taskName, 'cycle': cycle, 'symbol': symbol, 'sample': '一级',
                               'marketIndex': '',
                               'otherPar': half}
                    self = indexScore_fund(btParms, fundAdjNav, 'auto')
                    op = self.output
                    val = op['factorValue']
                    allIndicators.append(val)
                    updatedType.append(fundType)
            df = pd.DataFrame(allIndicators).fillna(bus_const.blank)
            cols = df.columns.tolist()
            for col in cols:
                res = df[col]
                lst = res.values.tolist()
                lst = [transformFloatIfAvaliable(l) for l in lst]

                objId = uuid_util.gen_uuid()
                lst.insert(0, str(objId))
                lst.insert(1, str(indiId))
                lst.insert(2, str(col))
                date = formatDate2yyyymmdd()
                lst.insert(3, str(date))
                lst.insert(4, transformString2Decimal(half))
                lst.append("sys")
                lst.append(datetime.datetime.now())
                lst.append("sys")
                lst.append(datetime.datetime.now())

                tp = tuple(lst)
                sql = "INSERT INTO fof_variance (`OBJECT_ID`, `INDICATOR_ID`, `J_WINDCODE`, `TRADE_DT`, `F_WEIGHT`, `THISYEAR_VALUE`, `QUARTER_VALUE`, `HALFYEAR_VALUE`, `YEAR_VALUE`, `TWOYEA_VALUE`, `THREEYEAR_VALUE`, `FIVEYEAR_VALUE`, `N1_VALUE`, `N2_VALUE`, `CREATE_USER_ID`, `CREATE_TIME`, `UPDATE_USER_ID`, `UPDATE_TIME`, `DELETE_FLAG`) VALUES ( %s, %s, %s, %s, %s, %s, %s,%s, %s, %s,  %s, %s, %s, %s, %s, %s, %s,%s,0)"
                mysqlops.insert_one(MysqlConf.DB.fof, sql, tp)
            allIndicators.clear()
示例#12
0
def industry_config_score(model):
    # sql = "delete from fof_fund_industry_score "
    # mysqlops.fetch_one(MysqlConf.DB.fof, sql)
    if not del_data('fof_fund_industry_score'):
        raise Error("删除历史数据失败,任务结束")

    # 为提高运行速度,公共数据一次性提取,并作为参数传入要调用的类
    stockIndus, indusNet = getPublicDataAllocation()

    # 批量生成基金经理任职区间信息
    managerInfo = getData_fundManagerInfo_all()
    fundSymbols = getData_fundSymbols(['股票型', '混合型'])
    tmp = []
    for row in managerInfo.index:
        if managerInfo.loc[row, 'fund'] in fundSymbols:
            tmp.append(managerInfo.loc[row].to_dict())
    managerInfo = pd.DataFrame(tmp, columns=managerInfo.columns)
    '''
    首次存入数据库时需要全部运行,后续更新维护时只需更新在任基金经理信息即可
    '''

    # 批量生成基金经理行业配置能力
    for i in range(len(managerInfo)):
        btParms = {
            'symbol': managerInfo.loc[i, 'fund'],
            'manager': managerInfo.loc[i, 'manager']
        }
        try:
            test = industryAllocation_manager(btParms, stockIndus, indusNet)
            output = test.output
            scoreDF = output['alloScore']  # fof_fund_industry_score
            for j, v in scoreDF.items():
                sVal = v  # 配置占股票市值比
                dt_ = j  # 时间
                id_ = uuid_util.gen_uuid()  # objId
                wCode = output['symbol']  # 基金代码
                lst = []
                lst.append(id_)
                lst.append(wCode)
                lst.append(output['managerId'])
                lst.append(output['manager'])
                lst.append(dt_._short_repr.replace("-", ""))
                lst.append(transformFloatIfAvaliable4(sVal))
                lst.append("sys")
                lst.append(datetime.now())
                lst.append("sys")
                lst.append(datetime.now())
                sql = "INSERT INTO `fof`.`fof_fund_industry_score`(`OBJECT_ID`, `J_WINDCODE`,  `MANAGER_ID`,`MANAGER_NAME`,`TRADE_DT`,  `RETURN_SCORE`, `CREATE_USER_ID`, `CREATE_TIME`, `UPDATE_USER_ID`, `UPDATE_TIME`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
                mysqlops.insert_one(MysqlConf.DB.fof, sql, tuple(lst))
        except:
            pass
示例#13
0
def maximum_drawdown(request):
    """
    离线计算最大回撤
    :param request:
    :return:
    """
    uuid = uuid_util.gen_uuid()
    model = OfflineTaskModel(TaskModel.zuidahuiche, offline_value_service.maximum_drawdown, request, uuid)

    ThreadTool.pool.submit(logic_processor.doLogic, (model,))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#14
0
def risk_single(request):
    """
    风险因子业绩归因模块 fof_single_attr_riskmodel

    :param request:
    :return:
    """
    uuid = uuid_util.gen_uuid()
    model = OfflineTaskModel(TaskModel.stockRiskSingle,
                             offline_index_service.risk_single, request, uuid)
    ThreadTool.pool.submit(logic_processor.doLogic, (model, ))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#15
0
def stockexpousre(request):
    """
    导入因子库
    :param request:
    :return:
    """
    uuid = uuid_util.gen_uuid()
    model = OfflineTaskModel(TaskModel.stockexpousre,
                             offline_index_service.stockexpousre, request,
                             uuid)
    ThreadTool.pool.submit(logic_processor.doLogic, (model, ))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#16
0
def calmar_ratio(request):
    """
    离线计算卡玛比率
    :param request:
    :return:
    """

    uuid = uuid_util.gen_uuid()
    model = OfflineTaskModel(TaskModel.kamabilv, offline_value_service.calmar_ratio, request, uuid)

    ThreadTool.pool.submit(logic_processor.doLogic, (model,))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#17
0
def volatility(request):
    """
    离线计算年化波动率
    :param request:
    :return:
    """

    uuid = uuid_util.gen_uuid()
    model = OfflineTaskModel(TaskModel.nianhuabodonglv, offline_value_service.volatility, request, uuid)

    ThreadTool.pool.submit(logic_processor.doLogic, (model,))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#18
0
def intervalYield(request):
    """
    离线计算区间收益率

    :return:
    """
    uuid = uuid_util.gen_uuid()

    model = OfflineTaskModel(TaskModel.qujianshouyilv, offline_value_service.interval_yield, request, uuid)

    ThreadTool.pool.submit(logic_processor.doLogic, model)

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#19
0
def equ_timing(model):
    if not del_data('fof_fund_timing'):
        raise Error("删除历史数据失败,任务结束")

    managerInfo = getData_fundManagerInfo_all()
    fundSymbols = getData_fundSymbols(['股票型', '混合型'])
    tmp = []
    for row in managerInfo.index:
        if managerInfo.loc[row, 'fund'] in fundSymbols:
            tmp.append(managerInfo.loc[row].to_dict())
    managerInfo = pd.DataFrame(tmp, columns=managerInfo.columns)

    # 批量生成基金经理行业配置能力
    for i in range(len(managerInfo)):
        try:
            btParms = {
                'symbol': managerInfo.loc[i, 'fund'],
                'manager': managerInfo.loc[i, 'manager']
            }
            test = equityTimingAbility_manager(btParms)
            output = test.output
            timing = output['hisTiming']
            lst = timing.values.tolist()
            for ls in lst:
                ll = []
                id_ = uuid_util.gen_uuid()
                ll.append(id_)
                ll.append(output['symbol'])
                ll.append(output['managerId'])
                ll.append(output['manager'])
                ll.append(ls[0])  # start
                ll.append(ls[1])  # end
                ll.append(transformFloatIfAvaliable(ls[2]))  # RISING
                ll.append(transformFloatIfAvaliable(ls[3]))  # HOLDINGS_BEGIN
                ll.append(transformFloatIfAvaliable(ls[4]))  # HOLDINGS_END
                ll.append(transformFloatIfAvaliable(ls[5]))  # TIMING_RESULT
                ll.append(transformFloatIfAvaliable(ls[6]))  # HOLDINGS_RATIO
                ll.append(transformFloatIfAvaliable(output['winRatio']))
                ll.append(transformFloatIfAvaliable4(output['avgTimingContr']))
                ll.append("sys")
                ll.append(datetime.now())
                ll.append("sys")
                ll.append(datetime.now())
                sql = "INSERT INTO `fof`.`fof_fund_timing`(`OBJECT_ID`, `J_WINDCODE`, `MANAGER_ID`, `MANAGER_NAME`, `START_DATE`, `END_DATE`, `RISING`, `HOLDINGS_BEGIN`, `HOLDINGS_END`, `TIMING_RESULT`, `HOLDINGS_RATIO`,`TIMING_WIN_RATIO`,`AVG_CONTRIBUTION`, `CREATE_USER_ID`, `CREATE_TIME`, `UPDATE_USER_ID`, `UPDATE_TIME`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"

                insert_one(MysqlConf.DB.fof, sql, tuple(ll))
        except:
            pass
示例#20
0
def stockexpousre(model):
    # factorName即为mongodb数据库相关collection的名字,一次仅支持传入一个因子值
    sql = "delete from fof_stockexpousre "
    mysqlops.fetch_one(MysqlConf.DB.fof, sql)

    if not del_data('fof_stockexpousre'):
        raise Error("删除历史数据失败,任务结束")

    fs = [
        'value',
        'size',
        'beta',
        'earning',
        # 'factorReturn',
        'growth',
        'leverage',
        'liquidity',
        'momentum',
        'nonlinear_size',
        'size',
        'volatility'
    ]
    sql = 'insert into ' \
          'fof_stockexpousre (OBJECT_ID,trade_dt,s_windcode,indicator_code,factor_value,CREATE_USER_ID,CREATE_TIME,UPDATE_USER_ID,UPDATE_TIME)' \
          'values (%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    for fName in fs:
        valueExp = getData_factorExposure(fName)
        valueExp = valueExp.fillna("9999.000000")

        di = valueExp.to_dict()
        for k in di:
            # print("K===%s" % k)
            for v in di.get(k):
                s = uuid_util.gen_uuid()
                lsd = []
                oid = s[:5] + '-' + s[5:9] + '-' + s[9:13] + '-' + s[
                    13:18] + '-' + s[18:]
                lsd.append(oid)
                r = v._date_repr.replace("-", "")
                lsd.append(r)
                lsd.append(k[:-2] + "." + k[-2:])
                lsd.append(fName)
                lsd.append(transformFloatIfAvaliable(di.get(k).get(v)))
                lsd.append("sys")
                lsd.append(datetime.now())
                lsd.append("sys")
                lsd.append(datetime.now())
                mysqlops.insert_one(MysqlConf.DB.fof, sql, tuple(lsd))
示例#21
0
def return_his(request):
    """
    基金经理股票筛选能力
    table:  fof_fund_main_stock_return_his
    :param request:
    :return:
    """
    uuid = uuid_util.gen_uuid()

    model = OfflineTaskModel(TaskModel.jingliShaixuanNengli_return_his,
                             manager_service.return_his, request, uuid)

    ThreadTool.pool.submit(logic_processor.doLogic, (model, ))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#22
0
def net_value(request):
    """
    基金净值风格划分        fof_fundnav_style
    考虑到服务器的承载能力,该程序前期可每周更新,后续服务器运载能力加大,可改为每日更新
    :param request:
    :return:
    """
    uuid = uuid_util.gen_uuid()

    model = OfflineTaskModel(TaskModel.jinglifengge_profit_style,
                             manager_service.net_value, request, uuid)

    ThreadTool.pool.submit(logic_processor.doLogic, (model, ))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#23
0
def compute_manager_product(request, format=None):
    """
    计算基金经理管理的产品信息
    :param request:
    :return:
    """

    uuid = uuid_util.gen_uuid()

    model = OfflineTaskModel(TaskModel.jinglichanpin,
                             manager_service.compute_manager_product, request,
                             uuid)

    ThreadTool.pool.submit(logic_processor.doLogic, (model, ))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#24
0
def holding_style_all(request):
    """
        风格分析 - 持仓风格
    fof_fund_stock_style
    :param request:
    :return:
    """

    uuid = uuid_util.gen_uuid()

    model = OfflineTaskModel(TaskModel.jinglifengge_holding_stype_all,
                             manager_service.holding_style_all, request, uuid)

    ThreadTool.pool.submit(logic_processor.doLogic, (model, ))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#25
0
def equ_timing(request):
    """
    基金经理股票择时能力评价模型
    请于每季结束后的第一个月的15日开始运行本程序(即基金季报发布),按日更新,运行至该月末
    如1季度结束后,于4月15日~4月30日每日更新该数据
    :param request:
    :return:
    """

    uuid = uuid_util.gen_uuid()

    model = OfflineTaskModel(TaskModel.jingliNengli,
                             manager_service.equ_timing, request, uuid)

    ThreadTool.pool.submit(logic_processor.doLogic, (model, ))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#26
0
def holding_style_main(request):
    """
    风格分析-持仓风格   fof_fund_tentop_stock_style

    重仓股数风格暴露数据,请于每季结束后的第一个月的15日开始运行本程序,按日更新,运行至该月末
    全部持仓数据,请于每年的8月21日~8月31日,以及3月21日~3月31日运行
    :param request:
    :return:
    """
    uuid = uuid_util.gen_uuid()

    model = OfflineTaskModel(TaskModel.jinglifengge_holding_stype_main,
                             manager_service.holding_style_main, request, uuid)

    ThreadTool.pool.submit(logic_processor.doLogic, (model, ))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#27
0
def industry_config_score(request):
    """
    离线计算基金经理行业配置能力
    :keyword 表 fof_fund_industry_score
    请于每季结束后的第一个月的15日开始运行本程序(即基金季报发布),按日更新,运行至该月末
    如1季度结束后,于4月15日~4月30日每日更新该数据
    :param request:
    :return:
    """
    uuid = uuid_util.gen_uuid()

    model = OfflineTaskModel(TaskModel.jingliPeizhiNengli_score,
                             manager_service.industry_config_score, request,
                             uuid)

    ThreadTool.pool.submit(logic_processor.doLogic, (model, ))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#28
0
def hand_turn_over(request):
    """
    能力分析-持股集中度、换手率  fof_fund_stock_porfolio


    该程序于每半年进行一次更新
    请于每年的3月20日~3月31日以及8月20日~8月31日更新
    由于程序运行量不大,若更新时间配置麻烦,可设定为每日更新
    :param request:
    :return:
    """
    uuid = uuid_util.gen_uuid()

    model = OfflineTaskModel(TaskModel.jinglifengge_hand_change_rate,
                             manager_service.hand_turn_over, request, uuid)

    ThreadTool.pool.submit(logic_processor.doLogic, (model, ))

    view = OffLineView(uuid)

    return JsonResponse(convert_to_dict(view))
示例#29
0
def net_value(model):
    if not del_data('fof_fundnav_style'):
        raise Error("删除历史数据失败,任务结束")
    # 基金净值风格划分        fof_fundnav_style
    fundSymbols = getData_fundSymbols(['股票型', '混合型'])
    # fundSymbols=fundSymbols[0:20] #生产环境删除此句
    output_all = []
    i = 0
    for symbol in fundSymbols:
        i += 1
        btParms = {'symbol': symbol, 'cycle': '成立以来'}  # 离线入库时cycle设定为"成立以来"即可
        test = fundStyle_nav(btParms)
        output = test.output
        tmp = output['regStat']
        if tmp is None or len(tmp) == 0:
            continue
        for idx in tmp.index:
            di = tmp.loc[idx].to_dict()
            startDate = di['startDate']
            endDate = di['endDate']
            largeCoe = di['largeCoeff']
            smallCoe = di['smallCoeff']
            r2 = di['R2']

            lst = []
            id_ = uuid_util.gen_uuid()  # objId
            lst.append(id_)
            lst.append(output['symbol'])
            lst.append(startDate)
            lst.append(endDate)
            lst.append(largeCoe)
            lst.append(smallCoe)
            lst.append(r2)
            lst.append("sys")
            lst.append(datetime.now())
            lst.append("sys")
            lst.append(datetime.now())
            ll = [transformFloatIfAvaliable4(j) for j in lst]
            sql = "INSERT INTO `fof`.`fof_fundnav_style`(`OBJECT_ID`, `J_WINDCODE`, `START_DATE`, `END_DATE`, `LARGE_COEFFICIENTS`, `SMALL_COEFFICIENTS`,`R2`, `CREATE_USER_ID`, `CREATE_TIME`, `UPDATE_USER_ID`, `UPDATE_TIME`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s,%s, %s)"
            mysqlops.insert_one(MysqlConf.DB.fof, sql, tuple(ll))
示例#30
0
def holding_style_main(model):
    if not del_data('fof_fund_tentop_stock_style'):
        raise Error("删除历史数据失败,任务结束")

    # 获取本模块公共数据
    factorExposure = publicData_stockFactor()

    fundSymbols = getData_fundSymbols(['股票型', '混合型'])
    # fundSymbols = fundSymbols[0:10]  # 生产环境删除此句
    typeList = ['mainStockHolding', 'allStockHolding']
    # 暴露度计算
    # for holdingType in typeList:
    for symbol in fundSymbols:
        btParms = {'symbol': symbol, 'holdingType': 'mainStockHolding'}
        test = fundFactorExposure(btParms, factorExposure)
        output = test.output
        tmp = output['hisExposure']
        # if holdingType == 'mainStockHolding':
        # 10 top
        for time in tmp:
            val = tmp[time]
            for idx in val.index:
                di = val.loc[idx].to_dict()
                exp = di['portExposure']
                expscore = di['portExposureScore']
                ls = []
                ls.append(uuid_util.gen_uuid())
                ls.append(output['symbol'])
                ls.append(time._short_repr.replace("-", ""))
                ls.append(idx)
                ls.append(transformFloatIfAvaliable3(exp))
                ls.append(transformFloatIfAvaliable3(expscore))
                ls.append("sys")
                ls.append(datetime.now())
                ls.append("sys")
                ls.append(datetime.now())
                sql = "INSERT INTO `fof`.`fof_fund_tentop_stock_style`(`OBJECT_ID`, `J_WINDCODE`, `TRADE_DT`, `INDICATOR_NAME`, `EXPOSE_VALUE`, `EXPOSE_SCORE`, `CREATE_USER_ID`, `CREATE_TIME`, `UPDATE_USER_ID`, `UPDATE_TIME`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
                mysqlops.insert_one(MysqlConf.DB.fof, sql, tuple(ls))