傻瓜策略-PE中位数ETF投资法

回测平台: 聚宽 https://www.joinquant.com/

基准指数选择为沪深300指数,交易标的为510310(沪深300ETF)。
策略内容:
每个月5日计算沪深300指数的成分股PE,如果PE中位数低于25则满仓买入沪深300ETF,如果PE中位数超过40,则清仓。
测试时间:2013-04-01至2018-03-05
(由于沪深300ETF上市日期为2013年3月29日,固此策略无法追溯的更早)

回测结果:

基准收益 61.04%
策略收益 110.70%
策略年化收益 16.81%
最大回撤 18.637%
Alpha 0.104
Beta 0.373

策略代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
def initialize(context):
g.__mycash=1000000
g.__mysecurity = '510310.XSHG'
#获取沪深300成分股
g.security = get_index_stocks('000300.XSHG')
set_universe(g.security)
#设置基准收益
set_benchmark('000300.XSHG')
set_order_cost(OrderCost(open_tax=0,
close_tax=0.001, open_commission=0.0003,
close_commission=0.0003, close_today_commission=0,
min_commission=5), type='stock')
run_monthly(Deal,5)


def Deal(context):
security=g.security
#g.__mycash+=5000
PE = get_fundamentals(query(
valuation.pe_ratio_lyr
).filter(
valuation.code.in_(g.security)
))
PE_list=PE.pe_ratio_lyr.tolist()
templist=[]
for x in PE_list:
if x >= 0:
templist.append(x)
PE_list=templist[:]
PE_list.sort()
pe_mean = int(PE_list[len(PE_list)/2])
#"""
log.info("PE %s" % (pe_mean))
if (pe_mean <= 25):
order_target_value(g.__mysecurity, g.__mycash)
elif (pe_mean > 25 and pe_mean <= 35):
pass
else:
order_target_value(g.__mysecurity,0)
#elif (pe_mean > 35 and pe_mean <= 35):
# order_target_value(g.__mysecurity, g.__mycash*0.85)


def handle_data(context,data):
pass