Beispiel #1
0
    def __init__(self, code, namecode, name, chrome_driver):
        self.quarter_index = get_last_quarter_str()
        self.update_date = None  # 数据更新时间,默认取资产配置更新时间
        self.fund_code = code  # 基金代码,需要初始化赋值
        self.fund_name = name  # 基金名称,需要初始化赋值
        self.morning_star_code = namecode  # 基金编码,晨星网特有,需要建立索引表

        self._morning_cookies = chrome_driver.get_cookies() or None
        self._chrome_driver = chrome_driver or None
        self._is_trigger_catch = False
        self._catch_detail = None

        # 基本信息
        self.fund_cat = None  # 基金分类
        self.found_date = None  # 成立时间
        self.company = None  # 基金公司
        # 季度变动信息
        self.total_asset = None  # 总资产
        self.investname_style = None  # 投资风格
        self.manager = dict()  # 基金经理,name,id,管理时间
        self.three_month_retracement = 0.0  # 最差六个月回报
        self.june_month_retracement = 0.0  # 最差六个月回报
        self.bond_position = dict({'total': '0.00'})  # 债券总仓位、前五大持仓
        self.stock_position = dict({'total': '0.00'})  # 股票总仓位、前十大持仓
        self.risk_assessment = dict()  # 三年风险评估 -- 标准差 风险系数 夏普比
        self.risk_statistics = dict()  # 阿尔法 贝塔 R平方值
        self.risk_rating = dict()  # 风险评价 -- 二年、三年、五年、十年
        self.morning_star_rating = dict()  # 晨星评级--三年,五年,十年
        # 十大持仓信息
        self.ten_top_stock_list = []  # 股票十大持仓股信息
def select_condition_stocks_rank(each_statistic=None, *, quarter_index=None):
    if each_statistic == None:
        each_statistic = FundStatistic()
    if quarter_index == None:
        quarter_index = get_last_quarter_str(1)
    columns = ['代码', '名称', '持有数量(只)', '持有市值(亿元)']
    company = '广发基金管理有限公司'
    company_condition = {'value': company, 'operator': '='}
    output_file = './outcome/数据整理/stocks/condition/' + company + '.xlsx'
    condition_dict = {
        # 'morning_star_rating_5': morning_star_rating_5_condition,
        # 'morning_star_rating_3': morning_star_rating_3_condition,
        'company': company_condition
    }
    fund_pool = get_fund_code_pool(condition_dict)
    stock_top_list = each_statistic.all_stock_fund_count(
        quarter_index=quarter_index, fund_code_pool=fund_pool, filter_count=0)
    stock_rank_list = []
    for stock_name_code in stock_top_list:
        stock_code = stock_name_code[0].split('-', 1)[0]
        stock_name = stock_name_code[0].split('-', 1)[1]
        stock_count = stock_name_code[1]['count']
        stock_holder_asset = stock_name_code[1]['holder_asset']
        stock_rank_item = [
            stock_code, stock_name, stock_count, stock_holder_asset
        ]
        stock_rank_list.append(stock_rank_item)
    df_stock_top_list = pd.DataFrame(stock_rank_list, columns=columns)
    print(df_stock_top_list)

    update_xlsx_file(output_file, df_stock_top_list, quarter_index)
Beispiel #3
0
def output_high_score_funds(each_query=None, quarter_index=None):
    """
    输出高分基金
    """
    if each_query == None:
        each_query = FundQuery()
    if quarter_index == None:
        quarter_index = get_last_quarter_str()
    print("quarter_index", quarter_index)
    high_score_funds = each_query.select_high_score_funds(
        quarter_index=quarter_index)
    columns_bk = [
        '代码', '名称', '季度', '总资产', '现任基金经理管理起始时间', '投资风格', '三月最大回撤', '六月最大回撤',
        '夏普比率', '阿尔法系数', '贝塔系数', 'R平方', '标准差', '风险系数', '两年风险评级', '三年风险评级',
        '五年风险评级', '五年晨星评级', '三年晨星评级', '股票仓位', '十大持股仓位'
    ]
    columns = [
        '代码', '名称', '投资风格', '基金经理', '现任经理管理起始时间', '成立时间', '三年晨星评级', '五年晨星评级',
        '夏普比率', '股票仓位', '十大持股仓位', '两年风险评级', '三年风险评级', '五年风险评级', '阿尔法系数',
        '贝塔系数', '标准差', '总资产', '数据更新时间'
    ]
    df_high_score_funds = pd.DataFrame(high_score_funds, columns=columns)

    # pprint(df_high_score_funds)

    path = './outcome/数据整理/funds/high-score-funds.xlsx'
    update_xlsx_file(path, df_high_score_funds, quarter_index)
