用户登录/注册:登录/注册
CTQuant开发平台是一款高性能本地化AI策略及传统策略快速开发平台,
提供丰富的数据及处理模块,开放的AI训练模型,开发者可以快速搭建诸如XGBoost、CNN等机器学习和深度学习的模型进行训练。 强大的因子计算公式能够快速计算相关因子,强大的数据处理模块能快速处理因子值,使其适应各个AI模型。
基础数据 依托于CTQuant_DATA基础数据,生成适用AI策略的基础数据,并提供每日的基础数据更新。
预计算因子 基于基础数据,配置一批预计算因子,提供给开发者快速构建因子表达式的基础因子数据。
因子表达式 强大的因子表达式模块,更具因子计算表达式,能够快速抽取复杂因子。
数据处理 根据一般机器学习、深度学习所需使用的数据,快速处理因子数据,包括缺失值处理、去极值、标准化。
训练模型 提供丰富的模型接口,开发者可以使用系统自带的构建好的经典模型,亦可以使用本地的模型模块进行AI训练调优。
仿真模拟环境 依托与Backtrader的回测模拟框架进行二次开发,适用于AI训练模型以后的数据预测及在线模拟,强大的数据分析功能提供给开发者进行更好的模型参数调优。
联系客服领取更多福利。
本平台使用了机器学习、深度学习的框架,当然也支持传统策略。用户可以根据自己的需求,使用本地的机器学习模型、深度学习模型来进行训练预测。本平台集成了一些基础的样例,仅供参考学习。
x# 1.过滤出上市天数大于60天的股票
# 2.a股过滤,只选择上证、深证、创业板,过滤st、*st、停牌的股票。
# 3.过滤条件:5日平均价穿过10日平均价
# 4.筛选5日收益排名前5的票作为持仓
# 5.股票持仓2天,即第一天开盘买,第二天收盘卖(日频)
# 引用开发包M,G
from CTQuantPlatform import M
from CTQuantPlatform.G import G
#定义参数
par = {
# 定义所使用的因子,这里使用5日、10日的收盘价均线的相关因子
'features': [
# 5日收益率因子
'factor1=return_5',
# 这里表达式表示 昨日的MA5<MA10,今日的MA5>MA10,满足条件则为1,否则为0,用来做筛选
'buy_cond_1=where((shift(mean(close_0,5),1)<shift(mean(close_0,10),1))&(mean(close_0,5)>mean(close_0,10)),1,0)',
# 筛选条件2,选取上市天数>60天的股票
'buy_cond_2=where(list_days_0>60,1,0)'
],
# 因子计算需要向前抽取天数
'shift_days': 30,
# 过滤条件
'stock_filter_cond': 'buy_cond_1==1&buy_cond_2==1',
# 交易日期
'trade_date_start': '20150101',
'trade_date_end': '20151231',
}
# 因子模块
features_block = M.input_features(None, par['features'])
#交易日期模块
trade_date_block = M.trade_date(par['trade_date_start'], par['trade_date_end'])
#基础特征因子抽取
g_features_block = M.general_feature_extractor(feature_list_input=features_block.get_data(),
input_Date=trade_date_block.get_data(),
shift_days=par['shift_days'])
# 衍生特征抽取
d_features_block = M.derived_feature_extractor(input_data=g_features_block.get_data(),
input_feature_list=features_block.get_data_1(),
input_Date=trade_date_block.get_data(),
remove_extra_columns=True)
# 数据过滤
filter_block = M.filter(d_features_block.get_data(), par['stock_filter_cond'])
# A股过滤,选择上证、深证、创业板
astock_filter_block = M.a_stock_filter(input_data=filter_block.get_data(), board_cond=[1, 2, 3],
st_cond=[0])
trade_data_result = astock_filter_block
# 交易执行代码
def test_trade_execute():
#获取当天交易日期
now = G.trading_day
#这里是自定义的一个参数,用来定义买几支股票
stock_count = G.params['stock_count']
# 这里获取需要操作的当天的股票数据
prediction_data = G.prediction_data[G.prediction_data['date'] == now]
# 这里按照factor1=return_5列进行降序排列
prediction_data = prediction_data.sort_values(by=['factor1'], ascending=False).reset_index(drop=True)
# 然后获取前stock_count的股票进行操作
stocks = prediction_data['instrument'].head(stock_count)
# 可能不一定实际有stock_count支票,所以这里获取下实际的个数,用来计算资金分配
real_stock_count = len(stocks)
# 总资产
total_cash = G.total_assets
# 可用资金
available_cash = G.available_cash
# 这里是自定义的计算可以用来世界买的可用资金,用户可以设定自己的逻辑
available_cash = available_cash if available_cash < total_cash / 2 else total_cash / 2
#G.trade_engine.order_value(stock,hold_num)此方法用于买入卖出股票。
#stock:股票代码,hold_num:股票数量,大于等于0的整数
#若未持仓,则是买入hold_num手
#若已持仓,则会将持仓数量变为hold_num。(hold_num>持仓,则补仓,即买入;反正即卖出;为0则是平仓)
# 买入股票
for stock_name in stocks:
temp_cash = available_cash / real_stock_count
G.trade_engine.order_value(stock_name, temp_cash)
# 由于设定的第一天买,第二天卖,所以这里会卖出持有的票。具体持仓几天可以自己去定义逻辑。
# 卖出持仓股票 G.position为当前持仓
for _p in G.positions:
if G.positions[_p].hold_num > 0:
G.trade_engine.order_target(_p, 0)
# 交易模块
trade_result = M.ct_trader(
name='test_strategy',
# 初始资金50W,持仓5支票
params={"cash": 500000, "stock_count": 5},
trade_date_block=trade_date_block.get_data(),
trade_prediction_data=trade_data_result.get_data(),
executeFunc=test_trade_execute)
xxxxxxxxxx
"""
AI模型需要大量的基础数据作为训练,然后生成训练后的模型。可以根据模型训练的指标(loss)查看模型拟合的结果。再用此模型去预测一批数据检验交过。
一般的AI策略包括以下几个模块:
1.股票筛选
2.数据过滤
3.数据处理(缺失值处理、去极值、标准化、中性化等)
4.模型训练(一般训练数据量达到1W+条记录)
5.模型预测
6.策略回测/模拟
"""
# 1.过滤出上市天数大于60天的股票
# 2.a股过滤,只选择上证、深证、创业板,过滤st、*st、停牌的股票。
# 3.过滤条件:5日平均价穿过10日平均价
# 4.使用CNN模型预测的pred_label排名前5的票作为持仓
# 5.股票持仓2天,即第一天开盘买,第二天收盘卖(日频)
#引用开发包M,G
from CTQuantPlatform import M
from CTQuantPlatform.G import G
par={
'xl_start_date': '20130101',
'xl_end_date': '20181231',
# 这里的因子用来过滤、检验等,不参与训练
'filter_features': [
'buy_cond_1=where((shift(mean(close_0,5),1)<shift(mean(close_0,10),1))&(mean(close_0,5)>mean(close_0,10)),1,0)',
# 这里几个因子可以用来验证训练、预测的效果如何
'y=shift(close_0,-2)/shift(open_0,-1)',
'return_2_day=(shift(close_0, -2)-shift(open_0, -1))/shift(open_0, -1)',
'temp_list_days=list_days_0'
],
'shift_days': 130,
'stock_filter_list_days_cond': 'list_days_0>60',
'stock_filter_cond': 'buy_cond_1==1',
'label_expr': 'shift(close_0,-2)/shift(open_0, -1)',
'features': [
# 这里用几个因子来训练
'factor_1=return_5',
'factor_2=rank_return_10/rank_return_30',
'factor_3=rank(rank(close_0 / close_1) / rank(close_0 / close_10))',
'factor_4=ta_sma(close_0,20)/close_0',
'factor_5=rank(close_0/ts_min(low_1,5))',
'factor_6=rank_swing_volatility_60_0',
'factor_7=turn_0/turn_5',
'alpha_101=((rank(decay_linear(delta((open_0+close_0+high_0+low_0)/4,4),7))+ts_rank(decay_linear(((((low_0*0.9)+(low_0*0.1))-(high_0+low_0+open_0+close_0)/4)/(open_0-((high_0+low_0)/2))),11),7))*-1)',
],
'yc_start_date': '20190101',
'yc_end_date': '20201231',
'stock_count':5
}
# 训练因子模块
features_block = M.input_features(None, par['features'])
# 过滤因子和训练因子叠加起来,先全部抽取、计算出来
filter_features_block = M.input_features(features_block.get_data(), par['filter_features'])
# 训练日期模块
xl_date_block = M.input_date(par['xl_start_date'], par['xl_end_date'])
# 基础特征抽取
xl_g_features_block = M.general_feature_extractor(feature_list_input=filter_features_block.get_data(),
input_Date=xl_date_block.get_data(),
shift_days=par['shift_days'])
# 第一次过滤,选取上市天数>60天的股票
xl_filter_block = M.filter(xl_g_features_block.get_data(), par['stock_filter_list_days_cond'])
# A股过滤,选取上证、深证、创业板,过滤st等不正常的股票
xl_afilter_block = M.a_stock_filter(input_data=xl_filter_block.get_data(), board_cond=[1, 2, 3],
st_cond=[0])
# 衍生特征抽取,计算各个因子的值
xl_d_features_block = M.derived_feature_extractor(input_data=xl_filter_block.get_data(),
input_feature_list=filter_features_block.get_data_1(),
input_Date=xl_date_block.get_data())
# 二次过滤,筛选MA5穿过MA10的票
xl_filter_2_block = M.filter(xl_d_features_block.get_data(), expr=par['stock_filter_cond'])
# 数据处理,缺失值填充、去极值、标准化
xl_data_process_rlt = M.data_process(xl_filter_2_block.get_data(), features_block.get_data())
# 抽取股票标注label,这里用的时shift(close_0,-2)/shift(open_0, -1) 表示第二天的收盘价/第一天的开盘价,即第一天开盘买入、第二天收盘卖出。
y_block = M.advanced_auto_labeler(xl_date_block.get_data(), label_expr=par['label_expr'])
# label值做标准化
y_stander_block = M.standardize(y_block.get_data(), standard_fun='Z_Score', columns=['label'])
# 数据连接,这里吧股票的因子值和label值连接起来
xl_data_join_block = M.data_join(xl_filter_2_block.get_data(), y_stander_block.get_data(), how='inner', is_use_cache=False)
# 去除nan值的数据,AI模型训练不能包含nan的数据
xl_data_dropna_block = M.data_dropna(xl_data_join_block.get_data(), filter_features_block.get_data_2().read())
xl_result_block = xl_data_dropna_block
# 这边开始构建预测的数据,预测数据和训练数据保持一致
# 预测时间模块
yc_date_block = M.trade_date(par['yc_start_date'], par['yc_end_date'])
# 预测数据基础特征
yc_g_features_block = M.general_feature_extractor(feature_list_input=filter_features_block.get_data(),
input_Date=yc_date_block.get_data(),
shift_days=par['shift_days'])
# 预测数据过滤,选取上市天数>60天的股票
yc_filter_1_block = M.filter(yc_g_features_block.get_data(), par['stock_filter_list_days_cond'])
yc_afilter_block = M.a_stock_filter(input_data=yc_filter_1_block.get_data(), board_cond=[1, 2, 3],st_cond=[0])
yc_d_features_block = M.derived_feature_extractor(input_data=yc_afilter_block.get_data(),
input_feature_list=filter_features_block.get_data_1(),
input_Date=yc_date_block.get_data())
yc_data_process_block = M.data_process(input_data_block=yc_d_features_block.get_data(),
feature_list_block=features_block.get_data(),
init_data=xl_data_process_rlt.get_data_2())
yc_filter_2_block = M.filter(yc_data_process_block.get_data(), expr=par['stock_filter_cond'])
yc_result_block = yc_filter_2_block
# 获取系统提供的默认CNN模型(训练以后的模型),这里使用的模型为tensorflow.keras.Model,用户可以自行构建深度学习的模型,然后再用训练数据训练
cnn_model_block = M.get_cnn_model_1(input_data=xl_result_block.get_data(),feature_keys=features_block.get_data_2())
# 使用模型预测
yc_cnn_pred_block = M.get_dp_predict(cnn_model_block.get_data(), yc_result_block.get_data(), features_block.get_data_2(),yc_date_block.get_data())
# 交易执行代码
def test_ai_model_trade_execute():
#获取当天交易日期
now = G.trading_day
#这里是我自定义的一个参数,用来定义买几支股票
stock_count = G.params['stock_count']
# 这里获取需要操作的当天的股票数据
prediction_data = G.prediction_data[G.prediction_data['date'] == now]
# 这里是要买入预测值最高的股票,所以先按照预测值pred_label列进行降序排列
prediction_data = prediction_data.sort_values(by=['pred_label'], ascending=False).reset_index(drop=True)
# 然后获取前stock_count的股票进行操作
stocks = prediction_data['instrument'].head(stock_count)
#可能不一定实际有stock_count支票,所以这里获取下实际的个数,用来计算资金分配
real_stock_count = len(stocks)
#这边开始计算资产用来实际交易
# G.total_assets为总资产
total_cash = G.total_assets
# G.available_cash为可用资金
available_cash = G.available_cash
# 这里是自定义的计算可以用来实际买入的可用资金,用户可以设定自己的逻辑或权重
available_cash = available_cash if available_cash < total_cash / 2 else total_cash / 2
#G.trade_engine.order_value(stock,hold_num)此方法用于买入卖出股票。
#stock:股票代码,hold_nu:股票数量,大于等于0的整数
#若未持仓,则是买入hold_num手
#若已持仓,则会将持仓数量变为hold_num。(hold_num>持仓,则补仓,即买入;反正即卖出;为0则是平仓)
# 买入股票
for stock_name in stocks:
temp_cash = available_cash / real_stock_count
G.trade_engine.order_value(stock_name, temp_cash)
# 由于设定的第一天买,第二天卖,所以这里会卖出持有的票。具体持仓几天可以自己去定义逻辑。
# 卖出持仓股票 G.position为当前持仓
for _p in G.positions:
if G.positions[_p].hold_num > 0:
G.trade_engine.order_target(_p, 0)
trade_result_block = M.ct_trader(
name='test_cnn_strategy',
params={"cash": 500000, "stock_count": par['stock_count']},
trade_date_block=yc_date_block.get_data(),
trade_prediction_data=yc_cnn_pred_block.get_data_1(),
executeFunc=test_ai_model_trade_execute)
# 这里时完整交易的结果,包括各类回测指标,可以自行打印查看。
print(trade_result_block)
下载开发包软件及数据。
下载地址:
下载后解压缩到磁盘,尽量避免使用C盘,以免遇到权限不足发生错误。
目录说明
文件夹名称 | 说明 |
---|---|
.venv | python开发环境及各类开发包 |
CTQuant_cache | 模块缓存文件 |
CTQuant_DATA | 数据文件(A股) |
CTQuant_imiate_dir | 策略模拟文件夹,存放py文件的策略 |
CTQuant_logs | 模块运行日志 |
dict | 存放的开发包文件 |
static | 回测web的js、css文件等 |
templates | 回测web |
config.ini | 配置文件 |
目前平台的开发系统基于windows,推荐windows 11 专业版。
平台使用python 3.9开发,所有引用的方法及包均在3.9版本下测试通过,可以直接使用开发包中的python安装文件进行安装(\CTQuant_client\dict文件夹下)。安装过程中必须要将python的路径添加到环境变量中。
安装完成后可以运行命令行程序:
xxxxxxxxxx
python --verion
检验python是否安装成功,并查看当前python的版本信息。
(1)在解压缩的文件中运行【初始化并启动.bat】文件,推荐使用管理员权限运行程序。运行需要下载所需的安装包
(2)用户注册。根据提示在打开的网站中注册用户。注册成功后登录网站,在右侧菜单【量化】-》【会员信息】里查看令牌信息,复制粘贴到之前运行的程序中。等待完成安装。
(3)程序运行完成后可以退出。再运行文件【启动服务.bat】,该服务提供数据更新、回测web查看、策略模拟等服务。建议将服务加入自启动保证数据每天自动更新。
程序加入自启动方法: (1)通过“启动”文件夹添加: 复制文件的快捷方式,如果软件没有快捷方式,可以找到主程序,点击鼠标右键,选择创建快捷方式。 按Windows徽标键 + R,键入“shell:startup”,然后选择“确定”打开“启动”文件夹。 将应用的快捷方式从文件位置复制并粘贴到“启动”文件夹中。 (2)通过“任务计划程序”添加: 找到要设置为自启动的程序的快捷方式。 在“任务计划程序”窗口中,依次展开左侧的“任务计划程序库”>“Microsoft”>“Windows”>“Startup”。 选择“创建基本任务”,输入任务名称和描述,选择触发器类型(如“当计算机启动时”),然后选择“启动程序”,浏览并选择刚刚创建的程序快捷方式,确认设置无误后,点击“完成”。
建议使用pycharm的开发环境。vs code等其他环境同样可以运行。同时支持py、juypter notebook形式的开发。
强烈建议启动开发环境时使用管理员权限运行,避免一些文件读写的权限问题。
若项目创建在C盘,建议启动开发环境请右击,选择以管理员方式运行。即使放在其他盘,也建议使用管理员权限运行,避免文件读写的权限问题。
pycham,新建python项目,并且配置环境到开发包中的python环境,路径为:【本地存放路径】\CTQuant_client.venv\Scripts\python.exe。
vs code 新建python项目,需要配置开发包中的python环境即可。
至此环境配置及项目创建成功。
基于基础数据和因子库,CTQuant让我们可以无需代码,快速构建因子。
CTQuant表达式计算引擎,通过编写简单的表达式,就可以对数据做任何运算,而无需编写代码。
通过表达式,实现数据处理和计算。例如:
xxxxxxxxxx
factor1 = rank(rank(close_0 / close_1) / rank(close_0 / close_10))
alpha_101 = ((rank(decay_linear(delta((open_0+close_0+high_0+low_0)/4,4),7))+ts_rank(decay_linear(((((low_0*0.9)+(low_0*0.1))-(high_0+low_0+open_0+close_0)/4)/(open_0-((high_0+low_0)/2))),11),7))*-1)
平台目前已支持一批基础因子数据,用户可以用来构建因子表达式。通过基础特征抽取可以自动识别并抽取基础因子。
绝大部分参数均可自定义,末尾(_*)表示去第几天的值,例如(close_0) 代表当天的收盘价,(close_1)代表过去1天的值,以此类推。
部分因子中间包含X的值可以自取,可以参照一般所用到的数值。例如(ta_adx_X_*),使用(ta_adx_14_1)表示过去一天adx指标参数日期取14天的值。
字段 | 字段类型 | 字段描述 |
---|---|---|
adjust_factor_* | float32 | 第前 * 个交易日的复权因子 *取值: 0 .. 9999 |
amount_* | float32 | 第前 * 个交易日的交易额 * 取值: 0 .. 9999 |
avg_amount_* | float32 | 过去 * 个交易日的平均交易额 * 取值: 0 .. 9999 |
avg_price_* | float32 | 过去 * 个交易日的平均价格(=amount/volume*adjust_factor) * 取值: 0 .. 9999 |
close_* | float32 | 第前 * 个交易日的收盘价 * 取值: 0 .. 9999 |
daily_return_* | float32 | 第前 * 个交易日的收益,=close*i / close*(i+1) * 取值: 0 ..9999 |
deal_number_* | int32 | 第前 * 个交易日的成交笔数 * 取值: 0 .. 9999 |
high_* | float32 | 第前 * 个交易日的最高价 * 取值: 0 .. 9999 |
low_* | float32 | 第前 * 个交易日的最低价 * 取值: 0 .. 9999 |
open_* | float32 | 第前 * 个交易日的开盘价 * 取值: 0 .. 9999 |
price_limit_status_* | float32 | 股价在收盘时的涨跌停状态:1表示跌停,2表示未涨跌停,3则表示涨停 * 取值: 0 .. 9999 |
rank_amount_* | float32 | 第前 * 个交易日的交易额百分比排名 * 取值: 0 .. 9999 |
rank_avg_amount_* | float32 | 过去 * 个交易日的平均交易额,百分比排名 * 取值: 0 .. 9999 |
rank_return_* | float32 | 过去 * 个交易日的收益排名 * 取值: 0 .. 9999 |
return_* | float32 | 过去 * 个交易日的收益, =close_0/close_(* +1),eg :return_0 = close_0 / close_1,return_5 = close_0 / close_6 * 取值: 0 .. 9999 |
volume_* | int64 | 第前 * 个交易日的交易量 * 取值: 0 .. 9999 |
字段 | 字段类型 | 字段描述 |
---|---|---|
avg_turn_* | float32 | 过去 * 个交易日的平均换手率 * 取值: 0 .. 9999 |
rank_avg_turn_* | float32 | 过去 * 个交易日的平均换手率排名 * 取值: 0 .. 9999 |
rank_turn_* | float32 | 过去 * 个交易日的换手率排名 * 取值: 0 .. 9999 |
turn_* | float32 | 第前 * 个交易日的换手率 * 取值: 0 .. 9999 |
avg_turn_f_* | float32 | 过去 * 个交易日的平均换手率(流通股本计算) * 取值: 0 .. 9999 |
rank_avg_turn_f_* | float32 | 过去 * 个交易日的平均换手率排名(流通股本计算) * 取值: 0 .. 9999 |
rank_turn_f_* | float32 | 过去 * 个交易日的换手率排名(流通股本计算) * 取值: 0 .. 9999 |
turn_f_* | float32 | 第前 * 个交易日的换手率(流通股本计算) * 取值: 0 .. 9999 |
字段 | 字段类型 | 字段描述 |
---|---|---|
industry_sw_level1_0 | int32 | 申万一级行业类别 |
industry_sw_level2_0 | int32 | 申万二级行业类别 |
industry_sw_level3_0 | int32 | 申万三级行业类别 |
list_board_0 | float32 | 上市板,主板:1,中小企业板:2,创业板:3 |
list_days_0 | float32 | 已经上市的天数,按自然日计算 |
st_status_0 | float32 | ST状态:0:正常股票,1:ST,2:*ST,11:暂停上市 |
字段 | 字段类型 | 字段描述 |
---|---|---|
avg_mf_net_amount_* | float64 | 过去 * 个交易日平均净主动买入额 * 取值: 0 .. 9999 |
mf_net_amount_* | float32 | 第前 * 个交易日净主动买入额,= 买入金额 - 卖出金额 (包括超大单、大单、中单或小单) * 取值: 0 .. 9999 |
rank_avg_mf_net_amount_* | float32 | 过去 * 个交易日平均净主动买入额排名 * 取值: 1 .. 9999 |
rank_avg_mf_net_amount_0 | float32 | 过去0个交易日平均净主动买入额排名 |
字段 | 字段类型 | 字段描述 |
---|---|---|
market_cap_0 | float64 | 总市值 |
market_cap_float_0 | float64 | 流通市值 |
pb_lf_0 | float32 | 市净率 (LF) |
pe_lyr_0 | float32 | 市盈率 (LYR) |
pe_ttm_0 | float32 | 市盈率 (TTM) |
ps_ttm_0 | float32 | 市销率 (TTM) |
rank_market_cap_0 | float32 | 总市值,升序百分比排名 |
rank_market_cap_float_0 | float32 | 流通市值,升序百分比排名 |
rank_pb_lf_0 | float32 | 市净率 (LF),升序百分比排名 |
rank_pe_lyr_0 | float32 | 市盈率 (LYR),升序百分比排名 |
rank_pe_ttm_0 | float32 | 市盈率,升序百分比排名 |
rank_ps_ttm_0 | float32 | 市销率 (TTM),升序百分比排名 |
字段 | 字段类型 | 字段描述 |
---|---|---|
ta_ad_* | float32 | 收集派发指标 *取值0...9999(表示第前n天的值,下同) |
ta_adx_X_* | float32 | ADX指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_aroon_down_X_* | float32 | 阿隆指标aroondown,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_aroon_up_X_* | float32 | 阿隆指标aroonup,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_aroonosc_X_* | float32 | AROONOSC指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_aroonosc_X_* | float32 | AROONOSC指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_atr_X_* | float32 | ATR指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_bbands_lowerband_X_* | float32 | BBANDS指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_bbands_middleband_X_* | float32 | BBANDS指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_bbands_upperband_X_* | float32 | BBANDS指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_cci_X_* | float32 | CCI指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_macd_macd_X_Y_Z_* | float32 | MACD指标,X、Y、Z取值1...9999,一般使用fastperiod(X)=12,slowperiod(Y)=26,signalperiod(Z)=9 *取值0...9999 |
ta_macd_macdhist_X_Y_Z_* | float32 | MACD的hist指标,X、Y、Z取值1...9999,一般使用fastperiod(X)=12,slowperiod(Y)=26,signalperiod(Z)=9 *取值0...9999 |
ta_macd_macdsignal_X_Y_Z_* | float32 | MACD的signal指标,X、Y、Z取值1...9999,一般使用fastperiod(X)=12,slowperiod(Y)=26,signalperiod(Z)=9 *取值0...9999 |
ta_mfi_X_* | float32 | MFI指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_mom_X_* | float32 | MOM指标,x取值1...9999,一般使用10,20,30,60。*取值0...9999 |
ta_obv_* | float64 | OBV指标。*取值0...9999 |
ta_rsi_X_* | float32 | RSI指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_sar_* | float32 | SAR指标。*取值0...9999 |
ta_stoch_slowd_5_3_0_3_0_0 | float32 | STOCH (KDJ) 指标D值 |
ta_stoch_slowk_5_3_0_3_0_0 | float32 | STOCH (KDJ) 指标K值 |
ta_trix_X_* | float32 | TRIX指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_willr_X_* | float32 | WILLR指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ta_ema_X_* | float32 | 收盘价的X日指数移动平均值,x取值1...9999,一般使用5,10,20,30,60,120。*取值0...9999 |
ta_sma_X_* | float32 | 收盘价的X日简单移动平均值,x取值1...9999,一般使用5,10,20,30,60,120。*取值0...9999 |
ta_wma_X_* | float32 | 收盘价的X日加权移动平均值,x取值1...9999,一般使用5,10,20,30,60,120。*取值0...9999 |
ta_ewm_X_* | float32 | 收盘价的X日指数加权平均值,x取值1...9999,一般使用5,10,20,30,60,120。*取值0...9999 |
字段 | 字段类型 | 字段描述 |
---|---|---|
beta_csi100_X_* | float32 | X天BETA值(中证100),x取值1...9999,一般使用5,10,20,30,60,120。 timeperiod= * * 取值: 0 .. 9999 |
beta_csi300_X_* | float32 | X天BETA值(中证300),x取值1...9999,一般使用5,10,20,30,60,120。 timeperiod= * * 取值: 0 .. 9999 |
beta_csi500_X_* | float32 | X天BETA值(中证500),x取值1...9999,一般使用5,10,20,30,60,120。 timeperiod= * * 取值: 0 .. 9999 |
beta_csi800_X_* | float32 | X天BETA值(中证800),x取值1...9999,一般使用5,10,20,30,60,120。 timeperiod= * * 取值: 0 .. 9999 |
beta_gem_X_* | float32 | X天BETA值(创业板),x取值1...9999,一般使用5,10,20,30,60,120。 timeperiod= * * 取值: 0 .. 9999 |
beta_industry_X_* | float32 | X天BETA值(所在行业),x取值1...9999,一般使用5,10,20,30,60,120。 timeperiod= * * 取值: 0 .. 9999 |
beta_sse180_X_* | float32 | X天BETA值(上证180),x取值1...9999,一般使用5,10,20,30,60,120。 timeperiod= * * 取值: 0 .. 9999 |
beta_sse50_X_* | float32 | X天BETA值(上证50),x取值1...9999,一般使用5,10,20,30,60,120。 timeperiod= * * 取值: 0 .. 9999 |
beta_szzs_X_* | float32 | X天BETA值(上证综指),x取值1...9999,一般使用5,10,20,30,60,120。 timeperiod= * * 取值: 0 .. 9999 |
字段 | 字段类型 | 字段描述 |
---|---|---|
rank_swing_volatility_X_* | float32 | X天振幅波动率排名,x取值1...9999,一般使用5,10,20,30,60,120。 * 取值: 0 .. 9999 |
rank_volatility_X_* | float32 | X天波动率排名,x取值1...9999,一般使用5,10,20,30,60,120。 * 取值: 0 .. 9999 |
swing_volatility_X_* | float32 | X天振幅波动率,x取值1...9999,一般使用5,10,20,30,60,120。 * 取值: 0 .. 9999 |
volatility_X_* | float32 | X天波动率,x取值1...9999,一般使用5,10,20,30,60,120。 * 取值: 0 .. 9999 |
注意:只有上龙虎榜的个股才会有此数据,若未上榜则会返回Nan。
字段 | 字段类型 | 字段描述 |
---|---|---|
top_l_sell_* | float32 | 过去*个交易日的龙虎榜卖出额 。 * 取值: 0 .. 9999 |
top_l_buy_* | float32 | 过去*个交易日的龙虎榜卖出额 。 *取值: 0 .. 9999 |
top_l_amount_* | float32 | 过去*个交易日的龙虎榜成交额 。 *取值: 0 .. 9999 |
top_net_amount_* | float32 | 过去*个交易日的龙虎榜净买入额 。 *取值: 0 .. 9999 |
top_net_rate_* | float32 | 过去*个交易日的龙虎榜净买额占比 。 *取值: 0 .. 9999 |
top_amount_rate_* | float32 | 过去*个交易日的龙虎榜成交额占比 。 *取值: 0 .. 9999 |
字段 | 字段类型 | 字段描述 |
---|---|---|
cyq_perf_winner_rate_* | float32 | 过去*个交易日的筹码胜率 。 * 取值: 0 .. 9999 |
字段 | 字段类型 | 字段描述(当天的因子值) |
---|---|---|
SW2_return_0 | float32 | 申万二级板块收益率 |
SW2_open_0 | float32 | 申万二级板块开盘价 |
SW2_close_0 | float32 | 申万二级板块收盘价 |
SW2_volume_0 | float32 | 申万二级板块成交量 |
SW2_amount_0 | float32 | 申万二级板块成交额 |
SW2_market_cap_0 | float32 | 申万二级板块总市值 |
SW2_market_cap_float_0 | float32 | 申万二级板块总流通市值 |
SW2_turn_0 | float32 | 申万二级板块换手率 |
SW2_turn_f_0 | float32 | 申万二级板块换手率(相对于流通市值) |
SW2_mf_net_amount_0 | float32 | 申万二级板块净主动买入额,= 买入金额 - 卖出金额 (包括超大单、大单、中单或小单) |
SW2_price_limit_status_zt_sum_0 | int | 申万二级板块涨停股票个数 |
SW2_price_limit_status_dt_sum_0 | int | 申万二级板块跌停股票个数 |
SW2_instrument_count_0 | int | 申万二级板块股票个数 |
注意:同花顺概念板块因子时同花顺中的板块因子,非个股因子,若要计算个股的相关因子,需要通过概念板块中包含的股票信息进行连接。
字段 | 字段类型 | 字段描述 |
---|---|---|
ths_amount_* | float32 | 第前 * 个交易日的交易额 * 取值: 0 .. 9999 |
ths_avg_amount_* | float32 | 第前 * 个交易日的平均交易额 * 取值: 0 .. 9999 |
ths_rank_avg_amount_* | float32 | 第前 * 个交易日的平均交易额排名 * 取值: 0 .. 9999 |
ths_return_* | float32 | 过去*个交易日的收益, =close_0/close_(** +1),eg :return_0 = close_0 / close_1,return_5 = close_0 / close_6 * 取值: 0 .. 9999 |
ths_rank_return_* | float32 | 过去*个交易日的收益排名 * 取值: 0 .. 9999 |
ths_daily_return_* | float32 | 第前 * 个交易日的收益,=close_i / close_(i+1) * 取值: 0 ..9999 |
ths_close_* | float32 | 第前 * 个交易日的收盘价 * 取值: 0 .. 9999 |
ths_high_* | float32 | 第前 * 个交易日的最高价 * 取值: 0 .. 9999 |
ths_low_* | float32 | 第前 * 个交易日的最低价 * 取值: 0 .. 9999 |
ths_open_* | float32 | 第前 * 个交易日的开盘价 * 取值: 0 .. 9999 |
ths_volume_* | float32 | 第前 * 个交易日的成交量 * 取值: 0 .. 9999 |
ths_avg_turn_* | float32 | 第前 * 个交易日的平均换手率 * 取值: 0 .. 9999 |
ths_rank_avg_turn_* | float32 | 第前 * 个交易日的平均换手率排名 * 取值: 0 .. 9999 |
ths_rank_turn_* | float32 | 第前 * 个交易日的换手率排名 * 取值: 0 .. 9999 |
ths_turn_* | float32 | 第前 * 个交易日的换手率 * 取值: 0 .. 9999 |
ths_list_days_* | int | 第前 * 个交易日的上市天数 * 取值: 0 .. 9999 |
ths_stock_quantity_* | int | 第前 * 个交易日的板块包含个股数量(去除ST、退、*ST) * 取值: 0 .. 9999 |
ths_limit_up_quantity_* | int | 第前 * 个交易日的板块内涨停个股数量 * 取值: 0 .. 9999 |
ths_limit_low_quantity_* | int | 第前 * 个交易日的板块内跌停个股数量 * 取值: 0 .. 9999 |
ths_rise_quantity_* | int | 第前 * 个交易日的板块内上涨个股数量(去除ST、退、*ST) * 取值: 0 .. 9999 |
ths_fall_quantity_* | int | 第前 * 个交易日的板块内下跌个股数量(去除ST、退、*ST) * 取值: 0 .. 9999 |
ths_surge_quantity_* | int | 第前 * 个交易日的板块涨幅较大的个股数量 * 取值: 0 .. 9999 |
ths_market_cap_float_* | float32 | 第前 * 个交易日的流通市值 * 取值: 0 .. 9999 |
ths_market_cap_0_* | float32 | 第前 * 个交易日的总市值 * 取值: 0 .. 9999 |
ths_market_cap_0_float_* | float32 | 第前 * 个交易日的流通市值 * 取值: 0 .. 9999 |
ths_rank_market_cap_0_* | float32 | 第前 * 个交易日的总市值排名 * 取值: 0 .. 9999 |
ths_rank_market_cap_0_float_* | float32 | 第前 * 个交易日的流通市值排名 * 取值: 0 .. 9999 |
ths_ta_ad_* | float32 | 收集派发指标 *取值0...9999(表示第前n天的值,下同) |
ths_ta_adx_X_* | float32 | ADX指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_aroon_down_X_* | float32 | 阿隆指标aroondown,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_aroon_up_X_* | float32 | 阿隆指标aroonup,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_aroonosc_X_* | float32 | AROONOSC指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_aroonosc_X_* | float32 | AROONOSC指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_atr_X_* | float32 | ATR指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_bbands_lowerband_X_* | float32 | BBANDS指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_bbands_middleband_X_* | float32 | BBANDS指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_bbands_upperband_X_* | float32 | BBANDS指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_cci_X_* | float32 | CCI指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_macd_macd_X_Y_Z_* | float32 | MACD指标,X、Y、Z取值1...9999,一般使用fastperiod(X)=12,slowperiod(Y)=26,signalperiod(Z)=9 *取值0...9999 |
ths_ta_macd_macdhist_X_Y_Z_* | float32 | MACD的hist指标,X、Y、Z取值1...9999,一般使用fastperiod(X)=12,slowperiod(Y)=26,signalperiod(Z)=9 *取值0...9999 |
ths_ta_macd_macdsignal_X_Y_Z_* | float32 | MACD的signal指标,X、Y、Z取值1...9999,一般使用fastperiod(X)=12,slowperiod(Y)=26,signalperiod(Z)=9 *取值0...9999 |
ths_ta_mfi_X_* | float32 | MFI指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_mom_X_* | float32 | MOM指标,x取值1...9999,一般使用10,20,30,60。*取值0...9999 |
ths_ta_obv_* | float64 | OBV指标。*取值0...9999 |
ths_ta_rsi_X_* | float32 | RSI指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_sar_* | float32 | SAR指标。*取值0...9999 |
ths_ta_stoch_slowd_5_3_0_3_0_0 | float32 | STOCH (KDJ) 指标D值 |
ths_ta_stoch_slowk_5_3_0_3_0_0 | float32 | STOCH (KDJ) 指标K值 |
ths_ta_trix_X_* | float32 | TRIX指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_willr_X_* | float32 | WILLR指标,x取值1...9999,一般使用14,28。*取值0...9999 |
ths_ta_ema_X_* | float32 | 收盘价的X日指数移动平均值,x取值1...9999,一般使用5,10,20,30,60,120。*取值0...9999 |
ths_ta_sma_X_* | float32 | 收盘价的X日简单移动平均值,x取值1...9999,一般使用5,10,20,30,60,120。*取值0...9999 |
ths_ta_wma_X_* | float32 | 收盘价的X日加权移动平均值,x取值1...9999,一般使用5,10,20,30,60,120。*取值0...9999 |
ths_ta_ewm_X_* | float32 | 收盘价的X日指数加权平均值,x取值1...9999,一般使用5,10,20,30,60,120。*取值0...9999 |
ths_rank_swing_volatility_X_* | float32 | X天振幅波动率排名,x取值1...9999,一般使用5,10,20,30,60,120。 * 取值: 0 .. 9999 |
ths_rank_volatility_X_* | float32 | X天波动率排名,x取值1...9999,一般使用5,10,20,30,60,120。 * 取值: 0 .. 9999 |
ths_swing_volatility_X_* | float32 | X天振幅波动率,x取值1...9999,一般使用5,10,20,30,60,120。 * 取值: 0 .. 9999 |
ths_volatility_X_* | float32 | X天波动率,x取值1...9999,一般使用5,10,20,30,60,120。 * 取值: 0 .. 9999 |
ths_beta_csi100_X_* | float32 | X天BETA值(中证100),x取值1...9999,一般使用5,10,20,30,60,120。 timeperiod= * * 取值: 0 .. 9999 |
ths_beta_csi300_X_* | float32 | X天BETA值(中证300),x取值1...9999,一般使用5,10,20,30,60,120。 ,timeperiod= * * 取值: 0 .. 9999 |
ths_beta_csi500_X_* | float32 | X天BETA值(中证500),x取值1...9999,一般使用5,10,20,30,60,120。 ,timeperiod= * * 取值: 0 .. 9999 |
ths_beta_csi800_X_* | float32 | X天BETA值(中证800),x取值1...9999,一般使用5,10,20,30,60,120。 ,timeperiod= * * 取值: 0 .. 9999 |
ths_beta_gem_X_* | float32 | X天BETA值(创业板),x取值1...9999,一般使用5,10,20,30,60,120。 ,timeperiod= * * 取值: 0 .. 9999 |
ths_beta_sse180_X_* | float32 | X天BETA值(上证180),x取值1...9999,一般使用5,10,20,30,60,120。 ,timeperiod= * * 取值: 0 .. 9999 |
ths_beta_sse50_X_* | float32 | X天BETA值(上证50),x取值1...9999,一般使用5,10,20,30,60,120。 ,timeperiod= * * 取值: 0 .. 9999 |
ths_beta_szzs_X_* | float32 | X天BETA值(上证综指),x取值1...9999,一般使用5,10,20,30,60,120。 ,timeperiod= * * 取值: 0 .. 9999 |
注意:指数因子所有票抽取后是一样的,因此指数因子多用于与个股因子数据进行组合计算。
字段 | 字段类型 | 字段描述(当天的因子值) |
---|---|---|
szzs_close_* | float32 | 第前 * 个上证指数的收盘价 * 取值: 0 .. 9999 |
szzs_open_* | float32 | 第前 * 个上证指数的开盘价 * 取值: 0 .. 9999 |
szzs_high_* | float32 | 第前 * 个上证指数的最高价 * 取值: 0 .. 9999 |
szzs_low_* | float32 | 第前 * 个上证指数的最低价 * 取值: 0 .. 9999 |
szzs_volume_* | float32 | 第前 * 个上证指数的成交量 * 取值: 0 .. 9999 |
szzs_amount_* | float32 | 第前 * 个上证指数的成交额 * 取值: 0 .. 9999 |
hssb_close_* | float32 | 第前 * 个沪深300指数的收盘价 * 取值: 0 .. 9999 |
hssb_open_* | float32 | 第前 * 个沪深300指数的开盘价 * 取值: 0 .. 9999 |
hssb_high_* | float32 | 第前 * 个沪深300指数的最高价 * 取值: 0 .. 9999 |
hssb_low_* | float32 | 第前 * 个沪深300指数的最低价 * 取值: 0 .. 9999 |
hssb_volume_* | float32 | 第前 * 个沪深300指数的成交量 * 取值: 0 .. 9999 |
hssb_amount_* | float32 | 第前 * 个沪深300指数的成交额 * 取值: 0 .. 9999 |
cybz_close_* | float32 | 第前 * 个创业板指的收盘价 * 取值: 0 .. 9999 |
cybz_open_* | float32 | 第前 * 个创业板指的开盘价 * 取值: 0 .. 9999 |
cybz_high_* | float32 | 第前 * 个创业板指的最高价 * 取值: 0 .. 9999 |
cybz_low_* | float32 | 第前 * 个创业板指的最低价 * 取值: 0 .. 9999 |
cybz_volume_* | float32 | 第前 * 个创业板指的成交量 * 取值: 0 .. 9999 |
cybz_amount_* | float32 | 第前 * 个创业板指的成交额 * 取值: 0 .. 9999 |
zzyq_close_* | float32 | 第前 * 个中证1000的收盘价 * 取值: 0 .. 9999 |
zzyq_open_* | float32 | 第前 * 个中证1000的开盘价 * 取值: 0 .. 9999 |
zzyq_high_* | float32 | 第前 * 个中证1000的最高价 * 取值: 0 .. 9999 |
zzyq_low_* | float32 | 第前 * 个中证1000的最低价 * 取值: 0 .. 9999 |
zzyq_volume_* | float32 | 第前 * 个中证1000的成交量 * 取值: 0 .. 9999 |
zzyq_amount_* | float32 | 第前 * 个中证1000的成交额 * 取值: 0 .. 9999 |
zzwb_close_* | float32 | 第前 * 个中证500的收盘价 * 取值: 0 .. 9999 |
zzwb_open_* | float32 | 第前 * 个中证500的开盘价 * 取值: 0 .. 9999 |
zzwb_high_* | float32 | 第前 * 个中证500的最高价 * 取值: 0 .. 9999 |
zzwb_low_* | float32 | 第前 * 个中证500的最低价 * 取值: 0 .. 9999 |
zzwb_volume_* | float32 | 第前 * 个中证500的成交量 * 取值: 0 .. 9999 |
zzwb_amount_* | float32 | 第前 * 个中证500的成交额 * 取值: 0 .. 9999 |
zzbb_close_* | float32 | 第前 * 个中证800的收盘价 * 取值: 0 .. 9999 |
zzbb_open_* | float32 | 第前 * 个中证800的开盘价 * 取值: 0 .. 9999 |
zzbb_high_* | float32 | 第前 * 个中证800的最高价 * 取值: 0 .. 9999 |
zzbb_low_* | float32 | 第前 * 个中证800的最低价 * 取值: 0 .. 9999 |
zzbb_volume_* | float32 | 第前 * 个中证800的成交量 * 取值: 0 .. 9999 |
zzbb_amount_* | float32 | 第前 * 个中证800的成交额 * 取值: 0 .. 9999 |
所有模块没有特殊说明,均支持传入是否使用缓存参数(is_use_cache),默认为False。若为True,则会在本地磁盘创建缓存文件。缓存配置地址在config.ini文件中的cache_path字段。请及时关注本地磁盘空间是否充足。
一般模块输出均为通用数据模块(Output),根据各个模块返回结果会有data,data_1,data_2,data_3,均为DataSource类型,可以使用read()方法读取。
注意:以下模块说明中返回的模型均为使用read方法后获取以后的类型。
代码示例:
xxxxxxxxxx
result = XX_block_result.read() # 读取默认的data结果
result_data = XX_block_result.get_data().read() # 读取data结果
result_data_1 = XX_block_result.get_data_1().read() # 读取data_1结果
result_data_2 = XX_block_result.get_data_2().read() # 读取data_2结果
result_data_3 = XX_block_result.get_data_3().read() # 读取data_3结果
DataSource可以直接用来读取基础数据(base文件夹下的csv文件),也可以读取缓存文件的内容。
xxxxxxxxxx
D.read('index_classify') #读取申万行业数据
D.read('缓存文件名称') #读取缓存数据文件
自定义数据转换为CTQaunt中使用的模块
xxxxxxxxxx
#data 为自定义数据
my_block=M.generate_data_block(data)
生成训练数据的开始时间、结束时间。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
start_date | str | 是 | 训练开始日期。格式:20230101 | |
end_date | str | 是 | 训练结束日期。格式:20231231 | |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | dict | 例:{'start_date':20230101, 'end_date':20231231} |
xxxxxxxxxx
xl_date = M.input_date('20230101','20231231')
xl_date.get_data().read()
输出结果:
xxxxxxxxxx
{'start_date': 20230101, 'end_date': 20231231}
生成回测(模拟)数据的开始时间、结束时间。注意和训练日期模块有所区别。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
start_date | str | 是 | 训练开始日期。格式:20230101 | |
end_date | str | 是 | 训练结束日期。格式:20231231 | |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | dict | 例:{'start_date':20230101, 'end_date':20231231} |
xxxxxxxxxx
xl_date = M.input_date('20240101','20241231')
xl_date.get_data().read()
输出结果:
xxxxxxxxxx
{'start_date': 20240101, 'end_date': 20241231, 'block_type': '_p'}
输入特征(因子)数据。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
input_feature_list | DataSource | 否 | None | 因子列表模块数据的返回值,用于因子的叠加 |
feature_list | list | 是 | 因子列表,例如:['factor1=return_0/return_5', 'mean(turn_0,5)/turn_0'] | |
is_rank | str | 否 | normal | 返回因子的格式,normal:正常因子、rank:排序因子、all:所有因子(normal+rank) |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | list | 因子列表的集合 |
data_1 | list | 因子列表的集合(同data) |
data_2 | list | 因子简称的列表集合 |
代码示例1
xxxxxxxxxx
features = M.input_features(None, ['factor1=return_0/return_5', 'mean(turn_0,5)/turn_0'], is_rank='all')
features.read()
输出结果:
xxxxxxxxxx
['factor1=return_0/return_5',
'mean(turn_0,5)/turn_0=mean(turn_0,5)/turn_0',
'n_factor1=rank(return_0/return_5)',
'n_mean(turn_0,5)/turn_0=rank(mean(turn_0,5)/turn_0)']
代码示例2
xxxxxxxxxx
features = M.input_features(None, ['factor1=return_0/return_5', 'factor2=mean(turn_0,5)/turn_0'], is_rank='all')
features.get_data_2().read()
输出结果
xxxxxxxxxx
['factor1', 'factor2', 'n_factor1', 'n_factor2']
建议使用 (factor_key = 表达式)这种格式。
抽取基础特征因子(只支持股票的日线)。基础特征是因子表达式中的所使用到的预计算因子。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
feature_list_input | DataSource | 是 | 因子列表模块数据的返回值(data) | |
input_date | DataSource | 是 | 日期模块返回值 | |
shift_days | int | 否 | 0 | 向前取数据的天数 |
feature_type | str | 否 | stock | stock 股票基础特征,ths:同花顺概念板块特征 |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | DataFrame | 股票基础特征数据 |
代码示例1
xxxxxxxxxx
g_feature_block = M.general_feature_extractor(feature_list_input=features.get_data(), input_Date=xl_date.get_data(), shift_days=10)
g_feature_block.read()
# g_feature_block.get_data().read() 也可以这样写
输出结果:
xxxxxxxxxx
instrument date turn_0 return_0 return_5
0 000001.SZ 20221222 0.346 1.004655 0.978836
1 000002.SZ 20221222 0.424 1.001604 0.972987
2 000004.SZ 20221222 0.852 1.000000 0.945080
3 000005.SZ 20221222 0.477 1.000000 0.952887
4 000006.SZ 20221222 9.423 0.998219 1.044778
... ... ... ... ... ...
1293842 873679.BJ 20231229 12.642 1.018213 1.066788
1293843 873693.BJ 20231229 7.004 1.000964 0.975575
1293844 873703.BJ 20231229 14.253 0.994829 1.090085
1293845 873726.BJ 20231229 26.729 1.107895 1.454667
1293846 873833.BJ 20231229 8.907 1.016194 1.104916
[1293847 rows x 5 columns]
抽取申万二级板块预计算因子。若要计算申万二级板块的表达式因子,需要用此模块先抽取申万二级板块的基础特征(预计算因子),再用衍生特征抽取模块获取相应的表达式因子值。例如 sw2_factor1=SW_return_0/shift(SW_return_0,5),此模块会抽取SW_return_0这个因子特征的值。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
input_date | DataSource | 是 | 日期模块返回的结果 | |
shift_days | int | 否 | 0 | 向前取数据的天数 |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | DataFrame | 股票申万二级板块基础因子数据 |
xxxxxxxxxx
sw2_feature_block = M.sw2_feature_extractor(input_Date=xl_date.get_data(), shift_days=130)
sw2_feature_block.read()
输出结果
xxxxxxxxxx
date name_SW2 index_code instrument SW2_return_0 SW2_open_0 \
0 20220824 股份制银行Ⅱ 801783.SI 000001.SZ 0.996308 242.732226
1 20220824 教育 801994.SI 600661.SH 0.969506 41.402691
2 20220824 汽车零部件 801093.SI 600660.SH 0.955309 300.486605
3 20220824 房地产开发 801181.SI 600658.SH 0.982049 488.795528
4 20220824 房地产开发 801181.SI 600657.SH 0.982049 488.795528
... ... ... ... ... ... ...
1630186 20231229 通信设备 801102.SI 300205.SZ 1.018022 198.603260
1630187 20231229 化学制药 801151.SI 300204.SZ 1.016732 584.576609
1630188 20231229 环保设备Ⅱ 801972.SI 300203.SZ 1.010896 43.820539
1630189 20231229 环保设备Ⅱ 801972.SI 300210.SZ 1.010896 43.820539
1630190 20231229 半导体 801081.SI 688981.SH 1.009660 165.124767
SW2_close_0 SW2_volume_0 SW2_amount_0 SW2_market_cap_0 \
0 242.916103 407602750 5173871077 2.311840e+12
1 40.085561 301806609 1525765456 8.109388e+10
2 292.360177 3303058225 40429606256 1.720244e+12
3 483.681609 3014295951 16079276612 1.538703e+12
4 483.681609 3014295951 16079276612 1.538703e+12
... ... ... ... ...
1630186 202.305418 1065166204 22118802158 9.932592e+11
1630187 590.533700 1102871124 16588329539 1.839797e+12
1630188 44.397779 205412708 2100308469 1.359768e+11
1630189 44.397779 205412708 2100308469 1.359768e+11
1630190 166.083947 679391530 30377703171 3.406010e+12
SW2_market_cap_float_0 SW2_turn_0 SW2_turn_f_0 \
0 1.972165e+12 0.184643 0.339435
1 5.294705e+10 2.894919 3.999232
2 1.363655e+12 3.211809 5.122555
3 1.439623e+12 1.272170 2.494327
4 1.439623e+12 1.272170 2.494327
... ... ... ...
1630186 7.784722e+11 2.378409 3.346079
1630187 1.508122e+12 1.148700 1.856674
1630188 1.134996e+11 1.799200 3.009951
1630189 1.134996e+11 1.799200 3.009951
1630190 2.182624e+12 1.347517 1.891146
SW2_mf_net_amount_0 SW2_price_limit_status_zt_sum_0 \
0 -2.095451e+08 0
1 -3.848570e+08 0
2 -6.219641e+09 1
3 -2.143858e+09 1
4 -2.143858e+09 1
... ... ...
1630186 7.184173e+08 1
1630187 1.065012e+09 1
1630188 2.231780e+07 0
1630189 2.231780e+07 0
1630190 3.288245e+08 0
SW2_price_limit_status_dt_sum_0 SW2_instrument_count_0
0 0 9
1 0 19
2 6 193
3 0 107
4 0 107
... ... ...
1630186 0 86
1630187 0 150
1630188 0 28
1630189 0 28
1630190 0 148
[1630191 rows x 17 columns]
抽取衍生特征因子(非预计算因子抽取),即计算因子表达式的值。注意:若要抽取申万二级板块的衍生特征,需要使用申万二级板块的基础特征抽取模块获取基础特征后方可使用。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
input_data | DataSource | 是 | 基础特征模块返回的结果 | |
input_feature_list | DataSource | 是 | 因子列表模块返回的结果(data) | |
input_date | DataSource | 是 | 日期模块返回的结果 | |
date_col | str | 否 | date | 日期列的名称 |
instrument_col | str | 否 | instrument | 股票列名称 |
drop_na | bool | 否 | False | 是否删除包含空数据的行 |
remove_extra_columns | bool | 否 | False | 是否删除多余的列 |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | DataFrame | 股票因子数据 |
xxxxxxxxxx
d_feature_block = M.derived_feature_extractor(input_data=g_feature_block.get_data(),input_feature_list=features.get_data_1(),input_Date=xl_date.get_data())
d_feature_block.read()
输出结果
xxxxxxxxxx
date instrument turn_0 return_0 return_5 factor1 factor2 n_factor1 n_factor2
0 20230103 000001.SZ 1.131 1.046353 1.060862 0.986323 0.467580 0.396589 0.033512
1 20230103 000002.SZ 0.655 1.001648 0.970714 1.031868 0.836387 0.881816 0.510212
2 20230103 000004.SZ 1.834 1.026843 1.064229 0.964870 0.468193 0.217331 0.033908
3 20230103 000005.SZ 0.552 1.005395 1.016302 0.989268 0.815519 0.430696 0.481261
4 20230103 000006.SZ 7.900 0.971429 1.035536 0.938094 1.724156 0.111045 0.981955
... ... ... ... ... ... ... ... ... ...
1258497 20231229 873679.BJ 12.642 1.018213 1.066788 0.954467 0.883734 0.124577 0.400150
1258498 20231229 873693.BJ 7.004 1.000964 0.975575 1.026024 1.200385 0.782976 0.840879
1258499 20231229 873703.BJ 14.253 0.994829 1.090085 0.912616 1.061823 0.049981 0.689649
1258500 20231229 873726.BJ 26.729 1.107895 1.454667 0.761615 0.822004 0.002443 0.296825
1258501 20231229 873833.BJ 8.907 1.016194 1.104916 0.919703 0.809045 0.057309 0.278039
[1258502 rows x 9 columns]
根据因子值过滤数据。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
input_data | DataSource | 是 | 股票因子特征数据 | |
expr | str | 是 | 表达式,例如return_0>5 | |
output_left_data | bool | 否 | False | 是否输出剩余数据 |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | DataFrame | 过滤后的股票数据 |
data_2 | DataFrame | 原始数据经过滤后的剩余数据(如果output_left_data设为True才会有值) |
xxxxxxxxxx
filter_block = M.filter(d_feature_block.get_data(), 'factor1>1')
filter_block.read()
过滤A股股票数据。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
input_data | DataSource | 是 | 股票数据 | |
board_cond | list | 是 | [] | [1:上证主板, 2:深证主板, 3:创业板, 4:科创办, 5:北交所] |
st_cond | list | 是 | [] | [0:正常、1:ST、2:*ST、11:暂停上市] |
output_left_data | bool | 否 | False | 是否输出剩余数据 |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | DataFrame | 过滤后的股票数据 |
data_2 | DataFrame | 原始数据经过滤后的剩余数据(如果output_left_data设为True才会有值) |
xxxxxxxxxx
a_stock_filter_block = M.a_stock_filter(filter_block.get_data(), board_cond=[1,2,3], st_cond=[0])
a_stock_filter_block.read()
用于连接两个或者三个数据。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
input_data1 | DataSource | 是 | 输入数据1 | |
input_data2 | DataSource | 是 | 输入数据2 | |
input_data3 | DataSource | 否 | None | 输入数据3 |
on | list | 否 | ['instrument','date'] | 关联的列 |
how | str | 否 | left | 连接方式 |
sort | bool | 否 | False | 是否排序 |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | DataFrame | 连接后的数据 |
xxxxxxxxxx
xl_data_result = M.data_join(input_data1=xl_data.get_data(),input_data2=xl_bk_data.get_data(), how='inner')
集成的数据处理模块,包括:缺失值填充(常规因子使用每天的均值填充,申万二级板块因子采用前后填充),去极值,标准化(Min_Max标准化)。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
input_data_block | DataSource | 是 | 待处理数据 | |
feature_list_block | DataSource | 是 | 因子列表数据 | |
init_data | DataSource | 否 | None | 初始化数据,标准化用到max min值,所以在训练时使用的标准化会在预测、模拟的时候使用到全局的max、min值。 |
bk_index_name | str | 否 | 申万二级板块因子填充时用来groupby的列,一般为name_SW2 | |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | DataFrame | 处理后的数据 |
data_2 | dict | init_data数据(记录max、min值) |
xxxxxxxxxx
xl_data_process_block = M.data_process(input_data_block=xl_derived_data.get_data(),feature_list_block=features.get_data(), bk_index_name='bk_name',is_use_cache=True)
标准化数据。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
input_data | DataSource | 是 | 待处理数据 | |
standard_fun | str | 是 | Min_Max | Min_Max:Min-Max标准化(默认) Z_Score:Z-Score标准化 DecimalScaler:小数定标标准化 MeanScaler:均值归一化 VectorScaler:向量归一化 lg_scaler:lg函数标准化 |
columns | list | 否 | 处理列,默认所有列可标准化的列 | |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | DataFrame | 标准化后的数据 |
xxxxxxxxxx
xl_standarize_block = M.standardize(input_data=xl_derived_data.get_data(),standard_fun='Z_Score')
数据去极值。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
input_data | DataSource | 是 | 待处理数据 | |
function_name | str | 是 | '1' | 可选值[1:'MAD',2:'3倍标准差',3:'百分位法'] |
columns_input | list | 否 | 处理的列,默认所有列 | |
group | str | 否 | 'date' | 分组列名,默认date |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | DataFrame | 去极值后的数据 |
xxxxxxxxxx
xl_winsorize_block = M.winsorize(input_data=xl_derived_data.get_data(),function_name='2')
数据去空值。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
input_data | DataSource | 是 | 待处理数据 | |
dropna_columns | list | 否 | 处理的列,默认所有列 | |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | DataFrame | 去空值后的数据 |
xxxxxxxxxx
xl_dropna_block = M.data_dropna(input_data=xl_derived_data.get_data())
标注股票目标值。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
input_date | DataSource | 是 | 日期模块 | |
label_expr | str | 是 | 自动标注的表达式 ,例如:shift(close, -2) / shift(open, -1) | |
filter_yiziban | bool | 否 | True | 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label) where(shift(high, -1) == shift(low, -1), NaN, label) |
winsorize | bool | 否 | True | 去极值,用1%和99%分位的值做clip clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99)) |
wbins | bool | 否 | False | #按等宽做离散化,映射从0开始。bins可以是正整数,表示bins的数量;list,表示splits,e.g. [-2, 0, 2],小于-2的数据将被映射为0,大于2的被映射为3,中间的分别为1和2 |
cbins | bool | 否 | False | 按等频做离散化,映射从0开始。bins可以是正整数,表示bins的数量;list,表示每个bin里的数据比例 |
bins | int | 否 | 20 | 分类个数,设置wbin=True或cbins=True时使用 |
cast_label_int | bool | 否 | False | 将标注转换为整数,一般用于分类学习 |
is_use_cache | bool | 否 | False | 是否启用缓存 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | DataFrame | 标注后的数据,标注的字段为label |
xxxxxxxxxx
y = M.advanced_auto_labeler(xl_date.get_data(), label_expr='shift(close, -2) / shift(open, -1)')
一般情况而言,机器学习会将标注数据离散化处理,而深度学习则不会做离散化。
标注后的数据可以和股票的因子数据列表进行连接。
CNN样例模型。目前提供两种样例CNN模型,都是基于一维卷积搭建的深度学习模型。具体模型构建层及参数可以后期发布源码。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
input_data | DataSource | 是 | 训练数据 | |
feature_keys | DataSource | 是 | 因子列表 | |
epochs | int | 否 | 10 | 训练次数 |
verbose | int | 否 | 2 | 输出显示日志:0不显示,1输出进度条记录,2:每个epoch输出一行记录。 |
default_weights_path | str | 否 | Weights\m1_weights1.h5 | 默认使用已存储的权重,若没有,则会保存权重文件 |
save_weight_path | str | 否 | Weights\m1_weights1.h5 | 在没有读取到默认存储权重的文件时,会保存权重文件路径。 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | tensorflow.keras.Model | 模型数据 |
xxxxxxxxxx
cnn_model_1 = M.get_cnn_model_1(input_data=xl_derived_data.get_data(), feature_keys=feature_block.get_data())
cnn_model_2 = M.get_cnn_model_2(input_data=xl_derived_data.get_data(), feature_keys=feature_block.get_data())
CNN训练每次都会生成随机的权重,这就会导致每次结果会有偏差。所以这里会固定权重文件。
此模型是训练后的模型。模型可以直接用来预测数据。
使用深度学习的模型进行预测。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
model_block | DataSource | 是 | 训练模型 | |
input_data | DataSource | 是 | 预测数据 | |
feature_keys | DataSource | 是 | 因子列表 | |
input_date | DataSource | 是 | 预测时间模块 | |
verbose | int | 否 | 2 | 输出显示日志:0不显示,1输出进度条记录,2:每个epoch输出一行记录 |
calc_ic | bool | 否 | False | 是否计算和打印IC图表 |
通用数据类型(Output)
名称 | 类型 | 字段描述 |
---|---|---|
data | DataFrame | 预测的数据值,预测值列名:pred_label |
data_2 | DataFrame | 计算IC的相关信息,每条记录对应每次预测的IC,最后一行是累计的平均IC |
xxxxxxxxxx
yc_cnn_pred = M.get_dp_predict(cnn_model.get_data(), yc_data_block.get_data(), temp_feature_block.get_data_2(),yc_date_block.get_data(),verbose=2,calc_ic=True)
预测的数据可以用来回测,检验模型的收益情况。
用来数据回测。目前平台只支持日频交易数据,即买卖点在开盘或者收盘时买入、卖出。
名称 | 字段类型 | 是否必填 | 默认值 | 字段描述 |
---|---|---|---|---|
name | 策略名称 | 是 | 策略模拟时,如果名字相同,则覆盖原策略信号 | |
params | dict | 是 | {"cash": 100000, "enable_log": False, "showplot": False,"load_data_log_flag": False} | params说明 cash:回测初始资金,默认:100000 benchmark: 基准,默认 000300.SH enable_log: 是否显示交易详细日志,默认:False showplot: 是否显示回测曲线,默认:False load_data_log_flag: 是否显示加载回测数据进度条,默认:Flase 除了以上系统使用到的字段,用户可以自定义字段,在交易模块中使用。 |
trade_date_block | DataSource | 是 | 预测(模拟)时间模块 | |
trade_prediction_data | DataSource | 是 | 预测数据模块 | |
executeFunc | fuc | 是 | 自定义的交易规方法,方法中包含买卖逻辑、交易权重、持仓天数等,具体可参照示例。 |
注意,此结果直接返回dict类型,可自行打印查看相关数据。
名称 | 类型 | 字段描述 |
---|---|---|
data | dict | 预测结果 |
名称 | 类型 | 字段描述 |
---|---|---|
prediction_data | DataFrame | 传入的预测参数数据 |
positions | dict | 持仓股票信息,key包括: instrument 股票代码 字符串 hold_num 持仓数量 整数型 holding_days 持仓天数 整数型(第一天买入为0,后续每天加1) price 成本价 浮点型 position_value 持仓市值 浮点型 |
trading_day | int | 当前交易日期,例如:20240105 |
available_cash | float | 当前可用资金 |
total_market_holdings | float | 持仓总市值 |
total_assets | float | 总资产 |
params | dict | 自定义传入的参数集合,例如传入购买股票数量,股票购买权重等等 |
xxxxxxxxxx
"""
简单的样例,可以直接使用,规则是第一天open买入,第二天close卖出。
"""
def trade_execute():
#获取当天交易日期
now = G.trading_day
#这里是自定义的一个参数,用来定义买几支股票
stock_count = G.params['stock_count']
# 这里获取需要操作的当天的股票数据
prediction_data = G.prediction_data[G.prediction_data['date'] == now]
# 这里是要买入预测值最高的股票,所以先按照预测值pred_label列进行降序排列
prediction_data = prediction_data.sort_values(by=['pred_label'], ascending=False).reset_index(drop=True)
# 然后获取前stock_count的股票进行操作
stocks = prediction_data['instrument'].head(stock_count)
#可能不一定实际有stock_count支票,所以这里获取下实际的个数,用来计算资金分配
real_stock_count = len(stocks)
#这边开始计算资产用来实际交易
# G.total_assets为总资产
total_cash = G.total_assets
# G.available_cash为可用资金
available_cash = G.available_cash
# 这里是计算可以用来实际买入的可用资金(以下是等权重买入),用户可以设定自己的逻辑或权重
available_cash = available_cash if available_cash < total_cash / 2 else total_cash / 2
#G.trade_engine.order_value(stock,hold_num)此方法用于买入卖出股票。
#stock:股票代码,hold_num:股票数量,大于等于0的整数
#若未持仓,则是买入hold_num手
#若已持仓,则会将持仓数量变为hold_num。(hold_num>持仓,则补仓,即买入;反正即卖出;为0则是平仓)
# 买入股票
for stock_name in stocks:
temp_cash = available_cash / real_stock_count
G.trade_engine.order_value(stock_name, temp_cash)
# 由于设定的第一天买,第二天卖,所以这里会卖出持有的票。具体持仓几天可以自己去定义逻辑。
# 卖出持仓股票 G.position为当前持仓
for _p in G.positions:
if G.positions[_p].hold_num > 0:
G.trade_engine.order_target(_p, 0)
#开始回测
trade_result = M.ct_trader(
name='test_strategy',
params={
"cash": 500000,
"stock_count": 5, #这里是一个自定义参数
},
trade_date_block=yc_date_block.get_data(),
trade_prediction_data=yc_cnn_pred.get_data_1(),
executeFunc=trade_execute)
本系统的交易模块不包含具体的交易规则,所以用户需要写自己的交易逻辑