def Cal_AllIndex_HalfYear_Holding_Exposure(path, report_date):
    """
    计算重点指数最近一个半年报 的持仓风格暴露
    """
    # 参数举例
    #####################################################################
    # path = 'E:\\3_Data\\4_fund_data\\8_fund_index_exposure_weekly\\'
    # report_date = '20171231'
    # today = datetime.today().strftime("%Y%m%d")

    # 基金池
    #####################################################################
    index_pool_file = os.path.join(path, "fund_pool", '重点指数代码.csv')
    index_pool = pd.read_csv(index_pool_file, index_col=[0], encoding='gbk')
    date = Date().get_trade_date_offset(report_date, 0)
    beg_date = Date().get_trade_date_offset(report_date, -2)
    end_date = Date().get_trade_date_offset(report_date, 2)

    # 计算重点所有重点 基金最近一个半年报 的持仓风格暴露
    #####################################################################
    # 计算万德全A的基准 因为每早下载 这里就不重复下载
    # Index().load_weight_china_index_date(date)

    for i_index in range(len(index_pool)):

        index_code = index_pool.index[i_index]
        # 下载指数权重 因为每早下载 这里就不重复下载
        # if index_code not in ["000300.SH", '000905.SH', '881001.WI']:
        #     Index().load_weight_from_wind_date(index_code=index_code, date=date)
        Index().cal_index_exposure(index_code, beg_date, end_date)

        if i_index == 0:
            exposure = Index().get_index_exposure_date(index_code,
                                                       date,
                                                       type_list=["STYLE"])
            exposure["CTY"] = 1.0
        else:
            exposure_add = Index().get_index_exposure_date(index_code,
                                                           date,
                                                           type_list=["STYLE"])
            exposure_add["CTY"] = 1.0
            exposure = pd.concat([exposure, exposure_add], axis=0)

    #####################################################################
    exposure.index = index_pool.index_name
    exposure.loc["1/3*中小板综+1/3*创业板综+1/3*中证500", :] = exposure.loc[
        ["中小板综", "创业板综", "中证500"], :].mean()
    cols = list(exposure.columns)
    cols.insert(0, 'Type')
    exposure['Type'] = '市场指数'
    exposure = exposure[cols]
    exposure_file = os.path.join(
        path, "halfyear_holding_exposure",
        'IndexHalfYearExposure_' + report_date + '.csv')
    exposure.to_csv(exposure_file)
示例#2
0
    def cal_factor_exposure(self, beg_date, end_date, index_code):
        """ 计算指标数值 """

        short_term = 5
        long_term = 90

        data = Index().get_index_factor(index_code, attr=['CLOSE'])
        print("Calculate Timing Factor %s At From %s To %s" %
              (self.factor_name, beg_date, end_date))
        data['AverageShort'] = data['CLOSE'].rolling(window=short_term).mean()
        data['AverageLong'] = data['CLOSE'].rolling(window=long_term).mean()
        data['Diff'] = data['AverageShort'] - data['AverageLong']
        data = data.dropna()
        data['DiffRatio'] = data['Diff'] / data['CLOSE']
        data['RawTimer'] = data['DiffRatio']
        data['Timer'] = data['RawTimer'].map(self.score_average_diff)

        file = os.path.join(self.data_path, 'exposure',
                            '%s_%s.csv' % (self.factor_name, index_code))
        data = data.dropna(how="all")
        data.to_csv(file)
示例#3
0
def holding_data_liuxin(today, project_path, out_path):

    # 输入参数
    ##################################################################################
    # project_path = 'E:\\4_代码\\pycharmprojects\\timer\\input_data\\'
    # out_path = 'E:\\3_数据\\7_other_data\\0_mail_holding_all\\'
    person_name = 'liuxin'
    # today = datetime(2018, 6, 27).strftime("%Y%m%d")
    before_trade_data = Date().get_trade_date_offset(today, -1)
    today = Date().change_to_str(today)

    # 基金列表
    ##################################################################################
    fund = pd.read_excel(project_path + 'Manage_Fund_Name.xlsx',
                         encoding='gbk')
    fund_val = fund.ix[:, person_name]
    fund_val = fund_val.dropna()
    fund_list = list(fund_val.values)
    # fund_list.append("泰达宏利品质生活")

    # 基金持仓证券
    ##################################################################################

    fund_asset = MfcData().get_fund_security(before_trade_data)
    fund_asset = fund_asset[[
        '持仓日期', '序号', '基金名称', '证券代码', '证券名称', '证券类别', '市值', '市值比净值(%)', '持仓',
        '净买量', '净买金额', '费用合计', '当日涨跌幅(%)', '持仓多空标志', '估值价格', '最新价'
    ]]

    for i_fund in range(len(fund_list)):

        fund_name = fund_list[i_fund]
        fund_asset_fund = fund_asset[fund_asset['基金名称'] == fund_name]
        out_sub_path = os.path.join(out_path, person_name, today,
                                    "holding_data")
        if not os.path.exists(out_sub_path):
            os.makedirs(out_sub_path)
        out_file = os.path.join(out_sub_path, fund_name + '持仓.xlsx')
        fund_asset_fund.to_excel(out_file, index=None)

    # 股票库
    ##################################################################################
    pool_path = Parameter().get_load_out_file("Mfc_Data")
    pool_list = [
        "改革动力股票库.xls", "改革动力禁止库.xls", "改革动力限制库.xls", "公司超五库.xls", "公司股票库.xls",
        "公司关联库.xls", "公司禁止库.xls", "公司限制库.xls", "逆向股票库.xls", "逆向禁止库.xls",
        "逆向限制库.xls", "同顺禁止库.xls", "量化限制库.xls"
    ]

    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")
    if not os.path.exists(out_sub_path):
        os.makedirs(out_sub_path)

    for i_file in range(len(pool_list)):

        file = pool_list[i_file]
        src_file = os.path.join(pool_path, 'raw_file', today, file)
        out_file = os.path.join(out_sub_path, file)
        try:
            shutil.copyfile(src_file, out_file)
        except:
            pd.DataFrame([]).to_excel(out_file)

    # 指数权重 Axioma
    ##################################################################################
    index_code_list = [
        "000300.SH", "000905.SH", "000016.SH", "881001.WI",
        'China_Index_Benchmark'
    ]
    out_sub_path = os.path.join(out_path, person_name, today, "index_weight")
    if not os.path.exists(out_sub_path):
        os.makedirs(out_sub_path)

    for index_code in index_code_list:
        data = Index().get_weight(index_code, before_trade_data)
        out_file = os.path.join(out_sub_path, index_code + '.csv')
        data.index = data.index.map(lambda x: x[0:6] + '-CN')
        data.to_csv(out_file, header=None)
