@ -11,12 +11,14 @@ Copyright (c) 2020 Camel Lu
'''
'''
import time
import time
import re
import re
import decimal
import os
from pprint import pprint
from pprint import pprint
import pandas as pd
import pandas as pd
import numpy as np
from fund_info . statistic import FundStatistic
from fund_info . statistic import FundStatistic
from utils . index import get_last_quarter_str , find_from_list_of_dict
from utils . index import get_last_quarter_str , get_stock_market , find_from_list_of_dict , update_xlsx_file
from openpyxl import load_workbook
import os
def get_fund_code_pool ( ) :
def get_fund_code_pool ( ) :
# fund_code_pool = ['000001', '160133', '360014', '420002',
# fund_code_pool = ['000001', '160133', '360014', '420002',
@ -44,10 +46,24 @@ def get_fund_code_pool():
)
)
return fund_code_pool
return fund_code_pool
def stocks_compare ( stock_list , * , quarter_index = None , fund_code_pool = None , is_A_stock = None ) :
each_statistic = FundStatistic ( )
def stocks_compare ( stock_list , * , market = None , quarter_index = None , fund_code_pool = None , is_A_stock = None ) :
""" 与某个季度数据进行比较
"""
if quarter_index == None :
if quarter_index == None :
quarter_index = get_last_quarter_str ( 2 )
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 )
each_statistic = FundStatistic ( )
filter_list = [ ]
filter_list = [ ]
for stock in stock_list :
for stock in stock_list :
@ -58,22 +74,25 @@ def stocks_compare(stock_list, *, quarter_index=None, fund_code_pool=None, is_A_
stock_holder_detail = stock [ 1 ]
stock_holder_detail = stock [ 1 ]
holder_count = stock_holder_detail . get ( ' count ' )
holder_count = stock_holder_detail . get ( ' count ' )
holder_asset = stock_holder_detail . get ( ' holder_asset ' )
holder_asset = stock_holder_detail . get ( ' holder_asset ' )
if not market :
last_quarter_holder_detail_dict = each_statistic . select_special_stock_special_quarter_info (
target_market = get_stock_market ( stock_code )
stock_code ,
print ( " target_market " , target_market )
quarter_index ,
df_data_target_market = data_last_quarter . get ( target_market )
fund_code_pool
target_loc = df_data_target_market [ df_data_target_market [ ' 代码 ' ] == stock_code ]
)
last_holder_count = 0
last_holder_asset = 0
last_holder_count = last_quarter_holder_detail_dict [ ' count ' ]
if len ( target_loc ) == 1 :
last_holder_asset = last_quarter_holder_detail_dict [ ' holder_asset ' ]
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_count = holder_count - last_holder_count
diff_holder_asset = holder_asset - last_holder_asset
diff_holder_asset = holder_asset - last_holder_asset
diff_holder_count_percent = ' {:.2%} ' . format (
diff_holder_count_percent = ' {:.2%} ' . format (
diff_holder_count / last_holder_count ) if last_holder_count != 0 else " +∞ "
diff_holder_count / last_holder_count ) if last_holder_count != 0 else " +∞ "
diff_holder_asset_percent = ' {:.2%} ' . format (
diff_holder_asset_percent = ' {:.2%} ' . format (
diff_holder_asset / last_holder_asset ) if last_holder_asset != 0 else " +∞ "
diff_holder_asset / last_holder_asset ) if last_holder_asset != 0 else " +∞ "
# flag = '📈' if diff_holder_count > 0 else '📉'
# flag = '📈' if diff_holder_count > 0 else '📉'
@ -85,14 +104,18 @@ def stocks_compare(stock_list, *, quarter_index=None, fund_code_pool=None, is_A_
flag_asset = ' up ' if diff_holder_asset > 0 else ' down '
flag_asset = ' up ' if diff_holder_asset > 0 else ' down '
if diff_holder_asset == 0 :
if diff_holder_asset == 0 :
flag = ' = '
flag = ' = '
item_tuple = [ stock_code , stock_name , holder_count , last_holder_count ,
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 ]
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 :
if is_A_stock :
industry_name_third = stock_holder_detail . get ( ' industry_name_third ' )
industry_name_third = stock_holder_detail . get (
industry_name_second = stock_holder_detail . get ( ' industry_name_second ' )
' industry_name_third ' )
industry_name_first = stock_holder_detail . get ( ' industry_name_first ' )
industry_name_second = stock_holder_detail . get (
item_tuple = [ * item_tuple , industry_name_third , industry_name_second , industry_name_first ]
' 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:
# if diff_percent == "+∞" or not float(diff_percent.rstrip('%')) < -20:
filter_list . append ( item_tuple )
filter_list . append ( item_tuple )
@ -100,34 +123,38 @@ def stocks_compare(stock_list, *, quarter_index=None, fund_code_pool=None, is_A_
return filter_list
return filter_list
# T100权重股排名
# T100权重股排名
def t100_stocks_rank ( quarter_index = None , * , each_statistic ) :
def t100_stocks_rank ( quarter_index = None , * , each_statistic ) :
if quarter_index == None :
if quarter_index == None :
quarter_index = get_last_quarter_str ( )
quarter_index = get_last_quarter_str ( 1 )
last_quarter_index = get_last_quarter_str ( 2 )
last_quarter_index = get_last_quarter_str ( 2 )
output_file = ' ./outcome/数据整理/strategy/top100_rank.xlsx '
output_file = ' ./outcome/数据整理/strategy/top100_rank.xlsx '
sheet_name = quarter_index + ' 基金重仓股T100 '
sheet_name = quarter_index + ' 基金重仓股T100 '
columns = [ ' 代码 ' ,
columns = [ ' 代码 ' ,
' 名称 ' , quarter_index + ' 持有数量(只) ' , last_quarter_index + ' 持有数量(只) ' , ' 持有数量环比 ' , ' 持有数量环比百分比 ' , ' 持有数量升或降 ' , quarter_index + ' 持有市值(亿元) ' , last_quarter_index + ' 持有市值(亿元) ' , ' 持有市值环比 ' , ' 持有市值环比百分比 ' , ' 持有市值升或降 ' ]
' 名称 ' , quarter_index + ' 持有数量(只) ' , last_quarter_index + ' 持有数量(只) ' , ' 持有数量环比 ' , ' 持有数量环比百分比 ' , ' 持有数量升或降 ' , quarter_index + ' 持有市值(亿元) ' , last_quarter_index + ' 持有市值(亿元) ' , ' 持有市值环比 ' , ' 持有市值环比百分比 ' , ' 持有市值升或降 ' ]
stock_top_list = each_statistic . all_stock_fund_count (
stock_top_list = each_statistic . all_stock_fund_count (
quarter_index = quarter_index ,
quarter_index = quarter_index ,
filter_count = 80 )
filter_count = 80 )
stock_top_list = stock_top_list [ : 100 ] # 获取top100权重股
stock_top_list = stock_top_list [ : 100 ] # 获取top100权重股
# pprint(stock_top_list)
# pprint(stock_top_list)
filter_list = stocks_compare ( stock_top_list )
filter_list = stocks_compare ( stock_top_list )
df_filter_list = pd . DataFrame ( filter_list , columns = columns )
df_filter_list = pd . DataFrame ( filter_list , columns = columns )
df_filter_list . to_excel ( output_file , sheet_name = sheet_name )
update_xlsx_file ( output_file , df_filter_list , sheet_name )
# df_filter_list.to_excel(output_file, sheet_name=sheet_name)
# 所有股票排名
def all_stocks_rank ( each_statistic ) :
def all_stocks_rank ( each_statistic ) :
quarter_index = get_last_quarter_str ( 2 )
""" 所有股票排名
"""
quarter_index = get_last_quarter_str ( 1 )
print ( " quarter_index " , quarter_index )
print ( " quarter_index " , quarter_index )
last_quarter_index = get_last_quarter_str ( 3 )
last_quarter_index = get_last_quarter_str ( 2 )
sheet_name = last_quarter_index + ' 基金重仓股T100 '
sheet_name = last_quarter_index + ' 基金重仓股T100 '
columns = [ ' 代码 ' ,
columns = [ ' 代码 ' ,
' 名称 ' , quarter_index + ' 持有数量(只) ' , last_quarter_index + ' 持有数量(只) ' , ' 持有数量环比 ' , ' 持有数量环比百分比 ' , ' 持有数量升或降 ' , quarter_index + ' 持有市值(亿元) ' , last_quarter_index + ' 持有市值(亿元) ' , ' 持有市值环比 ' , ' 持有市值环比百分比 ' , ' 持有市值升或降 ' ]
' 名称 ' , quarter_index + ' 持有数量(只) ' , last_quarter_index + ' 持有数量(只) ' , ' 持有数量环比 ' , ' 持有数量环比百分比 ' , ' 持有数量升或降 ' , quarter_index + ' 持有市值(亿元) ' , last_quarter_index + ' 持有市值(亿元) ' , ' 持有市值环比 ' , ' 持有市值环比百分比 ' , ' 持有市值升或降 ' ]
output_file = ' ./outcome/数据整理/strategy/all_stock_rank/ ' + quarter_index + ' .xlsx '
output_file = ' ./outcome/数据整理/strategy/all_stock_rank/ ' + quarter_index + ' .xlsx '
stock_top_list = each_statistic . all_stock_fund_count (
stock_top_list = each_statistic . all_stock_fund_count (
quarter_index = quarter_index ,
quarter_index = quarter_index ,
@ -145,38 +172,60 @@ def all_stocks_rank(each_statistic):
#path = '港股'
#path = '港股'
hk_stock_list . append ( stock_name_code )
hk_stock_list . append ( stock_name_code )
elif bool ( re . search ( " ^ \ d {6} $ " , stock_code ) ) :
elif bool ( re . search ( " ^ \ d {6} $ " , stock_code ) ) :
#'A股/深证主板'、'A股/创业板'、'A股/上证主板'、'A股/科创板'
# '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 ) )
a_condition = bool ( re . search (
target_item = find_from_list_of_dict ( all_a_stocks_industry_info_list , ' stock_code ' , stock_code )
" ^(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 :
if a_condition and target_item :
print ( ' stock_code ' , stock_code )
stock_name_code [ 1 ] [ ' industry_name_first ' ] = target_item . get (
stock_name_code [ 1 ] [ ' industry_name_first ' ] = target_item . get ( ' industry_name_first ' )
' industry_name_first ' )
stock_name_code [ 1 ] [ ' industry_name_second ' ] = target_item . get ( ' industry_name_second ' )
stock_name_code [ 1 ] [ ' industry_name_second ' ] = target_item . get (
stock_name_code [ 1 ] [ ' industry_name_third ' ] = target_item . get ( ' industry_name_third ' )
' industry_name_second ' )
stock_name_code [ 1 ] [ ' industry_name_third ' ] = target_item . get (
' industry_name_third ' )
a_stock_list . append ( stock_name_code )
a_stock_list . append ( stock_name_code )
else :
else :
other_stock_list . append ( stock_name_code )
other_stock_list . append ( stock_name_code )
else :
else :
other_stock_list . append ( stock_name_code )
other_stock_list . append ( stock_name_code )
a_stock_compare_list = stocks_compare ( a_stock_list , quarter_index = last_quarter_index , is_A_stock = True )
a_market = ' A股 '
hk_stock_compare_list = stocks_compare ( hk_stock_list , quarter_index = last_quarter_index , )
hk_market = ' 港股 '
other_stock_compare_list = stocks_compare ( other_stock_list , quarter_index = last_quarter_index , )
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 , ' 三级行业 ' , ' 二级行业 ' , ' 一级行业 ' ]
a_columns = [ * columns , ' 三级行业 ' , ' 二级行业 ' , ' 一级行业 ' ]
df_a_list = pd . DataFrame ( a_stock_compare_list , columns = a_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_hk_list = pd . DataFrame ( hk_stock_compare_list , columns = columns )
df_other_list = pd . DataFrame ( other_stock_compare_list , columns = columns )
df_other_list = pd . DataFrame ( other_stock_compare_list , columns = columns )
writer = pd . ExcelWriter ( output_file , engine = ' xlsxwriter ' )
writer = pd . ExcelWriter ( output_file , engine = ' xlsxwriter ' )
df_a_list . to_excel ( writer , sheet_name = ' A股 ' )
df_a_list . to_excel ( writer , sheet_name = a_market )
df_hk_list . to_excel ( writer , sheet_name = ' 港股 ' )
df_hk_list . to_excel ( writer , sheet_name = hk_market )
df_other_list . to_excel ( writer , sheet_name = ' 其他 ' )
df_other_list . to_excel ( writer , sheet_name = other_market )
writer . save ( )
writer . save ( )
def all_stock_holder_detail ( quarter_index , each_statistic , threshold = 0 ) :
def all_stock_holder_detail ( each_statistic , * , quarter_index = None , threshold = 0 ) :
""" 所有股票的基金持仓细节
Args :
each_statistic ( class ) : 统计类
quarter_index ( str , optional ) : 季度字符串 . Defaults to None .
threshold ( int , optional ) : 输出门槛 . Defaults to 0.
"""
if quarter_index == None :
quarter_index = get_last_quarter_str ( )
stock_list = each_statistic . all_stock_fund_count_and_details (
stock_list = each_statistic . all_stock_fund_count_and_details (
quarter_index = quarter_index ,
quarter_index = quarter_index ,
filter_count = threshold )
filter_count = threshold )
@ -199,84 +248,75 @@ def all_stock_holder_detail(quarter_index, each_statistic, threshold=0):
else :
else :
print ( ' stock_name_code ' , stock_name_code )
print ( ' stock_name_code ' , stock_name_code )
hold_fund_count = stock [ 1 ] [ ' count ' ]
hold_fund_count = stock [ 1 ] [ ' count ' ]
hold_fund_list = sorted ( stock [ 1 ] [ ' fund_list ' ] , key = lambda x : x [ ' 持有市值(亿元) ' ] , reverse = True )
hold_fund_list = sorted (
stock [ 1 ] [ ' fund_list ' ] , key = lambda x : x [ ' 持有市值(亿元) ' ] , reverse = True )
df_list = pd . DataFrame ( hold_fund_list )
df_list = pd . DataFrame ( hold_fund_list )
# if stock_code == 'NTES':
# if stock_code == 'NTES':
# print('stock_code', df_list)
# print('stock_code', df_list)
stock_name_code = stock_name_code . replace ( ' -* ' , ' - ' ) . replace ( ' / ' , ' - ' )
stock_name_code = stock_name_code . replace ( ' -* ' , ' - ' ) . replace ( ' / ' , ' - ' )
path = ' ./outcome/数据整理/stocks/ ' + path + ' / ' + stock_name_code + ' .xlsx '
path = ' ./outcome/数据整理/stocks/ ' + path + ' / ' + stock_name_code + ' .xlsx '
path = path . replace ( ' \ / ' , ' - ' )
path = path . replace ( ' \ / ' , ' - ' )
print ( " path " , path )
print ( " path " , path )
#print('df_list--',stock_name_code, df_list)
if os . path . exists ( path ) :
update_xlsx_file ( path , df_list , quarter_index )
writer = pd . ExcelWriter ( path , engine = ' openpyxl ' )
book = load_workbook ( path )
# 表名重复,删掉,重写
if quarter_index in book . sheetnames :
del book [ quarter_index ]
if len ( book . sheetnames ) == 0 :
df_list . to_excel (
path , sheet_name = quarter_index )
continue
else :
writer . book = book
df_list . to_excel (
writer , sheet_name = quarter_index )
writer . save ( )
writer . close ( )
else :
df_list . to_excel (
path , sheet_name = quarter_index )
# 获取某些基金的十大持仓股票信息
def get_special_fund_code_holder_stock_detail ( quarter_index , each_statistic ) :
def get_special_fund_code_holder_stock_detail ( quarter_index , each_statistic ) :
#基金组合信息
""" 获取某些基金的十大持仓股票信息
fund_portfolio = {
"""
# 基金组合信息
fund_portfolio = {
' 001811 ' : {
' 001811 ' : {
' name ' : ' 中欧明睿新常态混合A ' ,
' name ' : ' 中欧明睿新常态混合A ' ,
' position ' : 0.2
' position ' : 0.2
} ,
} ,
' 001705 ' : {
' 001705 ' : {
' name ' : ' 泓德战略转型股票 ' ,
' name ' : ' 泓德战略转型股票 ' ,
' position ' : 0.2
' position ' : 0.2
} ,
} ,
' 163415 ' : {
' 163415 ' : {
' name ' : ' 兴全商业模式优选混合 ' ,
' name ' : ' 兴全商业模式优选混合 ' ,
' position ' : 0.2
' position ' : 0.2
} ,
} ,
' 001043 ' : {
' 001043 ' : {
' name ' : ' 工银美丽城镇主题股票A ' ,
' name ' : ' 工银美丽城镇主题股票A ' ,
' position ' : 0.2
' position ' : 0.2
} ,
} ,
' 000547 ' : {
' 000547 ' : {
' name ' : ' 建信健康民生混合 ' ,
' name ' : ' 建信健康民生混合 ' ,
' position ' : 0.2
' position ' : 0.2
} ,
} ,
' 450001 ' : {
' 450001 ' : {
' name ' : ' 国富中国收益混合 ' ,
' name ' : ' 国富中国收益混合 ' ,
' position ' : 0.2
' position ' : 0.2
} ,
} ,
}
}
fund_code_pool = list ( fund_portfolio . keys ( ) )
fund_code_pool = list ( fund_portfolio . keys ( ) )
holder_stock_industry_list = each_statistic . summary_special_funds_stock_detail ( fund_code_pool , quarter_index )
holder_stock_industry_list = each_statistic . summary_special_funds_stock_detail (
fund_code_pool , quarter_index )
path = ' ./outcome/数据整理/funds/ ' + ' / ' + ' 高分权益基金组合十大持仓明细 ' + ' .xlsx '
path = ' ./outcome/数据整理/funds/ ' + ' / ' + ' 高分权益基金组合十大持仓明细 ' + ' .xlsx '
columns = [ ' 基金代码 ' , ' 基金名称 ' , ' 基金类型 ' , ' 基金经理 ' , ' 基金总资产(亿元) ' , ' 基金股票总仓位 ' , ' 十大股票仓位 ' , ' 股票代码 ' , ' 股票名称 ' , ' 所占仓位 ' , ' 所处仓位排名 ' , ' 三级行业 ' , ' 二级行业 ' , ' 一级行业 ' ]
columns = [ ' 基金代码 ' , ' 基金名称 ' , ' 基金类型 ' , ' 基金经理 ' , ' 基金总资产(亿元) ' , ' 基金股票总仓位 ' ,
' 十大股票仓位 ' , ' 股票代码 ' , ' 股票名称 ' , ' 所占仓位 ' , ' 所处仓位排名 ' , ' 三级行业 ' , ' 二级行业 ' , ' 一级行业 ' ]
df_a_list = pd . DataFrame ( holder_stock_industry_list , columns = columns )
df_a_list = pd . DataFrame ( holder_stock_industry_list , columns = columns )
writer = pd . ExcelWriter ( path , engine = ' xlsxwriter ' )
writer = pd . ExcelWriter ( path , engine = ' xlsxwriter ' )
df_a_list . to_excel ( writer , sheet_name = ' 十大持仓明细-- ' + quarter_index )
df_a_list . to_excel ( writer , sheet_name = ' 十大持仓明细-- ' + quarter_index )
writer . save ( )
writer . save ( )
if __name__ == ' __main__ ' :
if __name__ == ' __main__ ' :
each_statistic = FundStatistic ( )
each_statistic = FundStatistic ( )
quarter_index = " 2021-Q1 "
# quarter_index = "2021-Q2"
# read_excel(path, 'A股', '601888', '2021-Q1持有市值( 亿元) ')
# 所有股票的基金持仓细节
# 所有股票的基金持仓细节
# all_stock_holder_detail(quarter_index, each_statistic)
# all_stock_holder_detail(each_statistic)
# 获取所有股票排名,按股票市场分类输出
# 获取所有股票排名,按股票市场分类输出
all_stocks_rank ( each_statistic )
# all_stocks_rank(each_statistic )
# 获取Top100股票排名
# 获取Top100股票排名
#t100_stocks_rank(each_statistic=each_statistic )
t100_stocks_rank ( each_statistic = each_statistic )
# 获取某些基金的十大持仓股票信息
# 获取某些基金的十大持仓股票信息
#get_special_fund_code_holder_stock_detail(quarter_index, each_statistic)
#get_special_fund_code_holder_stock_detail(quarter_index, each_statistic)