Primera experiencia de cuantificación financiera de python: resumen de la pregunta A de la "Estrategia de mejora del índice del área de la Gran Bahía" de la "Copa del Área de la Gran Bahía" de 2020 (actualización continua)

Tabla de contenido

1. Introducción

2. Preparativos

(1) Análisis del tema:

conjunto de datos proporcionado

pregunta

3. Ideas para resolver problemas:

(1) Ideas para resolver la primera pregunta

4. Implementación del código

(1) Parte del código de la primera pregunta


1. Introducción

        Terminé de aprender el marco relevante de minería de datos con mi novio antes, y decidí encontrar algunos problemas para el combate real. Encontré esta competencia por accidente, así que encontré los problemas de competencia de la primera competencia en el sitio web oficial. Originalmente quería hacer la pregunta B, pero la pregunta B es una pregunta de conjunto de datos abiertos. Para practicar mejor cómo tratar con conjuntos de datos originales aleatorios, decidí usar la pregunta A como pregunta de práctica después de la discusión.

        Dado que esta es la primera vez que entro en contacto con datos financieros, también es el primer combate real desde que aprendí la minería de datos, así que si hay algún error, infórmeme e incluya más. ¡Entonces empecemos!

2. Preparativos

El paquete de compresión de títulos se puede descargar en mi disco de red Baidu:

Enlace: https://pan.baidu.com/s/1AN2NP1_w_i72bC_vtNU2qw?pwd=bxx3
Código de extracción: bxx3

(1) Análisis del tema:

Conjuntos de datos proporcionados:

El tema nos proporciona dos archivos de datos, que son los datos de mercado de 30 acciones de 2011 a 2020 y los datos de mercado del Índice del Área de la Gran Bahía de 2011 a 2020 en el Área de la Gran Bahía.

Se puede ver que los datos proporcionan el código bursátil (código), el precio de apertura del día (abierto), el precio de negociación más alto del día (alto), el precio de negociación más bajo del día (bajo), el precio de cierre del día (cierre), el volumen de negociación del día (volumen) y los datos del monto de la Transacción (cantidad).

(Los datos de 30 acciones son los mismos que el tipo de datos proporcionado por las Cotizaciones del Área de la Gran Bahía)

pregunta:

 

Análisis del problema:

Resumen: una empresa en el título ofrece una estrategia de inversión, es decir, selecciona 10 acciones fuertes de 30 acciones para invertir cada semana y cambia de posición todos los lunes (es decir, vende todas las acciones y compra las acciones fuertes de la semana anterior) .

Requisitos: Tomar como cuasi-considerado ingreso el precio de cierre (cierre) del lunes, el monto de inversión de cada acción se fija en el 10% del principal y la comisión por manejo se calcula en 2,5 diezmilésimas.

La primera subpregunta: Calcule la curva de rendimiento de esta estrategia de inversión y compárela con el Índice del Área de la Gran Bahía

La segunda subpregunta: ajuste el tiempo de ajuste de posición, ajuste el monto de inversión de una sola acción, encuentre la estrategia de inversión óptima y dibuje la curva de rendimiento

La tercera subpregunta: el tiempo de reequilibrio permanece sin cambios, y la inversión en una sola acción tiene una calificación del 10% del principal. Basado en el modelo de datos de mercado, dibuje su propia estrategia de inversión.

La cuarta subpregunta: el tiempo de ajuste y el monto de la inversión se pueden cambiar de manera flexible, según el modelo de datos de mercado, para obtener su propia estrategia de inversión. (3 días hábiles para completar la apertura de la posición, la posición no es inferior al 50% y una sola acción no supera el 10% de los activos totales)

3. Ideas para resolver problemas:

Primero analicé la primera y la segunda pregunta, y después de la discusión, se me ocurrió una solución general al problema (PD: las discusiones dentro del equipo de juego son realmente importantes)

(1) Ideas para resolver la primera pregunta:

En primer lugar, necesitamos averiguar un concepto financiero: la tasa de rendimiento.

Después de buscar la información, sabemos que la fórmula de la tasa de rendimiento es:

Tasa de rendimiento = ingreso / inversión original

Debido a los requisitos del título, el precio de cierre (cierre) del lunes se toma como el cuasi-considerado ingreso, el monto de inversión de cada acción se fija en el 10% del capital y la tarifa de manejo se calcula en 2.5 diezmilésimas. . Entonces abstraemos temporalmente la fórmula de tasa de retorno en el siguiente código:

price = open -  open * (0.000025) #单支投资额
interest = ((close-open)/price ) * 100 # 利益率

En ese momento, mi compañero de equipo de repente hizo una pregunta: cómo calcular el principal Después de una discusión, decidimos establecer el principal en 100,000 .