示例#4
0
    def holding_data_for_manager(self, person_name='liuyang'):
        """
        holding_data 中包含 基金资产、单个基金证券、股票池
        index_weight 为指数权重
        """

        # 输入参数
        print(" Prepare Data For ", person_name)
        before_trade_data = Date().get_trade_date_offset(self.today, -1)

        # 基金列表
        fund = MfcData().get_mfc_manage_info()
        fund_val = fund[person_name]
        fund_val = fund_val.dropna()
        fund_list = list(fund_val.values)

        # 基金资产
        fund_asset = MfcData().get_fund_asset(before_trade_data)
        fund_asset = fund_asset[[
            '序号', '统计日期', '基金编号', '基金名称', '股票资产', '净值', '基金份额', '单位净值',
            '单位净值涨跌幅(%)', '累计单位净值', '昨日单位净值', '当日股票收益率(%)', '当日股票净买入金额',
            '股票资产/净值(%)', '当前现金余额', '累计应收金额', '累计应付金额', '期货保证金账户余额', '期货保证金',
            '可用期货保证金', '保证金', 'T+0交易可用', 'T+1交易可用', 'T+0交易可用/净值(%)',
            'T+1交易可用/净值(%)'
        ]]

        fund_asset_fund = fund_asset[fund_asset['基金名称'].map(
            lambda x: x in fund_list)]
        out_sub_path = os.path.join(self.data_path, person_name, self.today,
                                    "holding_data")
        if not os.path.exists(out_sub_path):
            os.makedirs(out_sub_path)
        out_file = os.path.join(out_sub_path, '基金资产.xlsx')
        fund_asset_fund.to_excel(out_file, index=None)

        # 基金持仓证券
        fund_asset = MfcData().get_fund_security(before_trade_data)
        fund_asset = fund_asset[[
            '持仓日期', '序号', '基金名称', '证券代码', '证券名称', '证券类别', '市值', '市值比净值(%)',
            '持仓', '净买量', '净买金额', '费用合计', '当日涨跌幅(%)', '持仓多空标志', '估值价格', '最新价'
        ]]

        for i_fund in range(len(fund_list)):

            fund_name = fund_list[i_fund]
            fund_asset_fund = fund_asset[fund_asset['基金名称'] == fund_name]
            out_file = os.path.join(out_sub_path, fund_name + '持仓.xlsx')
            fund_asset_fund.to_excel(out_file, index=None)

        # 股票库
        pool_path = MfcData().data_path
        pool_path = os.path.join(pool_path, r"mfc_holding_raw\201806_now")

        if person_name == 'liuyang':

            pool_list = [
                "改革动力股票库.xls", "改革动力禁止库.xls", "改革动力限制库.xls", "公司超五库.xls",
                "公司股票库.xls", "公司关联库.xls", "公司禁止库.xls", "公司限制库.xls",
                "逆向股票库.xls", "逆向禁止库.xls", "逆向限制库.xls", "同顺禁止库.xls",
                "量化限制库.xls", '沪深300关联禁止库.xls', '沪深300投资库.xls', '沪深300限制库.xls',
                '中证500关联禁止库.xls', '中证500投资库.xls', '中证500限制库.xls'
            ]

        elif person_name == 'liuxin':

            pool_list = [
                "改革动力股票库.xls", "改革动力禁止库.xls", "改革动力限制库.xls", "公司超五库.xls",
                "公司股票库.xls", "公司关联库.xls", "公司禁止库.xls", "公司限制库.xls",
                "逆向股票库.xls", "逆向禁止库.xls", "逆向限制库.xls", "同顺禁止库.xls",
                "量化限制库.xls", '红利禁止库.xls'
            ]
        elif person_name == 'caolongjie':

            pool_list = [
                "公司超五库.xls", "公司股票库.xls", "公司关联库.xls", "公司禁止库.xls",
                "公司限制库.xls", "专户禁止库.xls", "量化11号禁止库.xls", "人寿固收限制库.xls",
                "人寿固收禁止库(委托人发送).xls", "量化限制库.xls"
            ]

        for i_file in range(len(pool_list)):

            file = pool_list[i_file]
            src_file = os.path.join(pool_path, 'raw_file', self.today, file)
            out_file = os.path.join(out_sub_path, file)
            try:
                shutil.copyfile(src_file, out_file)
            except Exception as e:
                print(e)
                print(src_file)
                print(out_file)
                pd.DataFrame([]).to_excel(out_file)

        # 指数权重 Axioma
        out_sub_path = os.path.join(self.data_path, person_name, self.today,
                                    "index_weight")
        if not os.path.exists(out_sub_path):
            os.makedirs(out_sub_path)

        for index_code in self.index_code_list:
            data = Index().get_weight_date(index_code, before_trade_data)
            out_file = os.path.join(out_sub_path, index_code + '.csv')
            data.index = data.index.map(lambda x: x[0:6] + '-CN')
            data = data.sort_values(by=['WEIGHT'], ascending=False)
            data.to_csv(out_file, header=None)
