feat: add sample_fund_list condition

main
jackluson 3 years ago
parent 87ab2416df
commit 883744891e

@ -11,6 +11,7 @@ import time
import datetime
import os
import sys
from pprint import pprint
sys.path.append('../')
sys.path.append(os.getcwd() + '/src')
from utils.index import get_season_index
@ -29,10 +30,12 @@ class FundStatistic:
self.quarter_index = quarter_index
self.each_query = FundQuery()
def all_stock_fund_count(self, *, quarter_index=None, filter_count=100):
def all_stock_fund_count(self, *, quarter_index=None, sample_fund_list=None, filter_count=100):
quarter_index = quarter_index if quarter_index else self.quarter_index
results = self.each_query.select_top_10_stock(quarter_index)
# pprint(results)
results = self.each_query.select_top_10_stock(
quarter_index,
sample_fund_list
)
code_dict = dict()
for result in results:
# print(result)
@ -40,6 +43,7 @@ class FundStatistic:
code = result[index]
name = result[index + 1] # 仅以股票名称为key兼容港股A股
# key = str(code) + '-' + str(name)
key = str(name)
if(key in code_dict and code != None):
code_dict[key] = code_dict[key] + 1
@ -55,5 +59,5 @@ class FundStatistic:
return list
# 分组查询特定股票的每个季度基金持有总数
def item_stock_fund_count(self, stock_name):
return self.each_query.select_special_stock_fund_count(stock_name)
def item_stock_fund_count(self, stock_name, sample_fund_list=None):
return self.each_query.select_special_stock_fund_count(stock_name, sample_fund_list)

@ -20,11 +20,15 @@ from fund_info.statistic import FundStatistic
if __name__ == '__main__':
each_statistic = FundStatistic()
# sample_fund_list = ['000001', '160133', '360014', '420002',
# '420102', '000409', '000418', '000746',
# '000751', '000884', '000991', '001043',
# '001054', '001104', '001410', '001473',
# '519714', '000003', '000011', '000029']
stock_top_list = each_statistic.all_stock_fund_count(
quarter_index="2021-Q1",
filter_count=90)
filter_count=89)
print('2020-Q4 top 100 股票')
# pprint(stock_top_list)
print(len(stock_top_list))
filter_list = []
@ -33,19 +37,31 @@ if __name__ == '__main__':
stock_sum = stock[1]
stock_quarter_count_tuple = each_statistic.item_stock_fund_count(
stock_name)
last_count_tuple = stock_quarter_count_tuple[len(
stock_quarter_count_tuple) - 2] # 选出上一个季度的
diff = stock_sum - last_count_tuple[0]
stock_name
)
try:
last_count_tuple = stock_quarter_count_tuple[len(
stock_quarter_count_tuple) - 2]
except:
print('该股票查询异常', stock_name)
continue
last_stock_sum = last_count_tuple[0] # 选出上一个季度的
if len(stock_quarter_count_tuple) == 1:
last_stock_sum = 0
diff = stock_sum - last_stock_sum
diff_percent = '{:.2%}'.format(
diff / last_count_tuple[0])
diff / last_stock_sum) if last_stock_sum != 0 else "+∞"
flag = '📈' if diff > 0 else '📉'
if diff == 0:
flag = ''
item_tuple = (stock_name, stock_sum, last_count_tuple[0],
item_tuple = (stock_name, stock_sum, last_stock_sum,
diff, diff_percent, flag)
if not float(diff_percent.rstrip('%')) < -20:
if diff_percent == "+∞" or not float(diff_percent.rstrip('%')) < -20:
filter_list.append(item_tuple)
print(item_tuple)
pprint(filter_list)

@ -91,16 +91,24 @@ class FundQuery:
self.cursor.execute(sql_update, [total_asset, fund_code])
self.connect_instance.commit()
def select_top_10_stock(self, quarter_index=None):
def select_top_10_stock(self, quarter_index=None, sample_fund_list=None):
stock_sql_join = ''
for index in range(10):
stock_sql_join = stock_sql_join + \
"t.top_stock_%s_code, t.top_stock_%s_name" % (
str(index), str(index)) + ","
# print(stock_sql_join[0:-1])
stock_sql_join = stock_sql_join[0:-1]
fund_code_list_sql = ''
# 判断是否传入sample_fund_list
if isinstance(sample_fund_list, list):
if len(sample_fund_list) == 0:
return ()
list_str = ', '.join(sample_fund_list)
fund_code_list_sql = "AND t.fund_code IN (" + list_str + ")"
sql_query_quarter = "SELECT t.fund_code," + stock_sql_join + \
" FROM fund_morning_stock_info as t WHERE t.quarter_index = %s AND t.stock_position_total > 20;" # 大于20%股票持仓基金
" FROM fund_morning_stock_info as t WHERE t.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]) # 执行sql语句
@ -108,15 +116,22 @@ class FundQuery:
return results
# 分组查询特定股票的每个季度基金持有总数
def select_special_stock_fund_count(self, stock_name):
def select_special_stock_fund_count(self, stock_name, sample_fund_list=None):
stock_sql_join = '('
for index in range(10):
stock_sql_join = stock_sql_join + \
"t.top_stock_%s_name = '%s' or " % (
str(index), stock_name)
# print(stock_sql_join[0:-1])
stock_sql_join = stock_sql_join[0:-3] + ')'
fund_code_list_sql = ''
# 判断是否传入sample_fund_list
if isinstance(sample_fund_list, list):
if len(sample_fund_list) == 0:
return ()
list_str = ', '.join(sample_fund_list)
fund_code_list_sql = "t.fund_code IN (" + list_str + ") AND "
sql_query_sqecial_stock_fund_count = "SELECT count(1) as count, quarter_index FROM fund_morning_stock_info as t WHERE t.stock_position_total > 20 AND " + \
fund_code_list_sql + \
stock_sql_join + " GROUP BY t.quarter_index;" # 大于20%股票持仓基金
self.cursor.execute(sql_query_sqecial_stock_fund_count) # 执行sql语句

Loading…
Cancel
Save