In [20]:
import pandas as pd
import numpy as np
from biglearning.module2.common.data import Outputs
from zipline.finance.commission import PerOrder

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')
import dai
In [21]:
sd = '2015-01-01'
ed = '2023-09-01'
In [22]:
datasource_id = "hf_alpha_fzzq"


df = dai.query(f"SELECT * FROM {datasource_id}", filters={"date": [sd,ed]}).df()

df = df[['date','instrument','alpha_91007']]
In [23]:
df
Out[23]:
date instrument alpha_91007
0 2015-05-04 002161.SZ NaN
1 2015-05-04 002362.SZ 0.186593
2 2015-05-04 600063.SH -1.335004
3 2015-05-04 002488.SZ 1.769237
4 2015-05-04 002728.SZ 0.252983
... ... ... ...
7812599 2021-02-19 603010.SH 0.675486
7812600 2021-03-10 688658.SH -0.779346
7812601 2021-03-10 603985.SH -0.920916
7812602 2021-02-19 601512.SH -0.634911
7812603 2021-02-19 300947.SZ 15.287934

7812604 rows × 3 columns

In [24]:
df['ins'] = df['instrument']
df
Out[24]:
date instrument alpha_91007 ins
0 2015-05-04 002161.SZ NaN 002161.SZ
1 2015-05-04 002362.SZ 0.186593 002362.SZ
2 2015-05-04 600063.SH -1.335004 600063.SH
3 2015-05-04 002488.SZ 1.769237 002488.SZ
4 2015-05-04 002728.SZ 0.252983 002728.SZ
... ... ... ... ...
7812599 2021-02-19 603010.SH 0.675486 603010.SH
7812600 2021-03-10 688658.SH -0.779346 688658.SH
7812601 2021-03-10 603985.SH -0.920916 603985.SH
7812602 2021-02-19 601512.SH -0.634911 601512.SH
7812603 2021-02-19 300947.SZ 15.287934 300947.SZ

7812604 rows × 4 columns

获取指数代码 。通过指数代码获得指数权重

In [25]:
test = dai.query(f"SELECT * FROM cn_stock_index_info ", filters={"date": [sd,ed]}).df()
test
Out[25]:
instrument name market base_time base_point list_date delist_date weight_method publisher
0 000001.SH 上证指数 上海交易所 1990-12-19 100 1991-07-15 NaT 中证指数有限公司
1 000016.SH 上证50指数 上海交易所 2003-12-31 1000 2004-01-02 NaT 中证指数有限公司
2 000300.SH 沪深300指数 上海交易所 2004-12-31 1000 2005-04-18 NaT 中证指数有限公司
3 000688.SH 科创50指数 上海交易所 2019-12-31 1000 2020-07-23 NaT 中证指数有限公司
4 000852.SH 中证1000指数 上海交易所 2004-12-31 1000 2014-10-17 NaT 中证指数有限公司
5 000903.SH 中证100指数 上海交易所 2005-12-30 1000 2006-05-29 NaT 中证指数有限公司
6 000905.SH 中证500指数 上海交易所 2004-12-31 1000 2007-01-15 NaT 中证指数有限公司
7 399001.SZ 深证成指 深圳交易所 1994-07-20 1000 1995-01-23 NaT 深圳证券交易所
8 399006.SZ 创业板指 深圳交易所 2010-05-31 1000 2010-06-01 NaT 深圳证券交易所
9 399330.SZ 深证100 深圳交易所 2002-12-31 1000 2006-01-24 NaT 深圳证券交易所
10 899050.BJ 北证50成份指数 北京交易所 2022-04-29 1000 2022-11-21 NaT 北京证券交易所
In [26]:
test[test.name.str.contains('中证500')]
Out[26]:
instrument name market base_time base_point list_date delist_date weight_method publisher
6 000905.SH 中证500指数 上海交易所 2004-12-31 1000 2007-01-15 NaT 中证指数有限公司
In [27]:
df_w = dai.query("""
    SELECT *
    FROM cn_stock_index_weight
    WHERE date > '2015-01-01'
    AND instrument = '000905.SH';
""").df()

df_w = df_w.rename(columns={
    'member_code': 'ins',
    'instrument':'index_code'
    })
