feat: 增加持有市值数据输出

main
jackluson 3 years ago
parent d8ffc6db1b
commit 71903d705b

@ -54,21 +54,26 @@ class FundStatistic:
for index in range(4, len(result), 3):
code = result[index]
name = result[index + 1] # 仅以股票名称为key兼容港股A股
portion = result[index + 2]
if code == None or name == None:
#print('index', index, 'code', code, 'name', name)
#print('基金名称', result[1],'基金代码', result[0])
continue
key = fisrt_match_condition_from_list(list(code_dict), code)
holder_asset = round(portion * totol_asset / 100, 4) if totol_asset and portion else 0
if key == None and code and name:
key = str(code) + '-' + str(name)
if(key in code_dict and code != None):
count = code_dict[key]['count'] + 1
holder_asset = code_dict[key]['holder_asset'] + holder_asset
code_dict[key] = {
'count': count
'count': count,
'holder_asset': holder_asset
}
else:
code_dict[key] = {
'count': 1
'count': 1,
'holder_asset': holder_asset
}
filer_dict = dict()
@ -115,13 +120,13 @@ class FundStatistic:
if key == None and code and name:
key = str(code) + '-' + str(name)
#key = str(name)
hold_asset = round(portion * totol_asset / 100, 4) if totol_asset and portion else 0
holder_asset = round(portion * totol_asset / 100, 4) if totol_asset and portion else 0
if(key in code_dict and code != None):
code_dict[key]['count'] = code_dict[key]['count'] + 1
code_dict[key]['fund_list'].append({
**fund_info,
'仓位占比': portion,
'持有市值(亿元)': hold_asset,
'持有市值(亿元)': holder_asset,
'仓位排名': int(index / 3)
})
else:
@ -130,7 +135,7 @@ class FundStatistic:
'fund_list': [{
**fund_info,
'仓位占比': portion,
'持有市值(亿元)': hold_asset,
'持有市值(亿元)': holder_asset,
'仓位排名': int(index / 3)
}]
}
@ -141,6 +146,25 @@ class FundStatistic:
def item_stock_fund_count(self, stock_code, fund_code_pool=None):
return self.each_query.select_special_stock_fund_count(stock_code, fund_code_pool)
def select_special_stock_special_quarter_info(self, stock_code, quarter_index=None,fund_code_pool=None):
result = self.each_query.select_special_stock_special_quarter_info(stock_code, quarter_index, fund_code_pool)
target_stock_dict = {
'count': len(result)
}
total_holder_asset = 0
for holders in result:
total_asset = holders[1]
for index in range(2, len(holders), 2):
code = holders[index]
if code == stock_code:
portion = holders[index+1]
holder_asset = round(portion * total_asset / 100, 4) if total_asset and portion else 0
total_holder_asset = total_holder_asset + holder_asset
break
target_stock_dict['holder_asset'] = total_holder_asset
return target_stock_dict
def select_fund_pool(self, *, morning_star_rating_5="", morning_star_rating_3="", **args):
return self.each_query.select_certain_condition_funds(
morning_star_rating_5=morning_star_rating_5,

@ -0,0 +1,54 @@
'''
Desc: 天天基金信息爬取
File: /tiantian.py
Project: fund_info
File Created: Tuesday, 1st June 2021 11:02:59 am
Author: luxuemin2108@gmail.com
-----
Copyright (c) 2021 Camel Lu
'''
import requests
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument('--headless')
chrome_driver = webdriver.Chrome(options=chrome_options)
def get_tiantian_fund_list(chrome_driver):
fund_list_url = "http://fund.eastmoney.com/js/fundcode_search.js"
# res = requests.get(fund_list_url) # 自动编码
# # print("res", res.text)
chrome_driver.get(fund_list_url)
fund_list_code_str = chrome_driver.find_element_by_tag_name("pre").text
return_value_code_str = ";return {\
fund_list: r \
};"
execute_return_list = chrome_driver.execute_script(fund_list_code_str + return_value_code_str)
# execute_return_list = chrome_driver.execute_script(";return r;")
# print("execute_return", execute_return_list.get('fund_list')[0])
return_value_code_str = ";return {\
data_holder_structure: Data_holderStructure \
};"
item_fund_info_url = "http://fund.eastmoney.com/pingzhongdata/000001.js"
# res = requests.get(item_fund_info_url) # 自动编码
# # print("res", res.text)
chrome_driver.get(item_fund_info_url)
content_text = chrome_driver.page_source
fund_item_code_str = chrome_driver.find_element_by_tag_name("pre").text
execute_return_item = chrome_driver.execute_script(fund_item_code_str + return_value_code_str)
print("execute_return", execute_return_item)
# global_var = chrome_driver.execute_script("return window;")
# print("global_var", global_var)
# chrome_driver.execute_script("return globalVar;")

@ -55,34 +55,38 @@ def stocks_compare(stock_list, fund_code_pool=None):
continue
stock_name = stock[0].split('-', 1)[1]
stock_holder_detail = stock[1]
stock_sum = stock_holder_detail.get('count')
holder_count = stock_holder_detail.get('count')
holder_asset = stock_holder_detail.get('holder_asset')
stock_quarter_count_tuple = each_statistic.item_stock_fund_count(
last_quarter_holder_detail_dict = each_statistic.select_special_stock_special_quarter_info(
stock_code,
last_quarter_index,
fund_code_pool
)
last_stock_sum = 0
#print("stock_quarter_count_tuple", stock_quarter_count_tuple)
for item in stock_quarter_count_tuple:
quarter_index_str = item[1]
if quarter_index_str == last_quarter_index:
last_stock_sum = item[0]
break
diff = stock_sum - last_stock_sum
diff_percent = '{:.2%}'.format(
diff / last_stock_sum) if last_stock_sum != 0 else "+∞"
# flag = '📈' if diff > 0 else '📉'
# if diff == 0:
last_holder_count = last_quarter_holder_detail_dict['count']
last_holder_asset = last_quarter_holder_detail_dict['holder_asset']
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 = 'up' if diff > 0 else 'down'
if diff == 0:
flag_count = 'up' if diff_holder_count > 0 else 'down'
if diff_holder_count == 0:
flag = '='
item_tuple = (stock_code, stock_name, stock_sum, last_stock_sum,
diff, diff_percent, flag)
flag_asset = 'up' if diff_holder_asset > 0 else 'down'
if diff_holder_asset == 0:
flag = '='
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 diff_percent == "+∞" or not float(diff_percent.rstrip('%')) < -20:
filter_list.append(item_tuple)
@ -90,14 +94,14 @@ def stocks_compare(stock_list, fund_code_pool=None):
return filter_list
# T100权重股排名
def t100_stocks_rank(quarter_index, each_statistic):
def t100_stocks_rank(quarter_index=None, *, each_statistic):
if quarter_index == None:
quarter_index = get_last_quarter_str()
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 + '持有数量(只)', '环比', '环比百分比', '升Or']
'名称', quarter_index + '持有数量(只)', last_quarter_index +'持有数量(只)', '持有数量环比', '持有数量环比百分比', '持有数量升或降', quarter_index + '持有市值(亿元)', last_quarter_index + '持有市值(亿元)', '持有市值环比', '持有市值环比百分比', '持有市值升或']
stock_top_list = each_statistic.all_stock_fund_count(
quarter_index=quarter_index,
@ -115,19 +119,18 @@ def all_stocks_rank(each_statistic):
last_quarter_index = get_last_quarter_str(2)
sheet_name = last_quarter_index + '基金重仓股T100'
columns=['代码',
'名称', quarter_index + '持有数量(只)', last_quarter_index + '持有数量(只)', '环比', '环比百分比', '升Or']
'名称', quarter_index + '持有数量(只)', last_quarter_index +'持有数量(只)', '持有数量环比', '持有数量环比百分比', '持有数量升或降', quarter_index + '持有市值(亿元)', last_quarter_index + '持有市值(亿元)', '持有市值环比', '持有市值环比百分比', '持有市值升或']
output_file = './outcome/数据整理/strategy/'+ quarter_index +'-all_stock_rank.xlsx'
stock_top_list = each_statistic.all_stock_fund_count(
quarter_index=quarter_index,
filter_count=0)
other_stock_list = []
#print("stock_top_list", stock_top_list)
hk_stock_list = []
a_stock_list = []
hk_stock_list = []
other_stock_list = []
for stock_name_code in stock_top_list:
print(stock_name_code)
stock_code = stock_name_code[0].split('-', 1)[0]
#path = 'other'
if bool(re.search("^\d{5}$", stock_code)):
@ -224,8 +227,12 @@ def all_stock_holder_detail(quarter_index, each_statistic, threshold=0):
if __name__ == '__main__':
each_statistic = FundStatistic()
quarter_index = "2021-Q1"
# 获取重仓股
all_stocks_rank(each_statistic)
# 所有股票的基金持仓细节
#all_stock_holder_detail(quarter_index, each_statistic)
# 获取所有股票排名,分类输出
all_stocks_rank(each_statistic)
# 获取Top100股票排名
#t100_stocks_rank(each_statistic=each_statistic)

