Python北交所股指【北证50】构造

Python北交所股指【北证50】构造,第1张

为北交所构造一个股票指数,【北证50】,包含50个成分股。

文章目录

文章目录

前言

一、股指构建流程

二、Python实现

1.引入库

2.绘制K线图函数

3.从含有多个股票数据的面板中抽取出某个股票的数据函数

4.判断调整股本系数函数

5.成分股筛选函数

6.股指计算函数(加权计算公式)

7.调用函数实现功能

总结


前言

北交所目前没有一个成熟的指数,咱给他编一个。

一、股指构建流程

一、基期和基点的确定:

基期:20211231 

大部分股指是以某一固定日为基日。基于北交所的情况,选取其开市当年的年尾作为基日

基点:1000

基点参考沪深300指数

二、样本股的确定:

考虑到北交所上市不到180天,上市公司不到一百家,故根据日均成交金额剔除排名后25%的股票,再根据日均总市值对剩余股票进行排名,选取前50只股票作为样本股。

三、计算公式的确定

 

二、Python实现 1.引入库

代码如下(示例):

import pandas as pd
import mplfinance as mpf
from datetime import datetime,timedelta
base_index = 1000 #基期的基点数确定为1000
2.绘制K线图函数
def draw_candlepic(data, filename):
    # 设置marketcolors
    mc = mpf.make_marketcolors(
        up='red',
        down='green',
        edge='i',
        wick='i',
        volume='in',
        inherit=True)

    # 设置图形风格
    s = mpf.make_mpf_style(
        gridaxis='both',
        gridstyle='-.',
        y_on_right=False,
        marketcolors=mc)

    kwargs = dict(
        type='candle',
        mav=(5, 10),
        volume=True,
        title="BJ stock exchange stock index",
        ylabel='Stock Index',
        ylabel_lower='Traded Volume',
        # figratio=(15, 10),
        # figscale=5
        )
    pic = mpf.plot(data,
             **kwargs,
             style=s,
             show_nontrading=False,
             savefig=filename
             )
    return pic
3.从含有多个股票数据的面板中抽取出某个股票的数据函数
def pro_daily_stock(code_val,data,start_val ,end_val):
    """
    从含有多个股票数据的面板中抽取出某个股票的数据。

    Parameters:
     code_val - 要抽取的股票带代码
     data - 含有股指成分股票的open、close、high、low、volume、流通股本、总股本数据的dataframe
     start_val - 开始的时间
     end_val - 结束的时间

    Returns:
     股指的open、close、high、low、volume、equity_all 、equity_mkt,dataframe。

    Raises:
     KeyError - raises an exception
    """
    df = data.loc[data['Code'] == code_val]
    df = df[(df['Date'] < end_val) & (df['Date'] > start_val)]

    #返回
    return  df
4.判断调整股本系数函数
def adjusted_pro(proposition_all):
    #print(proposition_all)
    result = []
    for proposition in proposition_all:
        if(proposition <= 0.1):
            result.append(proposition)
        elif(proposition > 0.1 and proposition <= 0.2):
            result.append(0.2)
        elif(proposition > 0.2 and proposition <= 0.3):
            result.append(0.3)
        elif(proposition > 0.3 and proposition <= 0.4):
            result.append(0.4)
        elif(proposition > 0.4 and proposition <= 0.5):
            result.append(0.5)
        elif(proposition > 0.5 and proposition <= 0.6):
            result.append(0.6)
        elif(proposition > 0.6 and proposition <= 0.7):
            result.append(0.7)
        elif(proposition > 0.7 and proposition <= 0.8):
            result.append(0.8)
        elif(proposition > 0.8):
            result.append(1.0)
    #print(result)
    return result
