Jerry
由bq2wgfv4创建,最终由bq2wgfv4 被浏览 4 用户
from bigmodule import M
# <aistudiograph>
# @param(id="m5", name="initialize")
# 交易引擎:初始化函数,只执行一次
def m5_initialize_bigquant_run(context):
from bigtrader.finance.commission import PerOrder
# 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数
context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
# @param(id="m5", name="before_trading_start")
# 交易引擎:每个单位时间开盘前调用一次。
def m5_before_trading_start_bigquant_run(context, data):
# 盘前处理,订阅行情等
pass
# @param(id="m5", name="handle_data")
def m5_handle_data_bigquant_run(context, data):
import pandas as pd
# 下一个交易日不是调仓日,则不生成信号
if not context.rebalance_period.is_signal_date(data.current_dt.date()):
return
# 从传入的数据 context.data 中读取今天的信号数据
today_df = context.data[context.data["date"] == data.current_dt.strftime("%Y-%m-%d")]
target_instruments = set(today_df["instrument"])
# 获取当前已持有股票
holding_instruments = set(context.get_account_positions().keys())
# 卖出不在目标持有列表中的股票
for instrument in holding_instruments - target_instruments:
context.order_target_percent(instrument, 0)
# 买入目标持有列表中的股票
for i, x in today_df.iterrows():
# 处理 null 或者 decimal.Decimal 类型等
position = 0.0 if pd.isnull(x.position) else float(x.position)
context.order_target_percent(x.instrument, position)
# @module(position="140,40", comment="""使用基本信息对股票池过滤""")
m1 = M.cn_stock_basic_selector.v8(
exchanges=["""上交所""", """深交所""", """北交所"""],
list_sectors=["""主板""", """创业板""", """科创板"""],
indexes=["""中证500""", """中证A500""", """上证指数""", """创业板指""", """深证成指""", """北证50""", """上证50""", """科创50""", """沪深300""", """中证1000""", """中证100""", """深证100"""],
st_statuses=["""正常"""],
margin_tradings=["""两融标的""", """非两融标的"""],
drop_suspended=True,
m_name="""m1"""
)
# @module(position="140,170", comment="""因子特征""")
m2 = M.input_features_dai.v30(
input_1=m1.data,
mode="""表达式""",
expr="""total_market_cap AS score
""",
expr_filters="""
c_pct_rank(float_market_cap) > 0.2
net_profit_yoy_ttm > 0.3
operating_revenue_yoy_ttm > 0.3
pe_ttm > 0
pb < 5
""",
expr_tables="""cn_stock_prefactors""",
extra_fields="""date, instrument""",
order_by="""date, instrument""",
expr_drop_na=True,
extract_data=False,
m_name="""m2"""
)
# @module(position="140,300", comment="""持股数量、打分到仓位""")
m3 = M.score_to_position.v5(
input_1=m2.data,
score_field="""score ASC""",
hold_count=10,
position_expr="""1 AS position""",
total_position=1,
extract_data=False,
m_name="""m3"""
)
# @module(position="140,430", comment="""抽取预测数据""")
m4 = M.extract_data_dai.v20(
sql=m3.data,
start_date="""2020-01-01""",
start_date_bound_to_trading_date=True,
end_date="""2025-12-31""",
end_date_bound_to_trading_date=True,
before_start_days=90,
keep_before=False,
debug=False,
m_name="""m4"""
)
# @module(position="140,560", comment="""交易,日线,设置初始化函数和K线处理函数,以及初始资金、基准等""")
m5 = M.bigtrader.v52(
data=m4.data,
start_date="""""",
end_date="""""",
initialize=m5_initialize_bigquant_run,
before_trading_start=m5_before_trading_start_bigquant_run,
handle_data=m5_handle_data_bigquant_run,
capital_base=1000000,
frequency="""daily""",
product_type="""股票""",
rebalance_period_type="""交易日""",
rebalance_period_days="""5""",
rebalance_period_roll_forward=True,
backtest_engine_mode="""标准模式""",
before_start_days=0,
volume_limit=1,
order_price_field_buy="""open""",
order_price_field_sell="""open""",
benchmark="""沪深300指数""",
plot_charts=True,
debug=False,
backtest_only=False,
m_name="""m5"""
)
# </aistudiograph>
\