【量化】4天学会python机器学习与量化交易-笔记1(p6~p10)

视频:4天学会python机器学习与量化交易
平台:米筐
4天学会python机器学习与量化交易,肯定是不可能的,最多入个门。
学习原因:
1,讲在线策略,免去本地搭建环境,下载数据等琐事。
2,主要讲A股交易,和有的量化资料不一样(讲期权),有实用价值。
3,讲的比较简单,适合入门。

2020.2.12 开始学习,之前没学过,看看要多久看完并学会,立个flag。

p6 获取板块、交易行情数据

RQData API文档:这里
获取板块、交易行情数据
1,获取股票

def init(context):
    context.s1 = '000001.XSHE'
    
    #获取计算机通信行业股票
    context.stock_list = industry('C39')

    #获取能源板块股票
    context.sector_list = sector('Energy')

    #获取指数成分股股票,如沪深300指数股票  (相当于获取股票池)
    context.index_list = index_components('000300.XSHG')

2,获取价格
2.1 收盘价格 history_bars
这里指获取获取该股票某一天前面5天的收盘价格

def handle_bar(context,bar_dict):
    close = history_bars(context.s1, 5, '1d', 'close')
    logger.info(close)

结果:

2016-09-28  INFO  [9.16 9.15 9.04 9.06 9.05]
2016-09-29  INFO  [9.15 9.04 9.06 9.05 9.06]
2016-09-30  INFO  [9.04 9.06 9.05 9.06 9.07]
2016-09-30  WARN  订单被拒单: [600397.XSHG] 已涨停。
2016-09-30  WARN  订单创建失败: 下单量为0
2016-09-30  WARN  订单创建失败: 下单量为0

其中,[9.16 9.15 9.04 9.06 9.05],9.05(最右边的)为9.28号的价格。close的类型为<class 'numpy.ndarray'>

2.2 获取多个指标
变成2维数据

def handle_bar(context,bar_dict):
    #获取前面5天收盘价
    close = history_bars(context.s1, 5, '1d', 'close')
    # 获取多个指标
    history_1 = history_bars(context.s1, 5, '1d', ['close', 'open'])
    print(history_1)

结果:

2016-09-28  INFO  [(9.16, 9.1 ) (9.15, 9.16) (9.04, 9.13) (9.06, 9.04) (9.05, 9.06)]
2016-09-29  INFO  [(9.15, 9.16) (9.04, 9.13) (9.06, 9.04) (9.05, 9.06) (9.06, 9.05)]
2016-09-30  INFO  [(9.04, 9.13) (9.06, 9.04) (9.05, 9.06) (9.06, 9.05) (9.07, 9.06)]
2016-09-30  WARN  订单创建失败: 下单量为0
2016-09-30  WARN  订单创建失败: 下单量为0

2.3 获取分钟数据

    # 获取1分钟
    close_1min = history_bars(context.s1, 5, '1m', 'close')

要将右边时间选项修改为“分钟”。

p7 获取财务数据与定时器

获取财务数据与定时器

bar_dict也可以获取行情数据,但只能获取当前日期的。

get_fundamentals()获取财务数据,基本面,用来选股。在before_trading或handle_bar中调用,不能在init调用。回测时不用。

1,获取市盈率PE - 简单查询

def before_trading(context):
    # 获取财务数据,默认获取所有A股的股票财务数据
    # 创建查询语句
    q = query(fundamentals.eod_derivative_indicator.pe_ratio)
    # 回测不需要传日期,默认当天的数据
    fund = get_fundamentals(q)

    logger.info(fund.T)
    pass

2,过滤查询

def handle_bar(context,bar_dict):
    # 获取财务数据,默认获取所有A股的股票财务数据
    # 创建查询语句
    # 增加filter
    q = query(
        fundamentals.eod_derivative_indicator.pe_ratio,
        fundamentals.eod_derivative_indicator.pcf_ratio
    ).filter(
        fundamentals.eod_derivative_indicator.pe_ratio > 20,
        fundamentals.eod_derivative_indicator.pcf_ratio < 50
    ).order_by(
        fundamentals.eod_derivative_indicator.pe_ratio
    ).filter(
        fundamentals.stockcode.in_(context.index_list)
    ).limit(10)
    # 回测不需要传日期,默认当天的数据
    fund = get_fundamentals(q)

    logger.info(fund.T)
    pass

3,定时器scheduler
通过财务数据选股,不会每天获取,常以每周/每月选取。
定时器必须在init中使用。
例子:按月查询。