示例#5
0
def holding_data_clj(today, project_path, out_path):

    # 输入参数
    ##################################################################################
    # project_path = 'E:\\4_代码\\pycharmprojects\\timer\\input_data\\'
    # out_path = 'E:\\3_数据\\7_other_data\\0_mail_holding_all\\'
    person_name = 'caolongjie'
    before_trade_data = Date().get_trade_date_offset(today, -1)
    today = Date().change_to_str(today)

    # 基金列表
    ##################################################################################
    fund = pd.read_excel(project_path + 'Manage_Fund_Name.xlsx',
                         encoding='gbk')
    fund_val = fund.ix[:, person_name]
    fund_val = fund_val.dropna()
    fund_list = list(fund_val.values)

    # 基金持仓证券
    ##################################################################################

    fund_asset = MfcData().get_fund_security(before_trade_data)
    fund_asset = fund_asset[[
        '持仓日期', '序号', '基金名称', '证券代码', '证券名称', '证券类别', '市值', '市值比净值(%)', '持仓',
        '净买量', '净买金额', '费用合计', '当日涨跌幅(%)', '持仓多空标志', '估值价格', '最新价'
    ]]

    for i_fund in range(len(fund_list)):

        fund_name = fund_list[i_fund]
        fund_asset_fund = fund_asset[fund_asset['基金名称'] == fund_name]
        out_sub_path = os.path.join(out_path, person_name, today,
                                    "holding_data")
        if not os.path.exists(out_sub_path):
            os.mkdir(out_sub_path)
        out_file = os.path.join(out_sub_path, fund_name + '持仓.xlsx')
        fund_asset_fund.to_excel(out_file, index=None)

    # 基金资产
    ##################################################################################
    fund_asset = MfcData().get_fund_asset(before_trade_data)
    fund_asset = fund_asset[[
        '序号', '统计日期', '基金编号', '基金名称', '股票资产', '净值', '基金份额', '单位净值',
        '单位净值涨跌幅(%)', '累计单位净值', '昨日单位净值', '当日股票收益率(%)', '当日股票净买入金额',
        '股票资产/净值(%)', '当前现金余额', '累计应收金额', '累计应付金额', '期货保证金账户余额', '期货保证金',
        '可用期货保证金', '保证金'
    ]]

    fund_asset_fund = fund_asset[fund_asset['基金名称'].map(
        lambda x: x in fund_list)]
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")
    if not os.path.exists(out_sub_path):
        os.mkdir(out_sub_path)
    out_file = os.path.join(out_sub_path, '基金资产.xlsx')
    fund_asset_fund.to_excel(out_file, index=None)

    # 股票库
    ##################################################################################
    pool_path = Parameter().get_load_out_file("Mfc_Data")
    pool_list = [
        "公司超五库.xls", "公司股票库.xls", "公司关联库.xls", "公司禁止库.xls", "公司限制库.xls",
        "专户禁止库.xls", "量化11号禁止库.xls", "人寿固收限制库.xls", "人寿固收禁止库(委托人发送).xls",
        "量化限制库.xls"
    ]

    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")

    for i_file in range(len(pool_list)):

        file = pool_list[i_file]
        src_file = os.path.join(pool_path, 'raw_file', today, file)
        out_file = os.path.join(out_sub_path, file)
        try:
            shutil.copyfile(src_file, out_file)
        except:
            pd.DataFrame([]).to_excel(out_file)

    # 股票库 英文
    ##################################################################################
    pool_path = Parameter().get_load_out_file("Mfc_Data")
    pool_list = {
        "公司禁止库.xls": "Company Forbidden Pool.csv",
        "公司关联库.xls": "Company Related Pool.csv",
        "公司限制库.xls": "Company Limited Pool.csv"
    }
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")

    for scr_file, out_file in pool_list.items():

        src_file = os.path.join(pool_path, 'raw_file', before_trade_data,
                                scr_file)
        out_file = os.path.join(out_sub_path, out_file)
        data = pd.read_excel(src_file, index_col=[0])
        data.index = data['证券代码'].map(stock_code_add_postfix)
        data.index = data.index.map(lambda x: x[0:6] + '-CN')
        data['Status'] = 1.0
        data.to_csv(out_file, header=None, columns=['Status'])

    # Recent IPO Stock.csv
    ##################################################################################
    ipo_date_pd = Stock().get_ipo_date()
    beg_date = (datetime.strptime(today, '%Y%m%d') -
                timedelta(days=365)).strftime("%Y%m%d")
    ipo_date_pd = ipo_date_pd[ipo_date_pd['IPO_DATE'] > beg_date]
    ipo_date_pd.loc[:, 'IPO_DATE'] = 1.0
    ipo_date_pd.index = ipo_date_pd.index.map(lambda x: x[0:6] + '-CN')

    filename = 'Recent IPO Stock.csv'
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")
    print('loading ', filename, ' ......')
    ipo_date_pd.to_csv(os.path.join(out_sub_path, filename),
                       header=None,
                       columns=['IPO_DATE'])

    # Suspended List.csv
    ##################################################################################

    status_data = Stock().get_trade_status_date(today)
    ipo_date_pd = Stock().get_ipo_date()
    data = pd.concat([status_data, ipo_date_pd], axis=1)
    data = data.dropna()
    data = data[data['DELIST_DATE'] >= today]
    data['Trade_Status'] = 1.0
    data.index = data.index.map(lambda x: x[0:6] + '-CN')

    filename = 'Suspended List.csv'
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")
    print('loading ', filename, ' ......')
    data.to_csv(os.path.join(out_sub_path, filename),
                header=None,
                columns=['Trade_Status'])

    # CSI500 Benchmark.csv 5.5 现金
    ##################################################################################
    data = Index().get_weight("000905.SH", before_trade_data)
    data.index = data.index.map(lambda x: x[0:6] + '-CN')
    data['WEIGHT'] *= 94.5
    result = pd.DataFrame([5.5], index=["CSH_CNY"], columns=['WEIGHT'])
    result = pd.concat([result, data], axis=0)

    filename = 'CSI500 Benchmark.csv'
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")
    print('loading ', filename, ' ......')
    result.to_csv(os.path.join(out_sub_path, filename),
                  header=None,
                  columns=['WEIGHT'])

    # 指数权重 Axioma
    ##################################################################################
    index_code_list = ["000300.SH", "000905.SH", "000016.SH", "881001.WI"]
    out_sub_path = os.path.join(out_path, person_name, today, "index_weight")
    if not os.path.exists(out_sub_path):
        os.makedirs(out_sub_path)

    for index_code in index_code_list:
        data = Index().get_weight(index_code, before_trade_data)
        out_file = os.path.join(out_sub_path, index_code + '.csv')
        data.index = data.index.map(lambda x: x[0:6] + '-CN')
        data.to_csv(out_file, header=None)

    # 英文持仓情况
    ##################################################################################

    en_holding_dict = {"建行中国人寿中证500管理计划": "China Life Insurance Portfolio.csv"}
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")

    fund_sec = MfcData().get_fund_security(before_trade_data)

    for name, out_file in en_holding_dict.items():

        fund_sec_one = fund_sec[fund_sec['基金名称'] == name]
        fund_sec_one = fund_sec_one[fund_sec_one['证券类别'] == '股票']
        fund_sec_one = fund_sec_one[['证券代码', '持仓']]
        fund_sec_one.index = fund_sec_one['证券代码'].map(stock_code_add_postfix)
        fund_sec_one.index = fund_sec_one.index.map(lambda x: x[0:6] + '-CN')
        out_file = os.path.join(out_sub_path, out_file)
        fund_sec_one.to_csv(out_file, header=None, columns=['持仓'])
