写的策略跑不起来,有大神能帮忙看看哪里出bug吗?

用户头像mx_**896sgf
2024-08-15 发布

初始化函数,全局只运行一次

import numpy as np
import datetime

---------------------------

ETF

---------------------------

初始化函数

def initialize(context):

输出内容到日志

log.info('ETF')
print('--------------------')

设置基准为沪深300

set_benchmark('000300.SH')

开启动态复权模式(使用真实价格)

set_option('pre')

过滤掉order系列API产生的比errer级别低的log

log.set_level('order', 'error')

将滑点设置为0

set_slippage(PriceSlippage(0.02))

设置每笔交易的手续费:买入时佣金万分之三,卖出时佣金万分之三加上股票印花税千分之一,最低佣金5元

set_commission(PerShare(type='stock',cost=0.0001,min_trade_cost=0.0))

检查是否存在未来函数

query_iwencai(query,domain='股票',timeout=6,df=True)

ETF列表 g. 是定义一个全局变量,名字为etf_ls

g.etf_ls = ['560350.SH','510300.SH','510500.SH']

开盘前运行 运行函数名字叫BeforeMarketOpen(开市前) 时间=开盘前运行 参考标的为沪深300

run_daily(BeforeMarketOpen, before_trading(context):
log.info(context.portfolio), reference_security='000300.SH')

预处理-选出符合条件的ETF run_daily是运行函数Preprocess(预处理) 在9:27的时候选出符合的ETF 参考标的是沪深300

run_daily(Preprocess, time='09:27', reference_security='000300.SH')

卖出函数 定义SellFunction函数(卖出)执行时间为9:29 参考标的沪深300

run_daily(SellFunction, time='09:29', reference_security='000300.SH')

买入函数 定义BuyFunction函数(买入) 执行时间为9点半 参考标的为沪深300

run_daily(BuyFunction, time='09:30', reference_security='000300.SH')

收盘后运行 定义函数AfterMarketClose(收盘) 时间为收盘 参考标的沪深300

run_daily(AfterMarketClose, time='after_close', reference_security='000300.XSHG')

return

开盘前运行函数 def(定义) 定义开盘前函数(联系上下)

def BeforeMarketOpen(context):
#打印出列表('--------------------')
print('--------------------')

获取ETF列表,过滤货币、黄金、外盘相关ETF

FilterForeignETF(context, )
#记录(反馈(g.etf_ls))
log.info(len(g.etf_ls))
#返回

return

预处理-选出符合条件的ETF

def Preprocess(context, ):

过滤集合竞价成交额较少的ETF 定义money_least的函数数值为10.0e4 10.0e4等同于10.0 * 10^4,即100000.0

money_least = 10.0e4
#过滤少于10万(联系上下文,符合money_least的条件)
FilterLowMoney(context, money_least)
#存入g.etf_ls列表
log.info(len(g.etf_ls))

选出符合条件的ETF,跌幅大于1%,存入g.etf_ls准备买入 命名为准备好ETF

ratio_least = -1.5
ReadyETF(context, ratio_least)
#存入列表
log.info(len(g.etf_ls))
return

卖出函数

def SellFunction(context,):
#将不在股票池的股票卖出
for etf in context.portfolio.positions.keys():
#卖出所有etf 使etf持仓为0
order_target(etf, 0)
return

买入函数

def BuyFunction(context,):

if len(g.etf_ls)==1 and context.portfolio.available_cash>20000:
# print(g.etf_ls) 获取现金数
cash = context.portfolio.available_cash
#用所有现金买入(g.etf_ls列表内的第一个)
order_percent(g.etf_ls[0],1,price=2.8)
return

收盘后运行函数

def after_trading(context):
#log.info(context.subportfolios)
log.info('--------------------')

log.info('ETF')

return

获取ETF列表,过滤货币、黄金、外盘相关ETF

def FilterForeignETF(context):

获取ETF信息 获取etf_info=平台支持的所有基金股票等(只获取etf,日期=当前的)

etf_info = get_all_securities(ty='etf', date=context.current_dt)

g.etf_ls = []
#建立一个ss的文档,包含以下的标的
ss = ['港','H','恒','纳','标普','道','美国','MSCI','中概', '债','黄金',
'国开','短融','货币','沙特','日经','东南亚','225','德国','法国','豆粕',
'亚太','中韩','东证','快线','快钱','城投']

#每天更新etf列表 组合成名为etf_info的数组
for etf in etf_info.index:
#名字是etf_info(带股票名字ETF)
name = etf_info['name'][etf]

f = 1
for s in ss:
    if s in name:
        f = -1
        break

if f == 1: 
    g.etf_ls.append(etf)

return g.etf_ls

过滤集合竞价成交额较少的ETF

def FilterLowMoney(context, ml):

获取开盘成交额 df=获得指定时间内的集合竞价(标的代码=g.etf_ls,开始日期=回测中默认值会随着回测日期变化而变化,)

def = open_auction:
order(security=g.etf_ls, start_date=context.current_dt,
#结束日期=回测中默认值会随着回测日期变化而变化,进取当前剩余金钱数据
end_date=context.current_dt, fields=['time','current','turnover'])
#设置指数(钥匙=股票代码 )
df.set_index(keys='code', inplace=True)

过滤开盘成交额较少的ETF 创建df列表 df列表是成交金额大于ml函数

df = df[df['turnover'] > money_least]
#g.etf_ls=df组成的股票池
g.etf_ls = list(df.index)
return

选出符合条件的ETF,存入g.etf_ls准备买入

def ReadyETF(context, rl):

获取开盘价 df=获取指定时间区间内集合竞价时的 tick 数据(标的列表=g.etf_ls,查询时间,当前价,累计成交额 )

df = open_price(reference_security=g.etf_ls, start_date=context.current_dt,
end_date=context.current_dt, fields=['time','current','turnover'])
df.set_index(keys='code', inplace=True)
#生成数据=时间,今开,开盘成交额
df.columns = ['时间','今开','开盘成交额']

获取昨日收盘价

close_df = pre_price(security=g.etf_ls, count=1, end_date=context.previous_date, panel=False)
close_df.set_index('code', inplace=True)
df['昨收'] = close_df['close']

计算开盘涨幅,选出跌幅较大的五只ETF

df['开盘涨幅'] = (df['今开'] / df['昨收'] - 1) * 100
df.sort_values(by='开盘涨幅', axis=0, ascending=True, inplace=True)
#如果开盘涨幅列表内的第一个标的大于ratio_least函数时
if df['开盘涨幅'][0] < rl:
#g.etf_ls取第一个标的组成数列
g.etf_ls = [df.index[0]]

评论

用户头像
2024-08-19 11:18:17

内部检查用print(type())检查数据类型

评论
用户头像
2024-08-27 08:42:54

内部检查用print(type())检查数据类型

评论

需要帮助?

试试AI小助手吧