def t100_stocks_rank(each_statistic=None, *, quarter_index=None):
    # T100权重股排名
    if each_statistic == None:
        each_statistic = FundStatistic()
    if quarter_index == None:
        quarter_index = get_last_quarter_str(1)
    last_quarter_index = get_last_quarter_str(2)
    output_file = './outcome/数据整理/strategy/top100_rank.xlsx'
    sheet_name = quarter_index + '基金重仓股T100'
    columns = [
        '代码', '名称', quarter_index + '持有数量(只)', last_quarter_index + '持有数量(只)',
        '持有数量环比', '持有数量环比百分比', '持有数量升或降', quarter_index + '持有市值(亿元)',
        last_quarter_index + '持有市值(亿元)', '持有市值环比', '持有市值环比百分比', '持有市值升或降'
    ]

    stock_top_list = each_statistic.all_stock_fund_count(
        quarter_index=quarter_index, filter_count=80)
    stock_top_list = stock_top_list[:100]  # 获取top100权重股
    filter_list = stocks_compare(stock_top_list)
    df_filter_list = pd.DataFrame(filter_list, columns=columns)
    update_xlsx_file(output_file, df_filter_list, sheet_name)
def all_stock_holder_detail(each_statistic=None,
                            *,
                            quarter_index=None,
                            threshold=0):
    """ 所有股票的基金持仓细节
    Args:
        each_statistic (class): 统计类
        quarter_index (str, optional): 季度字符串. Defaults to None.
        threshold (int, optional): 输出门槛. Defaults to 0.
    """
    if each_statistic == None:
        each_statistic = FundStatistic()
    if quarter_index == None:
        quarter_index = get_last_quarter_str()
    stock_list = each_statistic.all_stock_fund_count_and_details(
        quarter_index=quarter_index, filter_count=threshold)
    for i in range(0, len(stock_list)):
        stock = stock_list[i]
        stock_name_code = stock[0]
        stock_code = stock_name_code.split('-', 1)[0]
        path = '其他'
        if bool(re.search("^\d{5}$", stock_code)):
            path = '港股'
        elif bool(re.search("^\d{6}$", stock_code)):
            if bool(re.search("^00(0|1|2|3)\d{3}$", stock_code)):
                path = 'A股/深证主板'
            elif bool(re.search("^300\d{3}$", stock_code)):
                path = 'A股/创业板'
            elif bool(re.search("^60(0|1|2|3|5)\d{3}$", stock_code)):
                path = 'A股/上证主板'
            elif bool(re.search("^68(8|9)\d{3}$", stock_code)):
                path = 'A股/科创板'
            else:
                print('stock_name_code', stock_name_code)
        hold_fund_list = sorted(stock[1]['fund_list'],
                                key=lambda x: x['持有市值(亿元)'],
                                reverse=True)
        df_list = pd.DataFrame(hold_fund_list)
        stock_name_code = stock_name_code.replace('-*', '-').replace('/', '-')
        path = './outcome/数据整理/stocks/' + path + '/' + stock_name_code + '.xlsx'
        path = path.replace('\/', '-')
        update_xlsx_file(path, df_list, quarter_index)
 def __init__(self):
     self.quarter_index = get_last_quarter_str()
     self.quarter_date = get_quarter_date(self.quarter_index)
     connect_instance = connect()
     self.connect_instance = connect_instance
     self.cursor = connect_instance.cursor()
 def __init__(self, code=None):
   self.fund_code = code
   # 动态计算季度信息
   self.quarter_index = get_last_quarter_str()