¿Por qué no establecer directamente el precio de compra total de 10 acciones individuales como principal al abrir una posición? Debido a que la observación encontró que los precios de apertura de estas 30 acciones oscilan entre 25 yuanes y 110 yuanes, si se calcula el precio de compra total de 10 acciones de una sola acción, si los precios de las diez acciones son todos 20-30 yuanes cuando la posición se abre, luego el precio de las 10 acciones en la segunda semana. Cuando necesite comprar otras 10 acciones, es posible que no tenga suficiente capital para comprarlas. Para evitar esta situación, simplemente establecemos el principal en 100 000 y luego establecemos cada inversión en acciones en el 10 % del principal de acuerdo con los requisitos (es decir, el monto de inversión original de cada acción es 10 000).

De esta manera, se resuelve el problema principal. La fórmula abstracta final de la tasa de interés es:

'''
power是单支股票的总收益额
price是购买单支股票的总入手价格
Interest是收益率
stocnum是本金能够购买的单支股票股数
principal是本金
'''
principal=100000
stocnum = int((principal / 10) / opendata[i])
power = (opendata1[i] - opendata[i]) * stocnum
price = (stocnum * opendata[i]) - (stocnum * opendata[i]) * (0.000025)
Interest = (sum(powerdata) / sum(pricedata)) * 100

Después de resolver el método de cálculo de la tasa de rendimiento, las discusiones posteriores son básicamente muy fluidas.

La idea es la siguiente:
(1) Abrir una posición dentro de los 3 días hábiles: calculando el precio de cierre del tercer día menos el precio de apertura del primer día como ingreso, seleccione las 10 acciones con el ingreso más alto para abrir una posición

(2) Elimine los datos de 30 acciones y guárdelos por separado: lea los datos de mercado de 30 acciones y córtelos, sepárelos y guarde las 30 acciones del archivo csv original para leerlos más tarde

(3) Interceptar los datos del precio de cierre y el precio de apertura de cada lunes: Dado que necesitamos usar el precio de cierre y el precio de apertura de cada lunes para calcular el rendimiento semanal y así determinar las 10 acciones fuertes que deben invertirse en el próximo semana, por lo que los datos bursátiles se pueden dividir semanalmente, y luego los datos semanales en los datos se pueden interceptar mediante el método iloc, incluido el cierre y la apertura del lunes, y se pueden tomar los datos del lunes de 30 acciones por semana afuera.

(4) Calcule las acciones sólidas semanales: cree una función, llame a la función en (3), obtenga los datos del precio de cierre y el precio de apertura de 30 acciones en la semana actual y utilícelos para calcular la tasa de retorno de cada acción en el semana actual, seleccione el retorno Las 10 acciones con la tasa más alta se consideran acciones sólidas, como las acciones de inversión para los datos de la próxima semana, y el valor de retorno es el código semanal de acciones fuertes. Repita esta función en la función principal para obtener datos semanales sólidos sobre acciones.

(5) Calcule la tasa de interés de la inversión semanal: cree una función, agregue los datos en (3) y (4) y realice una comparación de clave-valor entre los códigos de acciones de 10 acciones sólidas y los datos del lunes de 30 acciones cada semana. , para obtener los datos semanales de 10 acciones el lunes, que se utiliza para calcular la tasa de interés de los datos semanales de 10 acciones.

(6) Dibuje un gráfico de líneas con la matriz de tasas de interés: donde la abscisa es el año (2011-2020)

4. Implementación del código

(1) Parte del código de la primera pregunta

Separe 30 datos de stock y guarde:

import pandas as pd

# 读取数据并进行初步处理
def read_csv_shuju(path):
    '''

    :param path:
    path:文件路径
    :return:
    data2: 处理后数据
    '''
    data1 = pd.read_csv(path, sep=',')
    data1['date'] = pd.to_datetime(data1['time'])
    data1['date']=data1['date'].dt.date
    data2 = data1.drop([ 'time','volume', 'amount', 'open_interest'], axis=1)
    data2.set_index('code', inplace=True)
    states = ['date','open', 'hight', 'low', 'close']
    data2.reindex(columns=states)
    return data2

# 对数据进行分割并保存
def write_csv_data(data,start,code):
    '''
    :param:
    data:需要分割的原始数据
    start:上一次调用所到数据(每次输入时需要修改start的值为上一次输出的end值)
    code:输入需要分割的数据的股票名称
    :return: 根据输入的股票名称截取股票数据所在的列范围数据

    '''
    stock_code=[]
    end=0
    end+=start

    for i in range(end,len(data.index)):
         if data.index[i] == code:
              end+=1
         else:
              continue
    stock_code=data[start:end]
    return end,stock_code



if __name__ == '__main__':
    '''
    stock_data为读取后初步处理数据(未分割)
    stock_code为对数据按照股票代码进行分割后数据
    '''
    # 文件路径
    path1 = '../data/附录一:30支股票行情.csv'

    stock_data = read_csv_shuju(path1)
    print("初步处理数据:")
    print(stock_data)
    # print(len(stock_data.index))
    # print(stock_data.index[69696])


    '''
     # 这里需要手动修改参数,依次分割30支股票
    需要修改的参数:
    start: 修改为上一次输出的end值
    code: 修改为需要分割出来的股票代码
    文件名: 存入csv时的路径文件名
    '''
    end=0
    start=67431
    code='szse.000028'
    stock_code=[]
    end,stock_code=write_csv_data(stock_data,start,code)
    # stock_code.to_csv('./code_data/30.csv')
    print('分割后股票数据:')
    print(stock_code)
    print(stock_code.index)
    print('end:')
    print(end)

