利用Python分析股票(七):量化策略

 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
46
47
48
49
50
51
52
from jqdata import *

def initialize(context):
    # 设定中证银行指数作为基准
    set_benchmark('399986.XSHE')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 过滤掉order系列API产生的比error级别低的log
    log.set_level('order', 'error')

    ### 股票相关设定 ###
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')

    run_weekly(choose_stock, weekday=3, time='before_open') #选股
    run_weekly(weekly, weekday=3, time='open')

    g.count = 1


def choose_stock(context):
    # 得到中证银行指数的成分股
    g.stocks = get_index_stocks('399986.XSHE')

    # 查询股票的市净率,并按照市净率升序排序
    if len(g.stocks) > 0:
        g.df = get_fundamentals(
            query(
              valuation.code,
              valuation.pubDate,
               valuation.pb_ratio,
            ).filter(
                valuation.code.in_(g.stocks)
            ).order_by(
                valuation.pb_ratio.asc()
            )
        )

        # 找出最低市净率的一只股票
        g.code = g.df['code'][0]

def weekly(context):
    print("第{count}次交易,日期{date}".format(count=g.count,date=context.current_dt.isoweekday()))
    if g.count == 1:
        order_value('512800.XSHG',context.portfolio.starting_cash)
    else:
        # 先卖出etf
        order_value('512800.XSHG',-100000)
        # 剩余金额买入最低市值的股票
        order_value(g.code,context.portfolio.available_cash)

    g.count += 1

实际上并没有跑赢银行ETF

因为2020年底,银行股出现分化,民生银行,华夏银行、交通银行等都在刷新市净的历史新低

微信截图_20210920161938