@ -240,12 +240,12 @@ class FundQuery:
list_str = ', '.join(fund_code_pool)
fund_code_list_sql = "AND t.fund_code IN (" + list_str + ")"
sql_query_quarter = "SELECT t.fund_code, t.fund_name, u.total_asset, t.stock_position_total, " + stock_sql_join + \
" FROM fund_morning_stock_info as t LEFT JOIN fund_morning_quarter as u ON u.fund_code = t.fund_code WHERE u.quarter_index = %s AND t.quarter_index = %s AND t.stock_position_total > 20 " + \
" FROM fund_morning_stock_info as t LEFT JOIN fund_morning_quarter as u ON u.fund_code = t.fund_code AND u.quarter_index = t.quarter_index WHERE u.quarter_index = %s AND t.stock_position_total > 20 " + \
fund_code_list_sql + \
";" # 大于20%股票持仓基金
if quarter_index == None:
quarter_index = self.quarter_index
self.cursor.execute(sql_query_quarter, [quarter_index, quarter_index]) # 执行sql语句
self.cursor.execute(sql_query_quarter, [quarter_index]) # 执行sql语句
results = self.cursor.fetchall() # 获取查询的所有记录
return results
@ -273,7 +273,40 @@ class FundQuery:
# print(self.cursor._last_executed)
results = self.cursor.fetchall() # 获取查询的所有记录
return results
#
def select_special_stock_special_quarter_info(self,stock_code,quarter_index=None, fund_code_pool=None):
if quarter_index == None:
quarter_index = self.quarter_index
select_stock_sql_join = ''
condition_stock_sql_join = '('
for index in range(10):
escape_code = stock_code.replace("'", "\\'")
condition_stock_sql_join = condition_stock_sql_join + \
"t.top_stock_{0}_code = '{1}' or ".format(
str(index), escape_code)
select_stock_sql_join = select_stock_sql_join + \
"t.top_stock_%s_code, t.top_stock_%s_portion" % (
str(index), str(index)) + ","
condition_stock_sql_join = " AND " + condition_stock_sql_join[0:-3] + ')'
select_stock_sql_join = select_stock_sql_join[0:-1]
fund_code_list_sql = ''
# 判断是否传入fund_code_pool
if isinstance(fund_code_pool, list):
if len(fund_code_pool) == 0:
return ()
list_str = ', '.join(fund_code_pool)
fund_code_list_sql = "t.fund_code IN (" + list_str + ") AND "
sql_query_sqecial_stock_fund_count = "SELECT a.fund_code, a.total_asset, "+ select_stock_sql_join +" FROM fund_morning_stock_info as t " + \
"LEFT JOIN fund_morning_quarter as a ON t.fund_code = a.fund_code AND t.quarter_index = a.quarter_index " + \
"WHERE t.quarter_index = %s AND t.stock_position_total > 20" + \
fund_code_list_sql + condition_stock_sql_join + ";" # 大于20%股票持仓基金
self.cursor.execute(sql_query_sqecial_stock_fund_count, [quarter_index]) # 执行sql语句
# print(self.cursor._last_executed)
results = self.cursor.fetchall() # 获取查询的所有记录
return results
# total_asset 为null的基金
def select_total_asset_is_null(self, quarter_index=None):
if quarter_index == None:

Loading…
Cancel
Save