示例#6
0
def holding_data_yangchao(today, project_path, out_path):

    # 输入参数
    ##################################################################################
    person_name = 'yangchao'
    before_trade_data = Date().get_trade_date_offset(today, -1)
    today = Date().change_to_str(today)

    # 基金列表
    ##################################################################################
    fund = pd.read_excel(project_path + 'Manage_Fund_Name.xlsx',
                         encoding='gbk')
    fund_val = fund.ix[:, person_name]
    fund_val = fund_val.dropna()
    fund_list = list(fund_val.values)

    # 基金持仓证券
    ##################################################################################

    fund_asset = MfcData().get_group_security(before_trade_data)
    fund_asset = fund_asset[[
        '日期', '组合名称', '基金名称', '证券代码', '证券名称', '持仓', '市值比净值(%)', '盈亏率(%)',
        '证券类别', '当日买金额', '当日卖金额', '资产单元名称', '持仓多空标志'
    ]]

    for i_fund in range(len(fund_list)):

        fund_name = fund_list[i_fund]
        fund_asset_fund = fund_asset[fund_asset['基金名称'] == fund_name]
        out_sub_path = os.path.join(out_path, person_name, today,
                                    "holding_data")
        if not os.path.exists(out_sub_path):
            os.mkdir(out_sub_path)
        out_file = os.path.join(out_sub_path, fund_name + '.csv')
        fund_asset_fund.to_csv(out_file, index=None)

    # 绝对收益组合资产
    ##################################################################################
    group_name = 'yangchao_group'
    fund_val = fund.ix[:, group_name]
    fund_val = fund_val.dropna()
    fund_list = list(fund_val.values)

    fund_asset = MfcData().get_group_security(before_trade_data)
    fund_asset = fund_asset[[
        '日期', '组合名称', '基金名称', '证券代码', '证券名称', '持仓', '市值比净值(%)', '盈亏率(%)',
        '证券类别', '当日买金额', '当日卖金额', '资产单元名称', '持仓多空标志'
    ]]

    for i_fund in range(len(fund_list)):

        fund_name = fund_list[i_fund]
        one_fund = fund_asset[fund_asset['组合名称'] == fund_name]
        out_sub_path = os.path.join(out_path, person_name, today,
                                    "holding_data")
        if not os.path.exists(out_sub_path):
            os.mkdir(out_sub_path)
        if fund_name == '绝对收益期货组合':
            fund_name = "绝对收益股指期货组合"
        out_file = os.path.join(out_sub_path, fund_name + '.csv')
        one_fund.to_csv(out_file)

    # 股票库
    ##################################################################################
    pool_path = Parameter().get_load_out_file("Mfc_Data")
    pool_list = [
        "公司超五库.xls", "公司股票库.xls", "公司关联库.xls", "公司禁止库.xls", "公司限制库.xls",
        "绝对收益禁止库.xls", "绝对收益投资库.xls", "量化限制库.xls"
    ]

    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")

    for i_file in range(len(pool_list)):

        file = pool_list[i_file]
        src_file = os.path.join(pool_path, 'raw_file', today, file)
        out_file = os.path.join(out_sub_path, file)
        try:
            shutil.copyfile(src_file, out_file)
        except:
            pd.DataFrame().to_excel(out_file)

    # 股票库 英文
    ##################################################################################
    pool_path = Parameter().get_load_out_file("Mfc_Data")
    pool_list = {
        "公司禁止库.xls": "Company Forbidden Pool.csv",
        "公司关联库.xls": "Company Related Pool.csv",
        "公司限制库.xls": "Company Limited Pool.csv",
        "公司股票库.xls": "Company Investment Pool.csv",
        "绝对收益禁止库.xls": "ABS Fund Forbidden Pool.csv",
        "绝对收益投资库.xls": "ABS Fund Investment Pool.csv",
        "量化限制库.xls": "Quantitative Limited Pool.csv"
    }
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")

    for scr_file, out_file in pool_list.items():

        src_file = os.path.join(pool_path, 'raw_file', before_trade_data,
                                scr_file)
        out_file = os.path.join(out_sub_path, out_file)
        data = pd.read_excel(src_file, index_col=[0])
        data.index = data['证券代码'].map(stock_code_add_postfix)
        data.index = data.index.map(lambda x: x[0:6] + '-CN')
        data['Status'] = 1.0
        data.to_csv(out_file, header=None, columns=['Status'])

    # 股票库 Company Investment Pool.csv 包括公司股票库和公司超5库
    ##################################################################################
    stock_pool_file = os.path.join(pool_path, 'raw_file', before_trade_data,
                                   "公司股票库.xls")
    stock_pool = pd.read_excel(stock_pool_file, index_col=[0])
    stock_pool.index = stock_pool['证券代码'].map(stock_code_add_postfix)
    stock_pool.index = stock_pool.index.map(lambda x: x[0:6] + '-CN')
    stock_pool['Status'] = 1.0

    stock_5_pool_file = os.path.join(pool_path, 'raw_file', before_trade_data,
                                     "公司超五库.xls")
    stock_5_pool = pd.read_excel(stock_5_pool_file, index_col=[0])
    stock_5_pool.index = stock_5_pool['证券代码'].map(stock_code_add_postfix)
    stock_5_pool.index = stock_5_pool.index.map(lambda x: x[0:6] + '-CN')
    stock_5_pool['Status'] = 1.0

    out_file = os.path.join(out_sub_path, "Company Investment Pool.csv")
    res = pd.concat([stock_5_pool['Status'], stock_pool['Status']], axis=0)
    res.to_csv(out_file, header=None)

    # Recent IPO Stock.csv
    ##################################################################################
    ipo_date_pd = Stock().get_ipo_date()
    beg_date = (datetime.strptime(today, '%Y%m%d') -
                timedelta(days=365)).strftime("%Y%m%d")
    ipo_date_pd = ipo_date_pd[ipo_date_pd['IPO_DATE'] > beg_date]
    ipo_date_pd.loc[:, 'IPO_DATE'] = 1.0
    ipo_date_pd.index = ipo_date_pd.index.map(lambda x: x[0:6] + '-CN')

    filename = 'Recent IPO Stock.csv'
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")
    print('loading ', filename, ' ......')
    ipo_date_pd.to_csv(os.path.join(out_sub_path, filename),
                       header=None,
                       columns=['IPO_DATE'])

    # Suspended List.csv
    ##################################################################################

    status_data = Stock().get_trade_status_date(today)
    ipo_date_pd = Stock().get_ipo_date()
    data = pd.concat([status_data, ipo_date_pd], axis=1)
    data = data.dropna()
    data = data[data['DELIST_DATE'] >= today]
    data['Trade_Status'] = 1.0
    data.index = data.index.map(lambda x: x[0:6] + '-CN')

    filename = 'Suspended List.csv'
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")
    print('loading ', filename, ' ......')
    data.to_csv(os.path.join(out_sub_path, filename),
                header=None,
                columns=['Trade_Status'])

    # Benchmark.csv 5.5 现金
    ##################################################################################
    benchmark_dict = {
        "000905.SH": "CSI500 Benchmark.csv",
        "000300.SH": "CSI300 Benchmark.csv",
        "000016.SH": "CSI50 Benchmark.csv"
    }

    for index_code, out_file in benchmark_dict.items():

        data = Index().get_weight(index_code, before_trade_data)
        data.index = data.index.map(lambda x: x[0:6] + '-CN')
        data['WEIGHT'] *= 94.5
        result = pd.DataFrame([5.5], index=["CSH_CNY"], columns=['WEIGHT'])
        result = pd.concat([result, data], axis=0)

        out_sub_path = os.path.join(out_path, person_name, today,
                                    "holding_data")
        result.to_csv(os.path.join(out_sub_path, out_file),
                      header=None,
                      columns=['WEIGHT'])

    # 英文持仓情况
    ##################################################################################

    en_holding_dict = {
        "泰达宏利量化增强": "Quantitative Enhencement portfolio.csv",
        "泰达宏利业绩驱动量化": "Quantitative Earning Drive.csv",
        "泰达新思路": "New Thinking Portfolio.csv",
        "泰达宏利集利债券": "High Dividend Bond Equity.csv",
        "泰达宏利沪深300": "CSI300 Portfolio.csv",
        "泰达中证500指数分级": "CSI500 Portfolio.csv"
    }
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")

    fund_sec = MfcData().get_fund_security(before_trade_data)

    for name, out_file in en_holding_dict.items():

        fund_sec_one = fund_sec[fund_sec['基金名称'] == name]
        fund_sec_one = fund_sec_one[fund_sec_one['证券类别'] == '股票']
        fund_sec_one = fund_sec_one[['证券代码', '持仓']]
        fund_sec_one.index = fund_sec_one['证券代码'].map(stock_code_add_postfix)
        fund_sec_one.index = fund_sec_one.index.map(lambda x: x[0:6] + '-CN')
        print(fund_sec_one)
        if out_file != "High Dividend Bond Equity.csv":
            asset = MfcData().get_fund_asset(before_trade_data)
            asset.index = asset['基金名称']
            asset = asset[~asset.index.duplicated()]
            fund_sec_one = fund_sec_one[~fund_sec_one.index.duplicated()]
            fund_sec_one.ix['CSH_CNY', "持仓"] = asset.ix[name, "当前现金余额"]
        out_file = os.path.join(out_sub_path, out_file)
        fund_sec_one['持仓'] = fund_sec_one['持仓'].round(0)
        fund_sec_one.to_csv(out_file, header=None, columns=['持仓'])

    # 英文绝对收益持仓情况
    ##################################################################################

    en_holding_dict = {
        "绝对收益50对冲股票组合": "Absolute Return Strategy CSI50 Portfolio.csv",
        "绝对收益300对冲股票组合": "Absolute Return Strategy CSI300 Portfolio.csv",
        "绝对收益500对冲股票组合": "Absolute Return Strategy CSI500 Portfolio.csv",
    }
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")

    fund_sec = MfcData().get_group_security(before_trade_data)

    for name, out_file in en_holding_dict.items():

        fund_sec_one = fund_sec[fund_sec['组合名称'] == name]
        fund_sec_one = fund_sec_one[fund_sec_one['证券类别'] == '股票']
        fund_sec_one = fund_sec_one[['证券代码', '持仓']]
        fund_sec_one.index = fund_sec_one['证券代码'].map(stock_code_add_postfix)
        fund_sec_one.index = fund_sec_one.index.map(lambda x: x[0:6] + '-CN')
        out_file = os.path.join(out_sub_path, out_file)
        fund_sec_one.to_csv(out_file, header=None, columns=['持仓'])

    # China Market Index.csv
    ##################################################################################
    data = Index().get_weight("China_Index_Benchmark", before_trade_data)
    out_file = "China Market Index.csv"
    data.index = data.index.map(lambda x: x[0:6] + '-CN')
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")
    data.to_csv(os.path.join(out_sub_path, out_file),
                header=None,
                columns=['WEIGHT'])

    # Monitor 基金证券
    ##################################################################################
    en_holding_dict = {"泰达中证500指数分级": "CSI500 Monitor.csv"}
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")

    fund_sec = MfcData().get_fund_security(before_trade_data)

    for name, out_file in en_holding_dict.items():

        fund_sec_one = fund_sec[fund_sec['基金名称'] == name]
        fund_sec_one = fund_sec_one[fund_sec_one['证券类别'] == '股票']
        fund_sec_one = fund_sec_one[['证券代码', '持仓']]
        fund_sec_one.columns = ['STOCK_CODE', 'HOLDING']
        fund_sec_one.index = fund_sec_one['STOCK_CODE'].map(
            stock_code_add_postfix)
        out_file = os.path.join(out_sub_path, out_file)
        fund_sec_one.to_csv(out_file, columns=['HOLDING'])

    # Monitor 组合证券 绝对收益
    ##################################################################################
    out_sub_path = os.path.join(out_path, person_name, today, "holding_data")
    en_holding_dict = {
        "绝对收益50对冲股票组合": "Absolute Trading Monitor CSI50.csv",
        "绝对收益300对冲股票组合": "Absolute Trading Monitor CSI300.csv",
        "绝对收益500对冲股票组合": "Absolute Trading Monitor CSI500.csv",
        "绝对收益期货组合": "Absolute Monitor Option.csv",
    }
    fund_sec = MfcData().get_group_security(before_trade_data)

    for name, out_file in en_holding_dict.items():

        fund_sec_one = fund_sec[fund_sec['组合名称'] == name]
        # fund_sec_one = fund_sec_one[fund_sec_one['资产类别'] == '股票资产']
        fund_sec_one = fund_sec_one[['证券代码', '持仓']]
        fund_sec_one.columns = ['STOCK_CODE', 'HOLDING']
        if name != "绝对收益期货组合":
            fund_sec_one.index = fund_sec_one['STOCK_CODE'].map(
                stock_code_add_postfix)
        else:
            fund_sec_one.index = fund_sec_one['STOCK_CODE']
        out_file = os.path.join(out_sub_path, out_file)
        fund_sec_one.to_csv(out_file, columns=['HOLDING'])
