feat: 增加输出行业数据

main
jackluson 3 years ago
parent e2171655f1
commit 38aa49f013

@ -14,6 +14,22 @@ def connect():
host=env_db_host, user=env_db_user, password=env_db_password, db=env_db_name, charset='utf8')
return connect
def connect_dict():
load_dotenv()
env_db_host = os.getenv('db_host')
env_db_name = os.getenv('db_name')
env_db_user = os.getenv('db_user')
env_db_password = os.getenv('db_password')
connect = pymysql.connect(
host=env_db_host, user=env_db_user, password=env_db_password, db=env_db_name,
charset='utf8')
connect_dict = {
'connect': connect,
'cursor': connect.cursor(),
'dict_cursor': connect.cursor(pymysql.cursors.DictCursor)
}
return connect_dict
if __name__ == '__main__':
connect()

@ -9,6 +9,7 @@ Copyright (c) 2021 Camel Lu
'''
import time
import datetime
import re
import os
import sys
from pprint import pprint
@ -16,6 +17,7 @@ sys.path.append('../')
sys.path.append(os.getcwd() + '/src')
from utils.index import get_quarter_index, fisrt_match_condition_from_list
from sql_model.fund_query import FundQuery
from sql_model.stock_query import StockQuery
class FundStatistic:
@ -29,6 +31,7 @@ class FundStatistic:
quarter_index = year + '-Q' + str(index)
self.quarter_index = quarter_index
self.each_query = FundQuery()
self.stock_query = StockQuery()
def all_stock_fund_count(self, *, quarter_index=None, fund_code_pool=None, filter_count=100):
"""查询某一个季度基金的十大持仓并对持仓股票进行汇总统计并根据filter_count进行过滤
@ -141,7 +144,9 @@ class FundStatistic:
}
#for key, value in code_dict.items():
# print('key, value', key, value)
return sorted(code_dict.items(), key=lambda x: x[1]['count'], reverse=True)
print('code_dict.items()', code_dict.items())
return list(code_dict.items())
#return sorted(code_dict.items(), key=lambda x: x[1]['count'], reverse=True)
# 分组查询特定股票的每个季度基金持有总数
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)
@ -171,3 +176,41 @@ class FundStatistic:
morning_star_rating_3=morning_star_rating_3,
**args
)
def select_stock_pool_industry(self, fund_code_pool):
return self.stock_query.query_stock_industry(fund_code_pool)
def select_special_fund_info(self, code, quarter_index=None):
return self.each_query.select_special_fund_info(code, quarter_index)
def summary_special_funds_stock_detail(self, fund_code_pool, quarter_index=None):
holder_stock_industry_list = []
for fund_code in fund_code_pool:
fund_info = self.select_special_fund_info(fund_code, quarter_index )
fund_code = fund_info[0]
fund_name = fund_info[1]
fund_cat = fund_info[2]
fund_manager = fund_info[3]
fund_total_asset = fund_info[4]
fund_total_portion = fund_info[5]
fund_ten_portion = fund_info[6]
for index in range(7, len(fund_info), 3):
stock_code = fund_info[index]
stock_name = fund_info[index+1]
stock_portion = fund_info[index+2]
stock_index = int((index - 4) / 3)
stock_list_industry = [fund_code, fund_name,fund_cat,fund_manager, fund_total_asset, fund_total_portion, fund_ten_portion,
stock_code, stock_name, stock_portion, stock_index]
#holder_stock_industry_list.append(stock_list_industry]
if bool(re.search("^\d{6}$", stock_code)):
stock_list_industry_list = self.select_stock_pool_industry([stock_code])
stock_list_industry_dict = stock_list_industry_list[0]
industry_name_first = stock_list_industry_dict.get('industry_name_first')
industry_name_second = stock_list_industry_dict.get('industry_name_second')
industry_name_third = stock_list_industry_dict.get('industry_name_third')
holder_stock_industry_list.append([*stock_list_industry, industry_name_third,industry_name_second, industry_name_first])
return holder_stock_industry_list
def query_all_stock_industry_info(self):
return self.stock_query.query_all_stock()

@ -14,7 +14,7 @@ import re
from pprint import pprint
import pandas as pd
from fund_info.statistic import FundStatistic
from utils.index import get_last_quarter_str
from utils.index import get_last_quarter_str, find_from_list_of_dict
from openpyxl import load_workbook
import os
@ -44,9 +44,10 @@ def get_fund_code_pool():
)
return fund_code_pool
def stocks_compare(stock_list, fund_code_pool=None):
def stocks_compare(stock_list, *, quarter_index=None, fund_code_pool=None, is_A_stock=None):
each_statistic = FundStatistic()
last_quarter_index = get_last_quarter_str(2)
if quarter_index == None:
quarter_index = get_last_quarter_str(2)
filter_list = []
for stock in stock_list:
@ -60,7 +61,7 @@ def stocks_compare(stock_list, fund_code_pool=None):
last_quarter_holder_detail_dict = each_statistic.select_special_stock_special_quarter_info(
stock_code,
last_quarter_index,
quarter_index,
fund_code_pool
)
@ -85,8 +86,13 @@ def stocks_compare(stock_list, fund_code_pool=None):
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)
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)
@ -114,52 +120,50 @@ def t100_stocks_rank(quarter_index=None, *, each_statistic):
# 所有股票排名
def all_stocks_rank(each_statistic):
quarter_index = get_last_quarter_str()
quarter_index = get_last_quarter_str(2)
print("quarter_index", quarter_index)
last_quarter_index = get_last_quarter_str(2)
last_quarter_index = get_last_quarter_str(3)
sheet_name = last_quarter_index + '基金重仓股T100'
columns=['代码',
'名称', quarter_index + '持有数量(只)', last_quarter_index +'持有数量(只)', '持有数量环比', '持有数量环比百分比', '持有数量升或降', quarter_index + '持有市值(亿元)', last_quarter_index + '持有市值(亿元)', '持有市值环比', '持有市值环比百分比', '持有市值升或降']
output_file = './outcome/数据整理/strategy/'+ quarter_index +'-all_stock_rank.xlsx'
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)
#print("stock_top_list", stock_top_list)
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)):
if bool(re.search("^00(0|1|2|3)\d{3}$", stock_code)):
#path = 'A股/深证主板'
a_stock_list.append(stock_name_code)
elif bool(re.search("^300\d{3}$", stock_code)):
#path = 'A股/创业板'
a_stock_list.append(stock_name_code)
elif bool(re.search("^60(0|1|2|3|5)\d{3}$", stock_code)):
#path = 'A股/上证主板'
a_stock_list.append(stock_name_code)
elif bool(re.search("^68(8|9)\d{3}$", stock_code)):
#path = '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))
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')
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)
hk_stock_compare_list = stocks_compare(hk_stock_list)
other_stock_compare_list = stocks_compare(other_stock_list)
df_a_list = pd.DataFrame(a_stock_compare_list, columns=columns)
#print("df_a_list", df_a_list)
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_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)
@ -223,7 +227,44 @@ def all_stock_holder_detail(quarter_index, each_statistic, threshold=0):
else:
df_list.to_excel(
path, sheet_name=quarter_index)
# 获取某些基金的十大持仓股票信息
def get_special_fund_code_holder_stock_detail(quarter_index, each_statistic):
#基金组合信息
fund_portfolio ={
'001811': {
'name': '中欧明睿新常态混合A',
'position' : 0.2
},
'001705': {
'name': '泓德战略转型股票',
'position' : 0.2
},
'163415': {
'name': '兴全商业模式优选混合',
'position' : 0.2
},
'001043': {
'name': '工银美丽城镇主题股票A',
'position' : 0.2
},
'000547': {
'name': '建信健康民生混合',
'position' : 0.2
},
'450001': {
'name': '国富中国收益混合',
'position' : 0.2
},
}
fund_code_pool = list(fund_portfolio.keys())
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)
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"
@ -231,8 +272,11 @@ if __name__ == '__main__':
# 所有股票的基金持仓细节
#all_stock_holder_detail(quarter_index, each_statistic)
# 获取所有股票排名,分类输出
# 获取所有股票排名,按股票市场分类输出
all_stocks_rank(each_statistic)
# 获取Top100股票排名
#t100_stocks_rank(each_statistic=each_statistic)
# 获取某些基金的十大持仓股票信息
#get_special_fund_code_holder_stock_detail(quarter_index, each_statistic)

@ -315,3 +315,23 @@ class FundQuery:
self.cursor.execute(sql, [quarter_index]) # 执行sql语句
results = self.cursor.fetchall() # 获取查询的所有记录
return results
# 联表查某一个基金信息
def select_special_fund_info(self, code, quarter_index=None):
if quarter_index == None:
quarter_index = self.quarter_index
stock_sql_join = ''
for index in range(10):
stock_sql_join = stock_sql_join + \
"d.top_stock_%s_code, d.top_stock_%s_name, d.top_stock_%s_portion" % (
str(index), str(index), str(index)) + ","
stock_sql_join = stock_sql_join[0:-1]
sql = "SELECT a.fund_code, a.fund_name, a.fund_cat, c.name, b.total_asset, b.stock_position_total, b.stock_position_ten, " + stock_sql_join + \
" FROM fund_morning_base AS a LEFT JOIN fund_morning_quarter AS b ON a.fund_code = b.fund_code \
LEFT JOIN fund_morning_manager as c ON c.manager_id = b.manager_id \
LEFT JOIN fund_morning_stock_info as d ON b.fund_code = d.fund_code AND b.quarter_index = d.quarter_index \
WHERE a.fund_code = %s AND b.quarter_index = %s ;"
self.cursor.execute(sql, [code, quarter_index]) # 执行sql语句
results = self.cursor.fetchone() # 获取查询的所有记录
return results

@ -0,0 +1,35 @@
'''
Desc: 股票查询
File: /stock_query.py
Project: sql_model
File Created: Wednesday, 30th June 2021 3:29:07 pm
Author: luxuemin2108@gmail.com
-----
Copyright (c) 2021 Camel Lu
'''
from db.connect import connect_dict
class StockQuery:
def __init__(self):
connect_instance = connect_dict()
self.connect = connect_instance.get('connect')
self.cursor = connect_instance.get('cursor')
self.dict_cursor = connect_instance.get('dict_cursor')
def query_all_stock(self):
query_stock_sql = "SELECT stock_code, industry_name_first, industry_name_second, industry_name_third FROM stock_industry"
self.dict_cursor.execute(query_stock_sql)
results = self.dict_cursor.fetchall()
return results
# 查询股票对应行业
def query_stock_industry(self, stock_code_pool):
if isinstance(stock_code_pool, list):
if len(stock_code_pool) == 0:
return ()
temp = "%s," * len(stock_code_pool)
stock_sql_join = temp[0:-1]
sql = "SELECT stock_code, stock_name, industry_name_first, industry_name_second, industry_name_third FROM stock_industry WHERE stock_code IN ( " + stock_sql_join + " )"
self.dict_cursor.execute(sql, stock_code_pool)
results = self.dict_cursor.fetchall()
return results

@ -63,7 +63,7 @@ def get_quarter_index(input_date):
def get_last_quarter_str(last_index=1):
last_quarter_time = time.localtime(time.time() - last_index * 3 * 30 * 24 * 3600)
last_quarter_time = time.localtime(time.time() - last_index * 3 * 30 * 24 * 3600 - 24 * 3600)
year = time.strftime("%Y", last_quarter_time)
date = time.strftime("%m-%d", last_quarter_time)
index = get_quarter_index(date)
@ -82,3 +82,22 @@ def fisrt_match_condition_from_list(list, code):
is_exist = code == stock_code
if is_exist:
return item
def dict_list_to_list_list(dict_list, key_sort_list):
tuple_list =[]
for item in dict_list:
temp_list = []
for key in key_sort_list:
temp_list.append(item.get(key))
tuple_list.append(temp_list)
return tuple_list
def find_from_list_of_dict(dict_list, match_key, value):
res = None
for sub in dict_list:
if sub[match_key] == value:
res = sub
break
return res

Loading…
Cancel
Save