# 标题:【深度解析 二】资产负债与ROA模型
# 导入函数库
from jqdata import *
import warnings
# 初始化函数,设置基准等等
# context 是由系统维护的上下文环境
# 包含买入均价、持仓情况、可用资金等资产组合相关信息
def initialize(context):
# 设置的滑点较高(不设置滑点的话用默认的0.00246)
set_slippage(FixedSlippage(0.02))
# 设置沪深300股指作为基准
# 如果不设置,默认的基准也是沪深300股指
set_benchmark('000300.XSHG')
# 开启动态复权模式(使用真实价格)
set_option('use_real_price', True)
# 避免使用未来数据
set_option('avoid_future_data', True)
# 过滤掉order系列API产生的比error级别低的log
# 默认是 'debug' 参数。最低的级别,日志信息最多
# 系统推荐尽量使用'debug'参数或不显式设置,方便找出所有错误
log.set_level('order', 'error')
# 过滤 'ignore' 级别的警告信息
warnings.filterwarnings('ignore')
# g. 开头的是全局变量
# 一经声明整个程序都可以使用
# 选股参数
# 最大股票持仓数量
g.stock_num = 5
# 仓位比例。计算仓位时使用
g.position = 1
# 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣 5 元钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
# 设置交易时间
# 每个月第一个交易日,上午 10:00 调用 my_trade() 函数
run_monthly(my_trade, monthday=1, time='10:00', reference_security='000300.XSHG')
# 交易函数
# 过滤、筛选、排序生成待买入股票列表
# 并根据待交易股票列表开仓或调整仓位
def my_trade(context):
# 过滤:次新股,ST,ST*,退市,涨停,跌停,停牌 股票
# 根据 资产负债率、不良资产率、优质资产周转率、ROA 增长量等财务指标过滤、排序股票
# 生成待买入股票列表
check_out_list = get_stock_list(context)
# 在日志中输出今日准备购买的股票列表
log.info('今日准备购买的股票:%s' % check_out_list)
# 调整头寸规模
# 卖出不再列表中的股票
# 买入新选出的股票
adjust_position(context, check_out_list)
关键函数解锁后查看:
# 调整仓位
# 第一次全仓买入股票
# 之后,每次卖出不在列表中的过时股票
# 买入新选出来的股票
def adjust_position(context, buy_stocks):
# 遍历当前持仓的每只股票
# 如果这只股票不在买入列表中就全部清仓
for stock in context.portfolio.positions:
if stock not in buy_stocks:
order_target(stock, 0)
# 获取当前资产组合中持仓数量
position_count = len(context.portfolio.positions)
# 如果最大持仓量大于现有持仓量,说明还有买入空间
if g.stock_num > position_count:
# 资产组合中剩余现金除以准备买入的股票数量
# 平均分配剩余资金
value = context.portfolio.cash * g.position / (g.stock_num - position_count)
# 遍历待买入列表中的每一只股票
for stock in buy_stocks:
# 如果这只股票不在持仓列表中就买入 value 额度
if stock not in context.portfolio.positions:
order_target_value(stock, value)
# 如果持仓列表长度等于最大持仓量,说明已经买够股票
# 直接跳出循环
if len(context.portfolio.positions) == g.stock_num:
break
2025-02-23