5.成分股筛选函数
def component_select( stock_list , volum , value):
    """
    对选入北交所股指的成分股进行筛选.

    Parameters:
     stock_list - 所有股票的代码列表
     volum - 用于筛选的成交量列表
     value - 用于筛选的市值列表

    Returns:
     被筛选进入股指的股票代码列表

    Raises:
     KeyError - raises an exception
    """
    table = []
    for stock, vol, val in zip(stock_list , volum , value):
        table.append([stock, vol, val])
    table.sort(key=lambda x : x[1],reverse=True)
    table = table[0:int(3*(len(table)/4))]
    
    table.sort(key=lambda x : x[2],reverse=True)
    table = table[0:20]
    return [i[0] for i in table]
6.股指计算函数(加权计算公式)
#股指计算函数(加权计算公式)
def stockindex_cal(list_code, data , start_val, end_val):
  """
    计算股指的open、close、high、low、volume数值,并返回dataframe。

    Parameters:
     list_code - 所有股票的代码列表
     data - 含有股指成分股票的open、close、high、low、volume、流通股本、总股本数据的dataframe
     start_val - 开始的时间
     end_val - 结束的时间

    Returns:
     股指的open、close、high、low、volume,dataframe。

    Raises:
     KeyError - raises an exception
    """
    dfopen_list = pd.DataFrame()
    dfclose_list = pd.DataFrame()
    dfhigh_list = pd.DataFrame()
    dflow_list = pd.DataFrame()
    dfvolumn_list = pd.DataFrame()
    dfequity_adjusted_list = pd.DataFrame()
    dfdatetime_list = pd.DataFrame()

    i = 0
    j = []
    stock_dati = pro_daily_stock(list_code[0],data, start_val, end_val)
    dfdatetime_list = stock_dati['Date']
    for code in list_code:
        print(i,"股票代码:",code)
        stock_dati = pro_daily_stock(code,data, start_val, end_val)
        #dfdatetime_list[i] = stock_dati['Date']
        #stock_dati.info()
        ##更新数值,叠加序列
        proposition_all = []
        for a,b in zip(stock_dati['equity_mkt'] , stock_dati['equity_all']):
            proposition_all.append(a/b)
        dfequity_adjusted_list[i] = (np.multiply(np.array(stock_dati['equity_all']),np.array(adjusted_pro(proposition_all)))).tolist()
        dfopen_list[i] = (np.multiply(np.array(stock_dati['Open']),np.array(dfequity_adjusted_list[i]))).tolist()
        dfclose_list[i] = (np.multiply(np.array(stock_dati['Close']),np.array(dfequity_adjusted_list[i]))).tolist()
        dfhigh_list[i] = (np.multiply(np.array(stock_dati['High']),np.array(dfequity_adjusted_list[i]))).tolist()
        dflow_list[i] = (np.multiply(np.array(stock_dati['Low']),np.array(dfequity_adjusted_list[i]))).tolist()
        dfvolumn_list[i] = stock_dati['Volume'].tolist()
        j.append(dfequity_adjusted_list[i])
        i = i + 1
    new_j = []
    
    for column in range(len(j[0])):
        total = 0
        # print("column = ",column)
        for i in range(len(j)):
            total += j[i][column]
        new_j.append(total)
    df_new_j = pd.DataFrame(new_j)
    # 
    print(pd.concat([dfopen_list,df_new_j],axis=1,ignore_index=True).index)
    stockindex = pd.DataFrame()
    stockindex['Open'] = pd.concat([dfopen_list,df_new_j],axis=1,ignore_index=True).apply(lambda x: x[0:len(x)-2].sum()/x[len(x)-1], axis=1)
    stockindex['Close'] = pd.concat([dfclose_list,df_new_j],axis=1,ignore_index=True).apply(lambda x: x[0:len(x)-2].sum()/x[len(x)-1], axis=1)
    stockindex['High'] = pd.concat([dfhigh_list,df_new_j],axis=1,ignore_index=True).apply(lambda x: x[0:len(x)-2].sum()/x[len(x)-1], axis=1)
    stockindex['Low'] = pd.concat([dflow_list,df_new_j],axis=1,ignore_index=True).apply(lambda x: x[0:len(x)-2].sum()/x[len(x)-1], axis=1)
    stockindex['Volume'] = dfvolumn_list.apply(lambda x: x.sum(), axis=1)
    coefficient = 1000 / stockindex['Open'][0]
    stockindex['Open'] = stockindex['Open'] *coefficient
    stockindex['Close'] = stockindex['Close'] *coefficient
    stockindex['High'] = stockindex['High'] *coefficient
    stockindex['Low'] = stockindex['Low'] *coefficient  
    stockindex.index = dfdatetime_list
    return stockindex