df_w
Out[27]:
date index_code name ins member_name weight
0 2015-01-05 000905.SH 中证500指数 000006.SZ 深振业A 0.00240
1 2015-01-05 000905.SH 中证500指数 000012.SZ 南玻A 0.00420
2 2015-01-05 000905.SH 中证500指数 000021.SZ 深科技 0.00150
3 2015-01-05 000905.SH 中证500指数 000028.SZ 国药一致 0.00210
4 2015-01-05 000905.SH 中证500指数 000030.SZ 富奥股份 0.00110
... ... ... ... ... ... ...
1059995 2023-09-15 000905.SH 中证500 688777.SH 中控技术 0.00366
1059996 2023-09-15 000905.SH 中证500 688778.SH 厦钨新能 0.00105
1059997 2023-09-15 000905.SH 中证500 688779.SH 长远锂科 0.00140
1059998 2023-09-15 000905.SH 中证500 688819.SH 天能股份 0.00074
1059999 2023-09-15 000905.SH 中证500 689009.SH 九号公司 0.00221

1060000 rows × 6 columns

In [28]:
df
Out[28]:
date instrument alpha_91007 ins
0 2015-05-04 002161.SZ NaN 002161.SZ
1 2015-05-04 002362.SZ 0.186593 002362.SZ
2 2015-05-04 600063.SH -1.335004 600063.SH
3 2015-05-04 002488.SZ 1.769237 002488.SZ
4 2015-05-04 002728.SZ 0.252983 002728.SZ
... ... ... ... ...
7812599 2021-02-19 603010.SH 0.675486 603010.SH
7812600 2021-03-10 688658.SH -0.779346 688658.SH
7812601 2021-03-10 603985.SH -0.920916 603985.SH
7812602 2021-02-19 601512.SH -0.634911 601512.SH
7812603 2021-02-19 300947.SZ 15.287934 300947.SZ

7812604 rows × 4 columns

数据合并

In [29]:
df = pd.merge(df_w,df,left_on=['date','ins'],right_on=['date','ins'],how='left')
df.dropna(subset=['instrument'],inplace=True)
df = df[df.date >= '2016-01-01']
df
Out[29]:
date index_code name ins member_name weight instrument alpha_91007
122000 2016-01-04 000905.SH 中证500指数 000006.SZ 深振业A 0.00251 000006.SZ -1.043030
122001 2016-01-04 000905.SH 中证500指数 000012.SZ 南玻A 0.00324 000012.SZ 2.110993
122002 2016-01-04 000905.SH 中证500指数 000021.SZ 深科技 0.00205 000021.SZ -0.455811
122003 2016-01-04 000905.SH 中证500指数 000028.SZ 国药一致 0.00188 000028.SZ NaN
122004 2016-01-04 000905.SH 中证500指数 000030.SZ 富奥股份 0.00119 000030.SZ -0.015295
... ... ... ... ... ... ... ... ...
1054495 2023-07-31 000905.SH 中证500 688777.SH 中控技术 0.00436 688777.SH -0.888637
1054496 2023-07-31 000905.SH 中证500 688778.SH 厦钨新能 0.00123 688778.SH -0.976942
1054497 2023-07-31 000905.SH 中证500 688779.SH 长远锂科 0.00160 688779.SH -1.077042
1054498 2023-07-31 000905.SH 中证500 688819.SH 天能股份 0.00074 688819.SH 0.588246
1054499 2023-07-31 000905.SH 中证500 689009.SH 九号公司 0.00233 689009.SH -0.873149

930956 rows × 8 columns

In [30]:
df['instrument'] = df['instrument'].apply(lambda x: x+'A')
df
Out[30]:
date index_code name ins member_name weight instrument alpha_91007
122000 2016-01-04 000905.SH 中证500指数 000006.SZ 深振业A 0.00251 000006.SZA -1.043030
122001 2016-01-04 000905.SH 中证500指数 000012.SZ 南玻A 0.00324 000012.SZA 2.110993
122002 2016-01-04 000905.SH 中证500指数 000021.SZ 深科技 0.00205 000021.SZA -0.455811
122003 2016-01-04 000905.SH 中证500指数 000028.SZ 国药一致 0.00188 000028.SZA NaN
122004 2016-01-04 000905.SH 中证500指数 000030.SZ 富奥股份 0.00119 000030.SZA -0.015295
... ... ... ... ... ... ... ... ...
1054495 2023-07-31 000905.SH 中证500 688777.SH 中控技术 0.00436 688777.SHA -0.888637
1054496 2023-07-31 000905.SH 中证500 688778.SH 厦钨新能 0.00123 688778.SHA -0.976942
1054497 2023-07-31 000905.SH 中证500 688779.SH 长远锂科 0.00160 688779.SHA -1.077042
1054498 2023-07-31 000905.SH 中证500 688819.SH 天能股份 0.00074 688819.SHA 0.588246
1054499 2023-07-31 000905.SH 中证500 689009.SH 九号公司 0.00233 689009.SHA -0.873149

930956 rows × 8 columns