示例#7
0
def Index_Group_Statistics(out_path, index_code, value_factor, group_number):

    # 0、输入参数
    ##############################################################################
    # out_path = 'C:\\Users\\doufucheng\\OneDrive\\Desktop\\data\\'
    # index_code = "000300.SH"
    # value_factor = 'PE_TTM'
    # group_number = 8

    # 1、原始数据整理
    ##############################################################################

    # 1、1: 读入指数收益率数据和pe
    ###################################
    data = Index().get_index_factor(index_code, None, None,
                                    ['PCT', value_factor])
    data = data.dropna(subset=[value_factor])
    data.columns = ['pct', 'pe']
    data['pe'] = data['pe'].round(2)
    year_number = 242

    # 1、2: 指数 日收益 累计收益
    ###################################
    data['ln_pct'] = np.log(data['pct'] + 1)
    data['cum_sum_pct'] = data['ln_pct'].cumsum().map(lambda x: np.exp(x) - 1)

    # 1、3: 之后1、3、5年的收益
    ###################################
    data['return_1y'] = data['ln_pct'].rolling(
        window=year_number).sum().shift(-year_number)
    data['return_3y'] = data['ln_pct'].rolling(window=year_number *
                                               3).sum().shift(-year_number * 3)
    data['return_5y'] = data['ln_pct'].rolling(window=year_number *
                                               5).sum().shift(-year_number * 5)

    # 1、4: 之后1、3、5年的收益是否大于0
    ###################################
    data['if_zero_1y'] = data['return_1y'] > 0.0
    data['if_zero_3y'] = data['return_3y'] > 0.0
    data['if_zero_5y'] = data['return_5y'] > 0.0

    # 1、5: 在全局的pe百分比
    ###################################
    data['rank'] = data['pe'].rank() / len(data)
    data['rank'] *= 100
    data['rank'] = data['rank'].round(0)

    # 1、7: 之后1年超过初始PE的时间
    ###################################
    for i in range(0, len(data) - year_number):
        init_pe = data.ix[i, "pe"]
        data_bigger = data.ix[i:i + year_number, 'pe'] > init_pe
        data_bigger = data_bigger[data_bigger]
        ratio = len(data_bigger) / year_number
        data.ix[i, 'if_1y_ratio'] = ratio

    # 1、8: 之后3年超过初始PE的时间
    ###################################
    for i in range(0, len(data) - year_number * 3):
        init_pe = data.ix[i, "pe"]
        data_bigger = data.ix[i:i + year_number * 3, 'pe'] > init_pe
        data_bigger = data_bigger[data_bigger]
        ratio = len(data_bigger) / (year_number * 3)
        data.ix[i, 'if_3y_ratio'] = ratio

    # 1、9: 之后5年超过初始PE的时间
    ###################################
    for i in range(0, len(data) - year_number * 5):
        init_pe = data.ix[i, "pe"]
        data_bigger = data.ix[i:i + year_number * 5, 'pe'] > init_pe
        data_bigger = data_bigger[data_bigger]
        ratio = len(data_bigger) / (year_number * 5)
        data.ix[i, 'if_5y_ratio'] = ratio

    data['pe_cut'] = pd.qcut(data['pe'], group_number)
    data.to_csv(out_path + index_code + '_原始数据.csv')

    # 2、分组统计
    ##############################################################################

    # 2、1: 1年后 收益中位数、pe超过初始PE的百分比、有效数字的个数
    ########################################################
    my_data = data.dropna(subset=['return_1y'])
    my_data['pe_cut'] = pd.qcut(data['pe'], group_number)
    if_pe_1y_ratio = my_data.groupby(by=['pe_cut'])['if_1y_ratio'].mean()
    return_1y_median = my_data.groupby(by=['pe_cut'])['return_1y'].median()
    return_1y_count = my_data.groupby(by=['pe_cut'])['return_1y'].count()
    my_data['pe_rank_cut'] = pd.qcut(data['rank'], group_number)
    return_pe_rank = my_data.groupby(by=['pe_rank_cut'])['return_1y'].median()
    return_pe_rank = pd.DataFrame(
        return_pe_rank.index.values.to_dense(),
        index=return_1y_median.index.values.to_dense(),
        columns=['历史百分位数'])
    return_pe_rank['开始时间'] = data.index[0]
    return_pe_rank['结束时间'] = data.index[-1]
    return_pe_rank['当前PE'] = data.ix[-1, 'pe']

    # 1年后 收益大于0的百分比
    if_zero_number = my_data.groupby(by=['pe_cut'])['if_zero_1y'].sum()
    sum_number = my_data.groupby(by=['pe_cut'])['if_zero_1y'].count()
    zero_ratio_1y = pd.DataFrame(if_zero_number / sum_number)

    # 2、1: 3年后 收益中位数、pe超过初始PE的百分比、有效数字的个数
    #######################################################

    my_data = data.dropna(subset=['return_3y'])
    my_data['pe_cut'] = pd.qcut(data['pe'], group_number)
    if_pe_3y_ratio = my_data.groupby(by=['pe_cut'])['if_3y_ratio'].median()
    return_3y_median = my_data.groupby(by=['pe_cut'])['return_3y'].median()
    return_3y_count = my_data.groupby(by=['pe_cut'])['return_3y'].count()

    if_zero_number = my_data.groupby(by=['pe_cut'])['if_zero_3y'].sum()
    sum_number = my_data.groupby(by=['pe_cut'])['if_zero_3y'].count()
    zero_ratio_3y = pd.DataFrame(if_zero_number / sum_number)

    # 2、3: 5年后 收益中位数、pe超过初始PE的百分比、有效数字的个数
    #######################################################
    my_data = data.dropna(subset=['return_5y'])
    my_data['pe_cut'] = pd.qcut(data['pe'], group_number)
    if_pe_5y_ratio = my_data.groupby(by=['pe_cut'])['if_5y_ratio'].median()
    return_5y_median = my_data.groupby(by=['pe_cut'])['return_5y'].median()
    return_5y_count = my_data.groupby(by=['pe_cut'])['return_5y'].count()

    if_zero_number = my_data.groupby(by=['pe_cut'])['if_zero_5y'].sum()
    sum_number = my_data.groupby(by=['pe_cut'])['if_zero_5y'].count()
    zero_ratio_5y = pd.DataFrame(if_zero_number / sum_number)

    # 数据输出
    ##############################################################################

    res = pd.concat([
        return_pe_rank, return_1y_count, return_3y_count, return_5y_count,
        return_1y_median, return_3y_median, return_5y_median, zero_ratio_1y,
        zero_ratio_3y, zero_ratio_5y, if_pe_1y_ratio, if_pe_3y_ratio,
        if_pe_5y_ratio
    ],
                    axis=1)
    res.index.name = "PE绝对值范围"
    res.columns = [
        "PE百分位范围", '开始时间', '结束时间', '当前PE', '有效数据个数_1y', '有效数据个数_3y',
        '有效数据个数_5y', '收益中位数_1y', '收益中位数_3y', '收益中位数_5y', '收益大于0的比例_1y',
        '收益大于0的比例_3y', '收益大于0的比例_5y', '超过初始PE天数的比例的中位数_1y',
        '超过初始PE天数的比例的中位数_3y', '超过初始PE天数的比例的中位数_5y'
    ]

    res.index = res.index.values.to_dense()
    res.index.name = "PE绝对值范围"

    num_format_pd = pd.DataFrame([], columns=res.columns, index=['format'])
    num_format_pd.ix['format', :] = '0.00%'
    num_format_pd.ix[
        'format',
        ['开始时间', '结束时间', '当前PE', '有效数据个数_1y', '有效数据个数_3y', '有效数据个数_5y'
         ]] = '0.0'

    begin_row_number = 0
    begin_col_number = 1
    color = "red"
    file_name = out_path + index_code + '_收益中位数.xlsx'
    sheet_name = "收益中位数"

    write_pandas(file_name, sheet_name, begin_row_number, begin_col_number,
                 res, num_format_pd, color)