Función de posición abierta:

def Stock_position_building():   
    '''
    size_code:30支股票的编号
    first_data:存取读取30支股票的利润
    data1:将其股票编号和利润变成一维数组
    data2:将其股票利润排序
    data3:选取前十支股票
    data4:十支优势股票的收市
    ''' 
    size_code = ['002027','300014','002475','000636','002449','600183','000049','002138'
                 ,'300115','600325','000069','600383','600048','001914','601318','600323'
                 ,'002152','000921','002035','000651','002233','002060','002352','002511'
                 ,'002303','002461','600872','600332','000513','000028']
    first_data,first_close = first_cycle_csv()
    first_close_df=pd.Series(data=first_close,index=size_code)
    data1 = pd.Series(data=first_data,index=size_code)
    data2 =data1.rank(method='average',ascending=False).sort_values()
    data3 = data2[0:11]
    data_x = first_close_df.loc[data3.index]
    print(data_x)

    return data_x


def first_cycle_csv():
    """
    first_data:用于存储利益数据
    path:用于地址(有循环)
    cut-up:读取data的前2-4条数据
    close:最后一天闭市的数据
    open:最初开始的数据
    """
    first_data = []
    first_close = []
    for i in range(1,31):
        path = './data_process/code_data/'+str(i)+'.csv'
        data1 = pd.read_csv(path,sep=',')
        cut_up = data1.iloc[1:4]
        open = cut_up.iloc[0,2]
        close = cut_up.iloc[2,5]
        profit  = close - open
        first_data.append(profit)
        first_close.append(close)
    return first_data,first_close

Obtenga datos semanales sobre las 10 principales acciones:

def cycle_csv(a):
    '''
    param:  a是切片开始日期
    '''
    date_data=shuzu().dt.date
    power=[]
    state = ['open','close','code']
    open_data=[]
    for i in range(1,31):
        list_data2 = []
        list2_data1=[]
        path = './data_process/code_data/'+str(i)+'.csv'
        data1 = pd.read_csv(path,sep=',')
        data1.set_index(['date'],inplace=True)
        data2 = date_data[a:a+7]
        for j in data2:
            j = str(j)
            list_data2.append(j)
        for k in data1.index:
            k= str(k)
            if k in list_data2:
                list2_data1.append(k)
            else:
                continue
        data_x =data1.loc[list2_data1,state]
        open = data_x.iloc[0,0]
        close = data_x.iloc[len(data_x.index)-1,1]
        power_data= close - open
        power.append(power_data)
        open_data.append(open)
        
    '''
    size_code:30支股票的编号
    first_data:存取读取30支股票的利润
    data1:将其股票编号和利润变成一维数组
    data2:将其股票利润排序
    data3:选取前十支股票
    ''' 
    size_code = ['002027','300014','002475','000636','002449','600183','000049','002138'
                 ,'300115','600325','000069','600383','600048','001914','601318','600323'
                 ,'002152','000921','002035','000651','002233','002060','002352','002511'
                 ,'002303','002461','600872','600332','000513','000028']
    data_1 = pd.Series(data=power,index=size_code)
    data_2 =data_1.rank(method='average',ascending=False).sort_values()
    data_3 = data_2[0:10]
    open_data2=pd.Series(data=open_data,index=size_code)
    # print(open_data2)
    # print(data_3)
    return  data_3,open_data2

Calcular tasa de interés:

def interest_rate(a,principal,front_stock):
    '''
    param:
    a是切片日期
    principal是设置的本金
    front_stock是上周的10支强势股票
    '''
    if a > 3584:
        stockwinner, stockopen30 = cycle_csv(a)
        opendata = stockopen30.loc[front_stock.index]

    else:
        stockwinner, stockopen30 = cycle_csv(a)
        stockwinner2, stockopen30_2 = cycle_csv(a + 7)
        opendata = stockopen30.loc[front_stock.index]
        opendata1 = stockopen30_2.loc[front_stock.index]
        # print(opendata)
        # print(opendata1)
        powerdata = []  # 用于保存利益
        pricedata = []  # 用于保存购入价格
        for i in range(10):
            stocnum = int((principal / 10) / opendata[i])
            # print(stocnum)
            power = (opendata1[i] - opendata[i]) * stocnum
            price = (stocnum * opendata[i]) - (stocnum * opendata[i]) * (0.000025)
            powerdata.append(power)
            pricedata.append(price)
        # allprice.append(sum(pricedata))
        # allpower.append(sum(powerdata))

    Interest = (sum(powerdata) / sum(pricedata)) * 100
    # print(Interest)

    return Interest


 

        

Supongo que te gusta

Origin blog.csdn.net/weixin_52135595/article/details/127494284
Recomendado
Clasificación