复制链接
克隆策略
In [19]:
import pandas as pd
import numpy as np
from biglearning.module2.common.data import Outputs
from zipline.finance.commission import PerOrder
import os
from bigdatasource.api import DataSource
from biglearning.api import M
from biglearning.api import tools as T
from biglearning.module2.common.data import Outputs

import warnings
warnings.filterwarnings('ignore')


from joblib import Parallel, delayed
2023-05-10 21:33:03,649	WARNING dataclient.py:402 -- Failed to reconnect the data channel
In [2]:
sd = '2022-01-01'
ed = '2023-05-09'
In [3]:
df = DataSource('bar1m_CN_STOCK_A').read(start_date=sd,end_date=ed,instruments=['002362.SZA'])

3.1 “潮汐”的定义 我们观察个股分钟频成交量的高点与低点来定义“涨潮”与“退潮”, 具体如下: 1)剔除开盘和收盘数据,仅考虑日内分钟频数据,为了减小个别异 常点的影响,我们首先计算个股每分钟的成交量及其前后 4 分钟成交 量的总和(共 9 分钟),作为该分钟“邻域成交量”。 2)假设“邻域成交量”最高点发生在第 t 分钟,这一分钟称为“顶峰 时刻”。 3)第 5~t-1 分钟里,“邻域成交量”最低点发生在第 m 分钟,这一点 的邻域成交量为 Vm,收盘价为 Cm,这一分钟称为“涨潮时刻”,从 “涨潮时刻”到“顶峰时刻”的过程记为“涨潮”。 4)第 t+1~233 分钟里,”邻域成交量“最低点发生在第 n 分钟里,这 一点的邻域成交量为 Vn,收盘价为 Cn,这一分钟称为“退潮时刻”, 从“顶峰时刻”到“退潮时刻”的过程记为“退潮”。 5)从“涨潮时刻”到“退潮时刻”的全过程记为一次“潮汐”。

3.2 “潮汐”过程的价格变动速率 我们首先来考察“潮汐”过程的价格变动速率,进而构造“全潮汐” 因子,具体过程如下: 1)如上述定义,我们记“涨潮时刻”发生在第 m 分钟,收盘价为 Cm; “退潮时刻”发生在第 n 分钟,收盘价为 Cn。 2)则全部“潮汐”过程的价格变化率为(Cn-Cm)/Cm。 金融工程报告 7 敬请关注文后特别声明与免责条款 3)进而全“潮汐”过程的价格变动速率为(Cn-Cm)/Cm/(n-m),我们 将此作为每日投资者出售或购买股票意愿强烈程度的代理变量。 4)我们计算最近 20 个交易日的价格变动速率的平均值,记为“全潮 汐”因子。 接下来我们将对上述构建的“全潮汐”因子进行单因子测试,我们在 全 A 样本中按照月度频率进行测试,测试中对因子进行市值和行业正 交化处理,测试区间为 2013 年 4 月至 2022 年 2 月(下同)。因子表 现如下所示。