In [31]:
df.sort_values(by='date',inplace=True)
sd_ = np.str(df.date.unique()[0])
ed_ = np.str(df.date.unique()[-1])


m1 = M.instruments.v2(
    start_date=sd_,
    end_date=ed_,
    market='CN_STOCK_A',
    instrument_list='',
    max_count=0
)


df = DataSource.write_df(df)
In [32]:
# 交易引擎:初始化函数,只执行一次
def m4_initialize_bigquant_run(context):

    context.ranker_prediction = context.options['data'].read_df()
    context.ranker_prediction.set_index('date',inplace=True)
    


# 交易引擎:每个单位时间开盘前调用一次。
def m4_before_trading_start_bigquant_run(context, data):
    # 盘前处理,订阅行情等
    #context.subscribe_bar(context.instruments,'1m')
    pass

# 交易引擎:tick数据处理函数,每个tick执行一次
def m4_handle_tick_bigquant_run(context, tick):
    pass

def handle_bar(context, bar):
    pass


# 交易引擎:bar数据处理函数,每个时间单位执行一次
def m4_handle_data_bigquant_run(context,data):


    remainder = context.trading_day_index % 2
    #如果没到调仓期直接结束运行
    if remainder !=0:
        return



    import datetime
    #初始化
    buy_list = []  #买入列表
    sell_list = [] #卖出列表
    
    #==================== 数据准备
    today = data.current_dt.strftime('%Y-%m-%d')
    time = data.current_dt

    account_pos = context.get_account_positions()
    holding_list = list({key: value for key, value in account_pos.items() if value.avail_qty > 0}.keys())
    holding_num = len(holding_list)

    #读取当日数据
    try:
        today_data  = context.ranker_prediction.loc[today,:]
        today_data.reset_index(inplace=True)
    except:
        return

    today_data.dropna(inplace=True)
    today_data.sort_values(by='alpha_91007',ascending = True , inplace=True)



    
    #构建买入列表
    target_list = today_data.instrument.to_list()[:50] #选股
    weight_list = today_data.weight.to_list()[:50] #权重列表
    weight_sum = today_data.iloc[:50].weight.sum()
    mul = 1/weight_sum  #权重倍数


    #构建卖出列表
    for ins in holding_list:
        if ins not in target_list:
            sell_list.append(ins)

    #构建买入列表
    for ins in target_list:
        if ins not in holding_list:
            buy_list.append(ins)
            
    for ins in sell_list:
        context.order_target(ins,0)


    for ins in buy_list:
        idx = target_list.index(ins)
        weight_ = weight_list[idx] #按权重 * 倍数 买入
        weight_ = weight_ * mul
        if weight_ >= 0.04:
            weight_ = 0.04
        context.order_target_percent(ins, weight_)


    

# 交易引擎:成交回报处理函数,每个成交发生时执行一次
def m4_handle_trade_bigquant_run(context, trade):
    pass

# 交易引擎:委托回报处理函数,每个委托变化时执行一次
def m4_handle_order_bigquant_run(context, order):
    pass

# 交易引擎:盘后处理函数,每日盘后执行一次
def m4_after_trading_bigquant_run(context, data):
    pass
In [33]:
trade = M.hftrade.v2(
    instruments=m1.data,
    options_data=df,
    start_date='',
    end_date='',
    initialize=m4_initialize_bigquant_run,
    before_trading_start=m4_before_trading_start_bigquant_run,
    handle_tick=m4_handle_tick_bigquant_run,
    handle_data=m4_handle_data_bigquant_run,
    handle_trade=m4_handle_trade_bigquant_run,
    handle_order=m4_handle_order_bigquant_run,
    after_trading=m4_after_trading_bigquant_run,
    capital_base=100000000,
    frequency='daily',
    price_type='真实价格',
    product_type='股票',
    before_start_days='0',
    volume_limit=0,
    order_price_field_buy='close',
    order_price_field_sell='open',
    benchmark='000852.HIX',
    plot_charts=True,
    disable_cache=True,
    replay_bdb=False,
    show_debug_info=False,
    backtest_only=False
)
  • 收益率55.14%
  • 年化收益率5.86%
  • 基准收益率-37.04%
  • 阿尔法0.1
  • 贝塔0.7
  • 夏普比率0.25
  • 胜率0.5
  • 盈亏比1.22
  • 收益波动率18.67%
  • 信息比率0.06
  • 最大回撤34.81%
日期 时间 股票代码 股票名称 买/卖 数量 成交价 总成本 交易佣金
Loading... (need help?)
日期 标的代码 标的名称 持仓均价 收盘价 数量 持仓价值 收益
Loading... (need help?)
时间 级别 内容
Loading... (need help?)