@ -11,12 +11,14 @@ Copyright (c) 2020 Camel Lu
'''
import time
import re
import decimal
import os
from pprint import pprint
import pandas as pd
import numpy as np
from fund_info . statistic import FundStatistic
from utils . index import get_last_quarter_str , find_from_list_of_dict
from openpyxl import load_workbook
import os
from utils . index import get_last_quarter_str , get_stock_market , find_from_list_of_dict , update_xlsx_file
def get_fund_code_pool ( ) :
# fund_code_pool = ['000001', '160133', '360014', '420002',
@ -44,10 +46,24 @@ def get_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 :
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 = [ ]
for stock in stock_list :
@ -58,16 +74,19 @@ def stocks_compare(stock_list, *, quarter_index=None, fund_code_pool=None, is_A_
stock_holder_detail = stock [ 1 ]
holder_count = stock_holder_detail . get ( ' count ' )
holder_asset = stock_holder_detail . get ( ' holder_asset ' )
last_quarter_holder_detail_dict = each_statistic . select_special_stock_special_quarter_info (
stock_code ,
quarter_index ,
fund_code_pool
)
last_holder_count = last_quarter_holder_detail_dict [ ' count ' ]
last_holder_asset = last_quarter_holder_detail_dict [ ' holder_asset ' ]
if not market :
target_market = get_stock_market ( stock_code )
print ( " target_market " , target_market )
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
@ -89,10 +108,14 @@ def stocks_compare(stock_list, *, quarter_index=None, fund_code_pool=None, is_A_
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 ]
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 )
@ -100,9 +123,11 @@ def stocks_compare(stock_list, *, quarter_index=None, fund_code_pool=None, is_A_
return filter_list
# T100权重股排名
def t100_stocks_rank ( quarter_index = None , * , each_statistic ) :
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 )
output_file = ' ./outcome/数据整理/strategy/top100_rank.xlsx '
sheet_name = quarter_index + ' 基金重仓股T100 '
@ -116,19 +141,21 @@ def t100_stocks_rank(quarter_index=None, *, each_statistic):
# pprint(stock_top_list)
filter_list = stocks_compare ( stock_top_list )
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 ) :
quarter_index = get_last_quarter_str ( 2 )
""" 所有股票排名
"""
quarter_index = get_last_quarter_str ( 1 )
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 '
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 )
@ -146,37 +173,59 @@ def all_stocks_rank(each_statistic):
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 )
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 :
print ( ' stock_code ' , stock_code )
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 ' )
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_stock_compare_list = stocks_compare ( a_stock_list , quarter_index = last_quarter_index , is_A_stock = True )
hk_stock_compare_list = stocks_compare ( hk_stock_list , quarter_index = last_quarter_index , )
other_stock_compare_list = stocks_compare ( other_stock_list , quarter_index = last_quarter_index , )
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股 ' )
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 ( )
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 (
quarter_index = quarter_index ,
filter_count = threshold )
@ -199,7 +248,8 @@ def all_stock_holder_detail(quarter_index, each_statistic, threshold=0):
else :
print ( ' stock_name_code ' , stock_name_code )
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 )
# if stock_code == 'NTES':
# print('stock_code', df_list)
@ -207,28 +257,13 @@ def all_stock_holder_detail(quarter_index, each_statistic, threshold=0):
path = ' ./outcome/数据整理/stocks/ ' + path + ' / ' + stock_name_code + ' .xlsx '
path = path . replace ( ' \ / ' , ' - ' )
print ( " path " , path )
#print('df_list--',stock_name_code, df_list)
if os . path . exists ( path ) :
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 )
# 获取某些基金的十大持仓股票信息
update_xlsx_file ( path , df_list , quarter_index )
def get_special_fund_code_holder_stock_detail ( quarter_index , each_statistic ) :
""" 获取某些基金的十大持仓股票信息
"""
# 基金组合信息
fund_portfolio = {
' 001811 ' : {
@ -257,26 +292,31 @@ def get_special_fund_code_holder_stock_detail(quarter_index, each_statistic):
} ,
}
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 '
columns = [ ' 基金代码 ' , ' 基金名称 ' , ' 基金类型 ' , ' 基金经理 ' , ' 基金总资产(亿元) ' , ' 基金股票总仓位 ' , ' 十大股票仓位 ' , ' 股票代码 ' , ' 股票名称 ' , ' 所占仓位 ' , ' 所处仓位排名 ' , ' 三级行业 ' , ' 二级行业 ' , ' 一级行业 ' ]
columns = [ ' 基金代码 ' , ' 基金名称 ' , ' 基金类型 ' , ' 基金经理 ' , ' 基金总资产(亿元) ' , ' 基金股票总仓位 ' ,
' 十大股票仓位 ' , ' 股票代码 ' , ' 股票名称 ' , ' 所占仓位 ' , ' 所处仓位排名 ' , ' 三级行业 ' , ' 二级行业 ' , ' 一级行业 ' ]
df_a_list = pd . DataFrame ( holder_stock_industry_list , columns = columns )
writer = pd . ExcelWriter ( path , engine = ' xlsxwriter ' )
df_a_list . to_excel ( writer , sheet_name = ' 十大持仓明细-- ' + quarter_index )
writer . save ( )
if __name__ == ' __main__ ' :
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股票排名
#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)