7.调用函数实现功能
#获取数据
filepath = r''#北交所股票数据文件位置
df_data = pd.read_excel(filepath)
df_data=df_data[~df_data.isin(['--'])]
df_data=df_data[~df_data.isin(['#VALUE!'])]
df_data['Date'] = pd.to_datetime(df_data['Date'])
df_data.dropna(inplace = True)
name = ['Code','Date']
for (columnName, columnData) in df_data.iteritems():
    if(columnName not in name):
        df_data[columnName] = df_data[columnName].astype('float')
benchemarkday = '2021-12-31'
df_data_benchemarkday = df_data[df_data['Date'] == benchemarkday]
#print(df_data_benchemarkday)
#对应代码 选取市值前十的编制指数
list_code = component_select(list(df_data_benchemarkday['Code']),list(df_data_benchemarkday['Volume']),list(df_data_benchemarkday['Value']))
#print(list_code)
BJstockindex = stockindex_cal(list_code,df_data,datetime(2021,12,31), datetime(2022,4,29))
print(BJstockindex)
BJstockindex.info()
BJstockindex.to_excel(r'')#股指行情数据存储位置
#绘制版块K线图
filename = r''#k线图存储位置
pic = draw_candlepic(BJstockindex, filename)
mpf.plot(BJstockindex)
print("成分股包括",len(list_code),"个:",list_code)

总结

结果

北交所【北证50】行情数据:

DateOpenCloseHighLowVolume
2022-01-04 00:00:001000986.54081022.178953.587380598800
2022-01-05 00:00:00989.2613954.26651006.629936.41141.03E+08
2022-01-06 00:00:00946.8143945.2824969.7085911.883277924100
2022-01-07 00:00:00942.4053915.9837958.7197911.75860408800
2022-01-10 00:00:00912.706929.5972946.6833901.868252655000
2022-01-11 00:00:00938.3407934.82960.3012922.322955217800
2022-01-12 00:00:00942.1217939.1366951.3516916.460345396100
2022-01-13 00:00:00939.2697927.4674963.4592905.49483014200
2022-01-14 00:00:00914.5249927.7141943.0316899.885860246600
2022-01-17 00:00:00925.4504955.1867977.8098912.526275765800
2022-01-18 00:00:00960.5596940.2313980.2006921.930876349300
2022-01-19 00:00:00944.1635935.6306971.2086911.594361660000
2022-01-20 00:00:00934.9683938.9257978.9594908.13295134700
2022-01-21 00:00:001028.61023.6011050.9571001.90872205400
2022-01-24 00:00:001010.4451024.0211051.696981.664654250600
2022-01-25 00:00:001019.272981.67931036.821974.031651871600
2022-01-26 00:00:00983.0435988.18081014.898965.707450068600
2022-01-27 00:00:00992.7041974.89981011.379963.477346187500
2022-01-28 00:00:00977.2909987.10411005.311949.926140265700
2022-02-07 00:00:00999.698994.01311014.872983.599832720800
2022-02-08 00:00:00990.8865987.04711002.264960.048429712700
2022-02-09 00:00:001450.091466.2171483.4451423.85537139700
2022-02-10 00:00:001428.8351378.0521442.2281373.02833087300
2022-02-11 00:00:001368.1671286.2531385.11262.89140672700
2022-02-14 00:00:001295.3371247.961323.3631212.19744993000
2022-02-15 00:00:001250.3721273.9981299.661225.30939029600
2022-02-16 00:00:001276.8991263.5391307.8241241.12829390200
2022-02-17 00:00:001268.4841305.2741367.2271249.46738378700
2022-02-18 00:00:001300.8151304.831336.5851266.3234889700
2022-02-21 00:00:001351.5811323.681366.3761291.06946562100
2022-02-22 00:00:001294.9721284.7211333.1291272.24340648000
2022-02-23 00:00:001274.8811329.0581345.191271.51731787500
2022-02-24 00:00:001313.741278.9991341.7711249.30447591400
2022-02-25 00:00:001295.9461299.3681330.6291280.88528000000
2022-02-28 00:00:001283.3091294.1691314.1671267.87426582000
2022-03-01 00:00:001312.0171332.4951354.6941289.71723780100
2022-03-02 00:00:001340.9721340.71353.7521300.46123910000
2022-03-03 00:00:001352.7941329.6641385.3321310.59442113000
2022-03-04 00:00:001306.0061279.3471321.7591266.47830435200
2022-03-07 00:00:001283.3161223.6381292.161204.20224980100
2022-03-08 00:00:001220.6911145.8451229.3321138.98430382200
2022-03-09 00:00:001167.2631143.3311178.2421085.95527911700
2022-03-10 00:00:001194.3321178.8751205.5841158.72225295200
2022-03-11 00:00:001148.7671186.1081198.6581128.70732567800
2022-03-14 00:00:001175.9731145.2951191.1621125.29830073600
2022-03-15 00:00:001119.6071101.1831148.4511083.69529185900
2022-03-16 00:00:001125.4921142.1681159.5651070.37440329000
2022-03-17 00:00:001170.8731201.551272.4521151.44164867900
2022-03-18 00:00:001190.5771226.2831249.5431167.58539864200
2022-03-21 00:00:001226.9931242.7451261.1021209.55734461500
2022-03-22 00:00:001239.7081253.671277.651188.96135634000
2022-03-23 00:00:001245.8191229.0061292.0281217.9633735700
2022-03-24 00:00:001219.0591231.9711252.8691194.71841297500
2022-03-25 00:00:001232.5951165.3151243.1351156.42733959000
2022-03-28 00:00:001162.1591136.0511178.9551114.90524276300
2022-03-29 00:00:001146.7821139.9651170.5481123.65318767600
2022-03-30 00:00:001125.181176.7211193.7221116.7218174700
2022-03-31 00:00:001184.6141159.2331202.2921138.0326247300
2022-04-01 00:00:001150.8491148.8651175.491129.80331485500
2022-04-06 00:00:001152.6521142.2541168.7941134.118058400
2022-04-07 00:00:001143.5421109.451148.0691098.29227544100
2022-04-08 00:00:001104.861091.0871116.1091067.89616668200
2022-04-11 00:00:001087.2151038.7931088.8581020.616673700
2022-04-12 00:00:001032.9111049.5881060.751026.16716275600
2022-04-13 00:00:001035.5161022.781048.9661010.4613224300
2022-04-14 00:00:001035.141998.53311046.152987.623319209800
2022-04-15 00:00:00992.672960.7639999.4594953.597218066900
2022-04-18 00:00:00965.45881036.8041051.604945.181316440500
2022-04-19 00:00:001028.7081011.641045.3591000.6214490700
2022-04-20 00:00:001013.811989.10111019.696973.811515203200
2022-04-21 00:00:00988.0004953.9597996.0003944.667217631900
2022-04-22 00:00:00941.2076953.4744972.9929925.41616280500
2022-04-25 00:00:00945.9288899.1527955.1544883.614120358500
2022-04-26 00:00:00914.9489862.8075928.0836851.049918024600
2022-04-27 00:00:00844.578920.8308932.3685823.752421012500
2022-04-28 00:00:00913.7189899.2154935.7863885.694417545400

数据点我主页查找

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/793180.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存