In [4]:
df = df.head(240)
In [5]:
df.reset_index(inplace=True,drop=True)
In [6]:
df = DataSource('bar1m_CN_STOCK_A').read(start_date=sd,end_date=ed,instruments=['002362.SZA'])
df = df.head(240)
In [10]:
df['day'] = df['date'].dt.to_period('D')
In [11]:
df
Out[11]:
instrument date open close low high amount volume 邻域 vm cm vn cn nm factor day
0 002362.SZA 2022-01-04 09:35:00 17.670000 17.730000 17.650000 17.730000 1862097.0 105400 2234202.0 883802 17.940001 4800 17.889999 107 -0.000026 2022-01-04
1 002362.SZA 2022-01-04 09:36:00 17.709999 17.889999 17.709999 17.889999 2150419.0 120600 1435300.0 883802 17.940001 4800 17.889999 107 -0.000026 2022-01-04
2 002362.SZA 2022-01-04 09:37:00 17.879999 17.930000 17.879999 17.930000 3726458.0 208300 1516783.0 883802 17.940001 4800 17.889999 107 -0.000026 2022-01-04
3 002362.SZA 2022-01-04 09:38:00 17.930000 18.000000 17.910000 18.000000 3662693.0 203800 1524383.0 883802 17.940001 4800 17.889999 107 -0.000026 2022-01-04
4 002362.SZA 2022-01-04 09:39:00 18.000000 18.000000 18.000000 18.040001 2977605.0 165300 1395183.0 883802 17.940001 4800 17.889999 107 -0.000026 2022-01-04
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
227 002362.SZA 2022-01-04 14:52:00 17.930000 17.930000 17.910000 17.940001 509059.0 28400 414500.0 883802 17.940001 4800 17.889999 107 -0.000026 2022-01-04
228 002362.SZA 2022-01-04 14:53:00 17.930000 17.940001 17.920000 17.940001 503844.0 28100 446300.0 883802 17.940001 4800 17.889999 107 -0.000026 2022-01-04
229 002362.SZA 2022-01-04 14:54:00 17.950001 17.959999 17.950001 17.980000 1011225.0 56300 430800.0 883802 17.940001 4800 17.889999 107 -0.000026 2022-01-04
230 002362.SZA 2022-01-04 14:55:00 17.950001 17.940001 17.940001 17.959999 1269131.0 70700 345100.0 883802 17.940001 4800 17.889999 107 -0.000026 2022-01-04
231 002362.SZA 2022-01-04 14:56:00 17.930000 17.920000 17.920000 17.950001 1007723.0 56200 604900.0 883802 17.940001 4800 17.889999 107 -0.000026 2022-01-04

232 rows × 16 columns

In [17]:
def calc_data(instrument,sd,ed):
    import warnings
    warnings.filterwarnings('ignore')

    df = DataSource('bar1m_CN_STOCK_A').read(start_date=sd,end_date=ed,instruments = instrument)
    df_ = df.copy()
    df_['day'] = df_['date'].dt.to_period('D')

    def calc_one_day(df):
        df.reset_index(inplace=True,drop=True)

        vs = df.loc[0,'volume']
        cs = df.loc[0,'close']
        s = 0 
        df['邻域'] = df['volume']  +df['volume'].shift()+df['volume'].shift(2)+df['volume'].shift(3)+df['volume'].shift(4)+df['volume'].shift(-1)+df['volume'].shift(-2)+df['volume'].shift(-3)+df['volume'].shift(-4)

        df.dropna(inplace=True)
        df.reset_index(inplace=True,drop=True)
        idxmax = df['邻域'].idxmax()  #顶峰

        if idxmax != 0:
            df_1 = df.loc[:idxmax]
            df_2 = df.loc[idxmax:]

            idxmin_m = df_1['邻域'].idxmin()
            idxmin_n = df_2['邻域'].idxmin()

            
            vm = df.loc[idxmin_m,'volume']
            cm = df.loc[idxmin_m,'close']
            vn = df.loc[idxmin_n,'volume']
            cn = df.loc[idxmin_n,'close']

            df['vm'] = vm
            df['cm'] = cm
            df['vn'] = vn
            df['cn'] = cn
            df['nm'] = idxmin_n - idxmin_m
            
        else:
            idxmin = df['邻域'].idxmin()
            
            
            vn = df.loc[idxmin,'volume']
            cn = df.loc[idxmin,'close']
            
            df['vm'] = vs
            df['cm'] = cs
            df['vn'] = vn
            df['cn'] = cn
            df['nm'] = idxmin

        df['factor']  = (df['cn'] - df['cm'])/df['cm']/df['nm']
        return df

    df_ = df_.groupby('day').apply(calc_one_day)

    return df_
In [15]:
tmp = DataSource('bar1d_CN_STOCK_A').read(start_date=sd,end_date=ed)
ins_list = tmp.instrument.unique()
In [ ]:
results = Parallel(n_jobs=32)(delayed(calc_data)(ins,sd,ed) for ins in ins_list)
df = pd.concat(results)
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]: