量化交易学习日记4-真实的换手率

说明

拿上海电影这只股票举例子,换手率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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值