当前位置:网站首页>聚宽 - 简单策略试验
聚宽 - 简单策略试验
2022-06-21 23:53:00 【WinnieJiang】
几种简单策略及其回测结果,基于聚宽平台测试。
策略1:均价-昨日收盘价策略(均线策略)
具体描述:计算该股一定时间(设为days)内的收盘均价,若低于昨日收盘价,则用当前所有资金买入股票;若高于收盘价,则将股票仓位调整到0,即全卖出。
策略模板代码
def initialize(context):# 初始化
g.security = '600276.XSHG'# 股票代码,XSHG:上海证券交易所,XSHE:深圳证券交易所
def handle_data(context, data):# 每日循环
last_price = data[g.security].close# 取得最近日收盘价
# 获取该股票买前days日内的平均收盘价格
average_price = data[g.security].mavg(days, 'close')
cash = context.portfolio.cash# 取得当前的现金
# 如果昨日收盘价高出days日平均价,则买入,否则卖出
if last_price > average_price:
order_value(g.security, cash)# 用当前所有资金买入股票
elif last_price < average_price:
order_target(g.security, 0)# 将股票仓位调整到0,即全卖出
特点:该策略只有检测到变化后才会进行买卖,因此无法实现抄底,当然,也不会跌到最低值才卖出。
结论:经过测试,当股票在回测时期内上涨,days一般越高越好;反之,若股票下跌,则缩短days可以及时止损。
以下为一些医疗企业运行该策略的回测结果。
000538 云南白药
时间:2019/3/1-2020/3/1
days:30日
策略收益: − 27.05 % \color{#55FF55}{-27.05\%} −27.05%
基准收益: 7.38 % \color{#FF0000}{7.38\%} 7.38%
简单分析了一下原因:云南白药自2019年3月后一直在跌,只要买入基本必亏。若将时间前置一年开始,则会得到如下结果。
时间:2018/3/1-2019/3/1
days:30日
策略收益: 7.85 % \color{#FF0000}{7.85\%} 7.85%
基准收益: − 6.81 % \color{#55FF55}{-6.81\%} −6.81%
结论:云南白药年期间浮动较大,年期内则较为稳定。
600276 恒瑞医药
恒瑞医药作为国内创新药龙头股,发展势头良好,以下为回测结果。
时间:2019/3/1-2020/3/1
days:45日
策略收益: 13.59 % \color{#FF0000}{13.59\%} 13.59%
基准收益: 7.38 % \color{#FF0000}{7.38\%} 7.38%
601607 上海医药
时间:2019/12/1-2020/3/1(近期)
days:30日
策略收益: 4.61 % \color{#FF0000}{4.61\%} 4.61%
基准收益: 2.91 % \color{#FF0000}{2.91\%} 2.91%
贸易出口上市公司测试
时间:2019/12/1-2020/3/1
days:30日
基准收益: 2.91 % \color{#FF0000}{2.91\%} 2.91%
| 股票代码 | 股票名称 | 所属行业 | 策略收益 |
|---|---|---|---|
| 600146 | 商赢环球 | 服装 | -11.27% |
| 300078 | 思科医惠 | 电子 | -22.94% |
| 002489 | 浙江永强 | 休闲用品 | -11.37% |
| 002611 | 东方精工 | 工业机械 | -10.76% |
| 002640 | 跨境通 | 互联网零售 | 1.59% |
结论:受疫情与政策影响,跨境类出口贸易公司近期普遍受到较大影响。
策略2:均价交叉策略(双均线策略)
基本思想:双均线就是两条均线,比如5日均线和10日均线。由短周期均线自下向上穿越长周期的均线,则形成“金叉”,反之为“死叉”。双均线金叉的时候,表明该股近期很强势,反之很弱势。据此在强势的时候买入,弱势的时候卖出。
策略模板代码(此处设置为5日与20日均线)
# 初始化函数
def initialize(context):
g.security='300027.XSHE'
#设置每天运行
run_daily(handle)
def handle(context):
security=g.security
n5=5
n20=20
# 获取股票的收盘价
close_data = attribute_history(security, n20, '1d',"close",df=False)
print(close_data)
# 取得过去 ma_n1 天的平均价格
ma_n5 = close_data['close'][-n5:].mean()
# 取得过去 ma_n2 天的平均价格
ma_n20 = close_data['close'][-n20:].mean()
print(ma_n5,ma_n20)
# 取得当前的现金
cash = context.portfolio.available_cash
# 如果当前有余额
if ma_n5 > ma_n20:
# 用所有 cash 买入股票,order_value是买卖价值
order_value(security, cash)
# 记录这次买入
log.info("Buying %s" % security)
# 如果n5日均线小于n20日均线,并且目前有头寸
elif ma_n5 < ma_n20 and context.portfolio.positions[security].closeable_amount > 0:
# 全部卖出,order_target是买卖数量
order_target(security, 0)
# 绘制n5日均线价格
record(ma_n5=ma_n5)
# 绘制n20日均线价格
record(ma_n20=ma_n20)
策略3:追涨策略
具体描述:在股票闭盘2小时前,即13:00对选定股票进行判断。若今日涨幅超过4%:当前价格/今日开盘价>1.040,则用当前所有资金买入股票;第二日开盘时全部卖出。
*注:自聚宽API-多股票追涨策略修改而来
策略模板代码
# 初始化程序, 整个回测只运行一次
def initialize(context):
g.stock = '600160.XSHG'
# 让每天早上开盘时执行 morning_sell_all
run_daily(morning_sell_all, '09:30')
def morning_sell_all(context):
order_target(g.stock, 0)
# 在每分钟的第一秒运行, data 是上一分钟的切片数据
def handle_data(context, data):
# 判断是否在当日最后的2小时,我们只追涨最后2小时满足追涨条件的股票
if context.current_dt.hour < 13:
return
# 得到当前价格
price = data[g.stock].close
current_data = get_current_data()
last_close = current_data[g.stock].day_open
if price/last_close > 1.040 and price/last_close < 1.099:
# 得到当前资金余额
cash = context.portfolio.available_cash
order_value(g.stock, cash)
以巨化股份进行测试
策略横测
参数说明
时间:2019/3/1-2020-3/1
基准收益:7.38%
策略一:days=30
策略二:5日与20日双均线
策略三:涨幅阈值:4%
房地产企业
注:恒大、融创、万达、碧桂园、SOHO均未在A股上市
| 股票代码 | 股票名称 | 策略一 | 策略二 | 策略三 |
|---|---|---|---|---|
| 000002 | 万科A | 0.35% | -5.91% | -4.50% |
| 000402 | 金融街 | -9.87% | -8.85% | 0.50% |
| 002146 | 荣盛发展 | -7.56% | -7.16% | 0.61% |
| 600048 | 保利地产 | -9.04% | -8.83% | -6.88% |
上市银行
大型银行
| 股票代码 | 股票名称 | 策略一 | 策略二 | 策略三 |
|---|---|---|---|---|
| 601398 | 工商银行 | -5.33% | -4.28% | -1.02% |
| 601328 | 交通银行 | -9.58% | -15.65% | 0.00% |
| 601288 | 农业银行 | -9.92% | -10.21% | 0.00% |
| 601818 | 光大银行 | -4.21% | -2.35% | -10.49% |
城市商业银行
| 股票代码 | 股票名称 | 策略一 | 策略二 | 策略三 |
|---|---|---|---|---|
| 600926 | 杭州银行 | -14.54% | -7.73% | -2.48% |
| 601009 | 南京银行 | 1.95% | 1.86% | -6.74% |
| 601169 | 北京银行 | -16.41% | -11.44% | 0.00% |
| 002142 | 宁波银行 | 11.02% | 15.36% | -1.44% |
政策性银行
| 股票代码 | 股票名称 | 策略一 | 策略二 | 策略三 |
|---|---|---|---|---|
| 600000 | 浦东发展银行 | -12.70% | -8.12% | 102.72% |
策略4(选股策略):小市值策略
具体描述:每天找出市值排名最小的前stocksnum只股票作为要买入的股票。若已持有的股票的市值已经不够小而不在要买入的股票中,则卖出这些股票。买入要买入的股票,买入金额为当前可用资金的stocksnum分之一。
策略模板代码
def initialize(context):
run_daily(period,time='every_bar')
# 设定好要交易的股票数量
g.stocksnum = 7
# 设定交易周期
g.period = 13
# 记录策略进行天数
g.days = 0
def period(context):
# 判断策略进行天数是否能被轮动频率整除余1
if g.days % g.period == 0:
# 代码:找出市值排名最小的前stocksnum只股票作为要买入的股票
# 获取上证指数和深证综指的成分股代码并连接,即为全A股市场所有股票的股票代码
# 用加号可以连接两个list
scu = get_index_stocks('000001.XSHG')+get_index_stocks('399106.XSHE')
# 选出在scu内的市值排名最小的前stocksnum只股票
q=query(valuation.code
).filter(
valuation.code.in_(scu)
).order_by(
valuation.market_cap.asc()
).limit(g.stocksnum)
df = get_fundamentals(q)
# 选取股票代码并转为list
buylist=list(df['code'])
# 代码:若已持有的股票的市值已经不够小而不在要买入的股票中,则卖出这些股票。
# 对于每个当下持有的股票进行判断:现在是否已经不在buylist里,如果是则卖出
for stock in context.portfolio.positions:
if stock not in buylist: #如果stock不在buylist
order_target(stock, 0) #调整stock的持仓为0,即卖出
# 代码:买入要买入的股票,买入金额为可用资金的stocksnum分之一
# 将资金分成g.stocksnum份
position_per_stk = context.portfolio.cash/g.stocksnum
# 用position_per_stk大小的g.stocksnum份资金去买buylist中的股票
for stock in buylist:
order_value(stock, position_per_stk)
# 策略进行天数增加1
g.days = g.days + 1
几组测试
时间:2019/8/1-2020/2/1
策略收益: 11.95 % \color{#FF0000}{11.95\%} 11.95%
基准收益: 4.39 % \color{#FF0000}{4.39\%} 4.39%
时间:2015/8/1-2020/2/1
策略收益: 214.65 % \color{#FF0000}{214.65\%} 214.65%
基准收益: 4.90 % \color{#FF0000}{4.90\%} 4.90%
边栏推荐
- Introduction and use of pytest fixture, confitest and mark
- 【Try to Hack】nmap
- SQL语句——数据更新、修改、删除
- 位运算位或
- The importance of rational selection of seal clearance of hydraulic slip ring
- 数字化转型的下一个目标:提供准时制信息
- Two popular architectures for web application system development
- Lecture 3 of Data Engineering Series: characteristic engineering of data centric AI
- 【DailyFresh】课程记录
- Record a small JSP bug
猜你喜欢

花了2小时,搭建了一个物联网项目,值了 ~
![Chapter VIII exercises (45A) [microcomputer principles] [exercises]](/img/79/8311a409113331e72f650a83351b46.png)
Chapter VIII exercises (45A) [microcomputer principles] [exercises]

Document.readyState 如何使用和侦听

面试官竟然问我订单ID是怎么生成的?难道不是MySQL自增主键?

Getting started with go web programming: validators

pytorch学习05:索引和切片

12 BeautifulSoup类的初始化

如何使用物联网低代码平台进行报表管理?

Document. How to use and listen for readyState

Mendix公司新任CFO Tom Ellison通过领导团队转型推动公司下一阶段高速增长
随机推荐
Record a small JSP bug
花了2小时,搭建了一个物联网项目,值了 ~
Acwing match 56 Weekly
WinCE 下 ListCtl virtual mode的使用
Enterprises can improve database security in four ways
Thinking about a web offline interview
[2023 approval in advance] China Singapore SECCO
Lecture 3 of Data Engineering Series: characteristic engineering of data centric AI
How to judge pure IP? Where can I find it? Is it Expensive?
如何判断一个男人将来是穷还是富?
【2023提前批 之 面经】~ 青岛鼎信科技
Getting started with go web programming: validators
跨境贸易和跨境电商的三大区别简单分析
Bit operation bit or
The importance of rational selection of seal clearance of hydraulic slip ring
怎么读一篇论文
Harmonyos application development second assignment notes
记录一次小jsp的bug
0x00007ffff3d3ecd0 in Io Vfprintf Interne (S = 0x7ffff40b5620 < io 2 1 stdout >
滴滴工程效能平台建设之路