陈雨作业,0805
由bqtzejx8创建,最终由bqtzejx8 被浏览 8 用户
非常感谢张伟同学和四金同学的作业能给我看,我还好多代码不会写。
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))
context.data.sort_values('score_rank', inplace=True)
# @param(id="m5", name="before_trading_start")
# 交易引擎:每个单位时间开盘前调用一次。
def m5_before_trading_start_bigquant_run(context, data):
# 盘前处理,订阅行情等
pass
# @param(id="m5", name="handle_tick")
# 交易引擎:tick数据处理函数,每个tick执行一次
def m5_handle_tick_bigquant_run(context, tick):
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
current_date = data.current_dt.strftime("%Y-%m-%d")
print(f"========== current_date {current_date} \n")
# 从传入的数据 context.data 中读取今天的信号数据
today_df = context.data[context.data["date"] == current_date]
target_instruments = list(today_df["instrument"])
# 获取当前已持有股票
holding_instruments = list(context.get_account_positions().keys())
# =========== 大盘风控
market_data = context.options['data'].read();
current_day_data2 = market_data[market_data["date"] == current_date]
market_chg = current_day_data2["market_chg"].iloc[0] - 1
print(f"============ {current_date},近3日大盘涨跌幅{market_chg}")
if(market_chg < -0.05):
print(f"============ {current_date},近3日大盘涨跌幅{market_chg}, 触发大盘风控,全仓卖出")
# 获取当前已持有股票
for instrument in holding_instruments:
print(f"============ {current_date},stock {instrument},大盘风控卖出")
context.order_target_percent(instrument, 0)
return
# =========== 个股止盈
for instrument in holding_instruments:
# 股票买入价
stock_cost = context.get_position(instrument).cost_price
# 股票当前价格
stock_market_price = context.get_position(instrument).last_price
stock_chg = (stock_market_price / stock_cost ) - 1
print(f"============ {current_date},stock {instrument},chgPrice {stock_chg}")
if (stock_chg < -0.01):
# 触发止损
print(f"============ {current_date},stock {instrument},chgPrice {stock_chg},止损卖出")
context.order_target_percent(instrument, 0)
elif(stock_chg > 0.03):
# 触发止盈
print(f"============ {current_date},stock {instrument},chgPrice {stock_chg},止盈卖出")
context.order_target_percent(instrument, 0)
# =========== 正常换手
# 卖出不在目标持有列表中的股票
for instrument in holding_instruments:
if instrument not in 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)
# @param(id="m5", name="handle_trade")
# 交易引擎:成交回报处理函数,每个成交发生时执行一次
def m5_handle_trade_bigquant_run(context, trade):
pass
# @param(id="m5", name="handle_order")
# 交易引擎:委托回报处理函数,每个委托变化时执行一次
def m5_handle_order_bigquant_run(context, order):
pass
# @param(id="m5", name="after_trading")
# 交易引擎:盘后处理函数,每日盘后执行一次
def m5_after_trading_bigquant_run(context, data):
pass
# @module(position="56,-726", comment="""因子特征""", comment_collapsed=True)
m1 = M.input_features_dai.v30(
mode="""表达式""",
expr="""-- DAI SQL 算子/函数: https://bigquant.com/wiki/doc/dai-PLSbc1SbZX#h-%E5%87%BD%E6%95%B0
-- 数据&字段: 数据文档 https://bigquant.com/data/home
-- 数据使用: 表名.字段名, 对于没有指定表名的列,会从 expr_tables 推断
close
m_lag(close, 10) as pre_close
close / pre_close as market_chg
""",
expr_filters="""instrument = '000001.SH'""",
expr_tables="""cn_stock_index_bar1d""",
extra_fields="""date, instrument""",
order_by="""date, instrument""",
expr_drop_na=True,
sql="""SELECT date, instrument, m_stddev(turn, 30) AS turn_std, sw2021_level1,
turn_std - AVG(turn_std) OVER (PARTITION BY sw2021_level1) AS score
FROM cn_stock_prefactors
WHERE list_sector = 1
AND is_risk_warning = 0
AND close / adjust_factor > 5
AND list_days >= 200
QUALIFY COLUMNS(*) IS NOT NULL
ORDER BY date""",
extract_data=False,
m_name="""m1"""
)
# @module(position="86,-560", comment="""抽取预测数据""", comment_collapsed=True)
m6 = M.extract_data_dai.v20(
sql=m1.data,
start_date="""2019-01-01""",
start_date_bound_to_trading_date=True,
end_date="""2024-04-29""",
end_date_bound_to_trading_date=True,
before_start_days=90,
keep_before=False,
debug=False,
m_name="""m6"""
)
# @module(position="-487,-832", comment="""因子特征""")
m2 = M.input_features_dai.v30(
mode="""SQL""",
expr="""-- DAI SQL 算子/函数: https://bigquant.com/wiki/doc/dai-PLSbc1SbZX#h-%E5%87%BD%E6%95%B0
-- 数据&字段: 数据文档 https://bigquant.com/data/home
-- 数据使用: 表名.字段名, 对于没有指定表名的列,会从 expr_tables 推断
m_stddev(turn, 30) AS score
-- 使用 float 类型。默认是高精度 decimal.Decimal, 不能和float直接相乘""",
expr_filters="""list_sector = 1
is_risk_warning = 0
close / adjust_factor > 5
list_days >= 200""",
expr_tables="""cn_stock_prefactors_community""",
extra_fields="""date, instrument""",
order_by="""date, instrument""",
expr_drop_na=True,
sql="""SELECT date, instrument, m_stddev(turn, 30) AS turn_std, sw2021_level1,
turn_std - AVG(turn_std) OVER (PARTITION BY sw2021_level1) AS score
FROM cn_stock_prefactors
WHERE list_sector = 1
AND is_risk_warning = 0
AND close / adjust_factor > 5
AND list_days >= 200
QUALIFY COLUMNS(*) IS NOT NULL
ORDER BY date""",
extract_data=False,
m_name="""m2"""
)
# @module(position="-305,-645", comment="""持股数量、打分到仓位""")
m3 = M.score_to_position.v4(
input_1=m2.data,
score_field="""score ASC""",
hold_count=5,
position_expr="""-- DAI SQL 算子/函数: https://bigquant.com/wiki/doc/dai-PLSbc1SbZX#h-%E5%87%BD%E6%95%B0
-- 在这里输入表达式, 每行一个表达式, 输出仓位字段必须命名为 position, 模块会进一步做归一化
-- 排序倒数: 1 / score_rank AS position
-- 对数下降: 1 / log2(score_rank + 1) AS position
-- TODO 拟合、最优化 ..
-- 等权重分配
1 AS position
""",
total_position=1,
extract_data=False,
m_name="""m3"""
)
# @module(position="-245,-493", comment="""抽取预测数据""")
m4 = M.extract_data_dai.v20(
sql=m3.data,
start_date="""2019-01-01""",
start_date_bound_to_trading_date=True,
end_date="""2024-04-29""",
end_date_bound_to_trading_date=True,
before_start_days=90,
keep_before=False,
debug=False,
m_name="""m4"""
)
# @module(position="-157,-361", comment="""交易,日线,设置初始化函数和K线处理函数,以及初始资金、基准等""")
m5 = M.bigtrader.v47(
data=m4.data,
options_data=m6.data,
start_date="""""",
end_date="""""",
initialize=m5_initialize_bigquant_run,
before_trading_start=m5_before_trading_start_bigquant_run,
handle_tick=m5_handle_tick_bigquant_run,
handle_data=m5_handle_data_bigquant_run,
handle_trade=m5_handle_trade_bigquant_run,
handle_order=m5_handle_order_bigquant_run,
after_trading=m5_after_trading_bigquant_run,
capital_base=15000,
frequency="""daily""",
product_type="""股票""",
rebalance_period_type="""交易日""",
rebalance_period_days="""20""",
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="""中证500指数""",
plot_charts=True,
debug=False,
backtest_only=False,
m_name="""m5"""
)
# </aistudiograph>
\