说明
拿上海电影这只股票举例子,换手率6%的时候,真实的换手率应该是20%,
这是因为流通股本里面,长期不抛售的股东占比高达70%,
所以获取真实的换手率尤为重要。
贴上代码(需要在聚宽上运行)
import pandas as pd
import jqdatasdk as jq
auth('id','password')
phase1 获取稳定股东的权重
def calculate_stable_shareholder_weight(code,time1,time2,time3,threshold=0.001):
# 查询最近三次报告
q1 = jq.query(jq.finance.STK_SHAREHOLDER_FLOATING_TOP10).filter(
jq.finance.STK_SHAREHOLDER_FLOATING_TOP10.code == f'{code}',
jq.finance.STK_SHAREHOLDER_FLOATING_TOP10.end_date > f'{time1}'
).limit(10)
q2=jq.query(jq.finance.STK_SHAREHOLDER_FLOATING_TOP10).filter(
jq.finance.STK_SHAREHOLDER_FLOATING_TOP10.code == f'{code}',
jq.finance.STK_SHAREHOLDER_FLOATING_TOP10.end_date > f'{time2}'
).limit(10)
q3=jq.query(jq.finance.STK_SHAREHOLDER_FLOATING_TOP10).filter(
jq.finance.STK_SHAREHOLDER_FLOATING_TOP10.code == f'{code}',
jq.finance.STK_SHAREHOLDER_FLOATING_TOP10.end_date > f'{time3}'
).limit(10)
# 运行查询
df1 = jq.finance.run_query(q1)
df2 = jq.finance.run_query(q2)
df3 = jq.finance.run_query(q3)
# 将所有年份的股东信息合并
merged_df = pd.merge(df1, df2, on='shareholder_name', suffixes=('_year1', '_year2'))
merged_df = pd.merge(merged_df, df3, on='shareholder_name')
merged_df.rename(columns={'share_ratio': 'share_ratio_year3'}, inplace=True)
# 计算每两年之间的持股比例差异
merged_df['diff_year1_year2'] = abs(merged_df['share_ratio_year1'] - merged_df['share_ratio_year2'])
merged_df['diff_year2_year3'] = abs(merged_df['share_ratio_year2'] - merged_df['share_ratio_year3'])
merged_df['diff_year1_year3'] = abs(merged_df['share_ratio_year1'] - merged_df['share_ratio_year3'])
# 筛选所有年份之间的差异都小于threshold的股东
stable_shareholders = merged_df[
(merged_df['diff_year1_year2'] <= threshold) &
(merged_df['diff_year2_year3'] <= threshold) &
(merged_df['diff_year1_year3'] <= threshold)
]
# 计算符合条件的股东持股总和占总流通股的比例
total_weight = stable_shareholders['share_ratio_year1'].sum() # year1, year2 或 year3 皆可
return total_weight
phase2 计算真实换手率
def real_turnover_ratio(code,one_date,time1,time2,time3):
# 在聚宽平台上可以跑以下代码
total_stable_weight, stable_shareholders = calculate_stable_shareholder_weight(code=f'{code}',
time1=f'{time1}',
time2=f'{time2}',
time3=f'{time3}')
q_turnover=query(valuation).filter(valuation.code==f'{code}')
df_turnover=get_fundamentals(q_turnover,f'{one_date}')
df_turnover[['code','turnover_ratio']]
res=df_turnover['turnover_ratio'].iloc[0]/((100-total_stable_weight)/100)
return res