def stocks_compare(stock_list,
                   *,
                   market=None,
                   quarter_index=None,
                   is_A_stock=None):
    """与某个季度数据进行比较
    """
    if quarter_index == None:
        quarter_index = get_last_quarter_str(2)
    print("比较-->quarter_index", quarter_index)

    last_quarter_input_file = './outcome/数据整理/strategy/all_stock_rank/' + \
        quarter_index + '.xlsx'
    data_last_quarter = pd.read_excel(io=last_quarter_input_file,
                                      engine="openpyxl",
                                      dtype={"代码": np.str},
                                      sheet_name=None)

    if market:
        df_data_target_market = data_last_quarter.get(market)
        df_data_target_market[quarter_index +
                              '持有数量(只)'] = df_data_target_market[
                                  quarter_index + '持有数量(只)'].astype(int)

    filter_list = []
    for stock in stock_list:
        stock_code = stock[0].split('-', 1)[0]
        if not stock_code:
            continue
        stock_name = stock[0].split('-', 1)[1]
        stock_holder_detail = stock[1]
        holder_count = stock_holder_detail.get('count')
        holder_asset = stock_holder_detail.get('holder_asset')
        if not market:
            target_market = get_stock_market(stock_code)
            df_data_target_market = data_last_quarter.get(target_market)
        target_loc = df_data_target_market[df_data_target_market['代码'] ==
                                           stock_code]
        last_holder_count = 0
        last_holder_asset = 0
        if len(target_loc) == 1:
            col_target = quarter_index + '持有数量(只)'
            last_holder_count = target_loc[col_target].iloc[0]
            col_target = quarter_index + '持有市值(亿元)'
            last_holder_asset = round(
                decimal.Decimal(target_loc[col_target].iloc[0]), 4)
        diff_holder_count = holder_count - last_holder_count
        diff_holder_asset = holder_asset - last_holder_asset
        diff_holder_count_percent = '{:.2%}'.format(
            diff_holder_count /
            last_holder_count) if last_holder_count != 0 else "+∞"
        diff_holder_asset_percent = '{:.2%}'.format(
            diff_holder_asset /
            last_holder_asset) if last_holder_asset != 0 else "+∞"
        # flag = '📈' if diff_holder_count > 0 else '📉'
        # if diff_holder_count == 0:
        #     flag = '⏸'
        flag_count = 'up' if diff_holder_count > 0 else 'down'
        flag_asset = 'up' if diff_holder_asset > 0 else 'down'

        item_tuple = [
            stock_code, stock_name, holder_count, last_holder_count,
            diff_holder_count, diff_holder_count_percent, flag_count,
            holder_asset, last_holder_asset, diff_holder_asset,
            diff_holder_asset_percent, flag_asset
        ]
        if is_A_stock:
            industry_name_third = stock_holder_detail.get(
                'industry_name_third')
            industry_name_second = stock_holder_detail.get(
                'industry_name_second')
            industry_name_first = stock_holder_detail.get(
                'industry_name_first')
            item_tuple = [
                *item_tuple, industry_name_third, industry_name_second,
                industry_name_first
            ]

        # if diff_percent == "+∞" or not float(diff_percent.rstrip('%')) < -20:
        filter_list.append(item_tuple)
        # print(item_tuple)
    return filter_list
def get_special_fund_code_holder_stock_detail(each_statistic=None,
                                              quarter_index=None):
    """获取某些基金的十大持仓股票信息
    """
    if each_statistic == None:
        each_statistic = FundStatistic()
    if quarter_index == None:
        quarter_index = get_last_quarter_str(2)
        print("quarter_index", quarter_index)
    holder_history_list = [
        {
            '001811': {
                'name': '中欧明睿新常态混合A',
                'radio': 0.2
            },
            '001705': {
                'name': '泓德战略转型股票',
                'radio': 0.2
            },
            '163415': {
                'name': '兴全商业模式优选混合',
                'radio': 0.2
            },
            '001043': {
                'name': '工银美丽城镇主题股票A',
                'radio': 0.1
            },
            '000547': {
                'name': '建信健康民生混合',
                'radio': 0.1
            },
            '450001': {
                'name': '国富中国收益混合',
                'radio': 0.2
            },
        },
        # """
        # 根据二季度高分基金池数据,以及近期组合表现,剔除一些不在高性价比基金池中基金,以及结合近期市场风格进行调仓以及调整成分基金比例。
        # 保留:中欧明睿新常态混合A(001811),建信健康民生混合(000547),
        # 调出:泓德战略转型股票(001705),兴全商业模式优选混合(163415),工银美丽城镇主题股票A(001043),国富中国收益混合(450001)
        # 调入:工银新金融股票(001054),工银瑞信战略转型主题股票A(000991),汇丰晋信动态策略混合A(540003)兴全绿色投资混合(163409)
        # 结合以上基金的近期表现,以及风控,以及维持整个组合均衡配置(目前组合偏科技板块)做出如上调整,欢迎大家跟调。
        # """
        {
            '001811': {
                'name': '中欧明睿新常态混合A',
                'radio': 0.2
            },
            '001054': {
                'name': '工银新金融股票',
                'radio': 0.2
            },
            '000991': {
                'name': '工银瑞信战略转型主题股票A',
                'radio': 0.1
            },
            '540003': {
                'name': '汇丰晋信动态策略混合A',
                'radio': 0.2
            },
            '000547': {
                'name': '建信健康民生混合',
                'radio': 0.1
            },
            '163409': {
                'name': '兴全绿色投资混合(LOF)',
                'radio': 0.2
            },
        },
        [
            {
                'code': '519002',
                'name': '华安安信消费混合',
                'radio': 0.2
            },
            {
                'code': '001718',
                'name': '工银瑞信物流产业股票',
                'radio': 0.2
            },
            {
                'code': '000991',
                'name': '工银瑞信战略转型主题股票A',
                'radio': 0.1
            },
            {
                'code': '540003',
                'name': '汇丰晋信动态策略混合A',
                'radio': 0.1
            },
            {
                'code': '450001',
                'name': '国富中国收益混合',
                'radio': 0.1
            },
            {
                'code': '000547',
                'name': '建信健康民生混合',
                'radio': 0.1
            },
            {
                'code': '163409',
                'name': '兴全绿色投资混合(LOF)',
                'radio': 0.2
            },
        ]
    ]
    # 基金组合信息
    fund_portfolio = holder_history_list[2]
    fund_code_pool = []  #list(fund_portfolio.keys())
    for item in fund_portfolio:
        fund_code_pool.append(item.get('code'))
    print("fund_code_pool", fund_code_pool)
    holder_stock_industry_list = each_statistic.summary_special_funds_stock_detail(
        fund_code_pool, quarter_index)
    path = './outcome/数据整理/funds/高分权益基金组合十大持仓明细-加工.xlsx'
    columns = [
        '基金代码', '基金名称', '基金类型', '基金经理', '基金总资产(亿元)', '基金股票总仓位', '十大股票仓位',
        '股票代码', '股票名称', '所占仓位', '所处仓位排名', '三级行业', '二级行业', '一级行业'
    ]
    df_a_list = pd.DataFrame(holder_stock_industry_list, columns=columns)
    # print("df_a_list", df_a_list)

    update_xlsx_file(path, df_a_list, sheet_name='十大持仓明细--' + '2022-01')