def init(context):
    # 定义按月运行的一个定时运行器
    # 每月只运行一次,指定第一个交易日
    scheduler.run_monthly(get_data, tradingday=1)

def get_data(context, bar_dict):
    #函数都不用return
    # 在这里按月去查询财务数据
    q = query(
        fundamentals.eod_derivative_indicator.pb_ratio
    ).filter(fundamentals.stockcode.in_(context.index_list))

    fund = get_fundamentals(q)

    logger.info(fund.T)

运行顺序:

  • 按月
  • scheduler.run_monthly(get_data, tradingday=1)
  • 2月,2月1号假设为第一个交易日,before_trading -> get_data -> handle_bar
  • 2月其他日期,before_trading -> handle_bar

p8 投资组合与交易

投资组合与交易

1,
在handle_bar进行交易。默认按收盘价买入(撮合方式:当前bar收盘价)。

def handle_bar(context,bar_dict):
    # 进行交易
    # 每天的收盘价,假如第一天11.33*1000
    # order_shares(context.s1, 1000)

    # 按持仓比例,始终占0.1,有买有卖
    order_target_percent(context.s1, 0.10)

2,限价单,市价单

  • 限价单:挂单,市价20.1,指定20.5卖出,19.2买入(先等它降价,再买)
  • 市价单:目的为了快速成交,当前市价多少,买入、卖出就是多少(默认)
  • 滑点的设置影响:为了更好的模拟实际交易中订单对市场的冲击,引入滑点。例如,设置滑点为0.1,原本买入价格为10元,设置后成交价格为11元,因为买的人太多了。
    – 在回测中使用。成交价更高。一般默认取0.1即可。
  • 交易的卖空设置:股票T+1,不要设置。

3,投资组合 portfoilo

  • 资金:可用价值,市场价值,总价值
  • 仓位:当前持有的股票代码数量 等相关信息
  • stock_account也可以查看相关信息
def handle_bar(context,bar_dict):
    # 按持仓比例,始终占0.1,有买有卖
    order_target_percent(context.s1, 0.10)
    order_target_percent("000004.XSHE", 0.10)

    # 一旦买入交易之后,投资组合会发生变化
    # 资金、仓位
    print(context.stock_account) #这种也可以
    print("-----")
    print(context.portfolio.positions.keys()) #一般使用这种
    print(context.portfolio.positions[context.s1].quantity) #持股数量

    print("-----")
    print("投资组合的可用资金为", context.portfolio.cash)
    print("投资组合的市场价值为", context.portfolio.market_value)
    print("投资组合的总价值为", context.portfolio.total_value)

结果:

2016-01-04  INFO  StockAccount({'daily_pnl': -200295.42416000017, 'margin': 1985482.0, 'positions': ['000004.XSHE', '000001.XSHE'], 'transaction_cost': 1747.2241600000002, 'cash': 7814222.57584, 'type': 'STOCK', 'dividend_receivable': 0, 'total_value': 9799704.57584, 'position_pnl': 0, 'trading_pnl': -198548.2000000002, 'market_value': 1985482.0, 'frozen_cash': 0.0, 'total_cash': 7814222.57584})
2016-01-04  INFO  -----
2016-01-04  INFO  ['000001.XSHE', '000004.XSHE']
2016-01-04  INFO  88100
2016-01-04  INFO  -----
2016-01-04  INFO  投资组合的可用资金为 7814222.57584
2016-01-04  INFO  投资组合的市场价值为 1985482.0
2016-01-04  INFO  投资组合的总价值为 9799704.57584
......

p9 策略的收益指标

视频位置:策略的收益指标
1,策略的评价指标

  • 收益指标
    – 回测收益率:(最终总价值-初始总价值)/初始总价值
    – 基准收益:参考的标准,市场表现情况作为标准来看我们的策略。默认HS300.
    – 年化收益率:平均每年的收益情况,重点看这个。年化一般达到15%~30%较好,当然越高越好。

p10 策略风险指标

视频链接:策略风险指标

1,风险指标

  • 风险指标指的是,在获取收益的时候,承担一些风险。
  • 最大回撤比率:最大回撤最好保持在10%~30%之间,越小越好。
  • 夏普比例:夏普比例越大越好,越大说明单位风险所获得的风险汇报越高。
    – 如国债为4%收益,你的收益为16%,波动为5%,那么夏普比例为:(16%-4%)/5%
    – 一般要使你的策略达到1.5以上才较好。通常为0.7~1.5

未完待续。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章