def all_stocks_rank(each_statistic=None):
    if each_statistic == None:
        each_statistic = FundStatistic()
    """所有股票排名
    """
    quarter_index = get_last_quarter_str(1)
    print("该quarter_index为", quarter_index)
    last_quarter_index = get_last_quarter_str(2)
    columns = [
        '代码', '名称', quarter_index + '持有数量(只)', last_quarter_index + '持有数量(只)',
        '持有数量环比', '持有数量环比百分比', '持有数量升或降', quarter_index + '持有市值(亿元)',
        last_quarter_index + '持有市值(亿元)', '持有市值环比', '持有市值环比百分比', '持有市值升或降'
    ]
    output_file = './outcome/数据整理/strategy/all_stock_rank/' + quarter_index + '.xlsx'

    stock_top_list = each_statistic.all_stock_fund_count(
        quarter_index=quarter_index, filter_count=0)
    all_a_stocks_industry_info_list = each_statistic.query_all_stock_industry_info(
    )
    a_stock_list = []
    hk_stock_list = []
    other_stock_list = []
    for stock_name_code in stock_top_list:
        stock_code = stock_name_code[0].split('-', 1)[0]
        #path = 'other'
        if bool(re.search("^\d{5}$", stock_code)):
            #path = '港股'
            hk_stock_list.append(stock_name_code)
        elif bool(re.search("^\d{6}$", stock_code)):
            # 'A股/深证主板'、'A股/创业板'、'A股/上证主板'、'A股/科创板'
            a_condition = bool(
                re.search(
                    "^(00(0|1|2|3)\d{3})|(30(0|1)\d{3})|(60(0|1|2|3|5)\d{3})|68(8|9)\d{3}$",
                    stock_code))
            target_item = find_from_list_of_dict(
                all_a_stocks_industry_info_list, 'stock_code', stock_code)
            if a_condition and target_item:
                stock_name_code[1]['industry_name_first'] = target_item.get(
                    'industry_name_first')
                stock_name_code[1]['industry_name_second'] = target_item.get(
                    'industry_name_second')
                stock_name_code[1]['industry_name_third'] = target_item.get(
                    'industry_name_third')
                a_stock_list.append(stock_name_code)
            else:
                other_stock_list.append(stock_name_code)
        else:
            other_stock_list.append(stock_name_code)

    a_market = 'A股'
    hk_market = '港股'
    other_market = '其他'

    a_stock_compare_list = stocks_compare(a_stock_list,
                                          market=a_market,
                                          quarter_index=last_quarter_index,
                                          is_A_stock=True)
    hk_stock_compare_list = stocks_compare(
        hk_stock_list,
        market=hk_market,
        quarter_index=last_quarter_index,
    )
    other_stock_compare_list = stocks_compare(
        other_stock_list,
        market=other_market,
        quarter_index=last_quarter_index,
    )
    a_columns = [*columns, '三级行业', '二级行业', '一级行业']

    df_a_list = pd.DataFrame(a_stock_compare_list, columns=a_columns)
    df_hk_list = pd.DataFrame(hk_stock_compare_list, columns=columns)
    df_other_list = pd.DataFrame(other_stock_compare_list, columns=columns)

    writer = pd.ExcelWriter(output_file, engine='xlsxwriter')
    df_a_list.to_excel(writer, sheet_name=a_market)

    df_hk_list.to_excel(writer, sheet_name=hk_market)

    df_other_list.to_excel(writer, sheet_name=other_market)

    writer.save()