PDF下载 下载

小市值(股票)

阅读 600
  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. from gm.api import *
  4. from datetime import timedelta
  5. """
  6. 小市值策略
  7. 本策略每个月触发一次,计算当前沪深市场上市值最小的前30只股票,并且等权重方式进行买入。
  8. 对于不在前30的有持仓的股票直接平仓。
  9. 回测时间为:2018-07-01 08:00:00 到 2019-10-01 16:00:00
  10. """
  11. def init(context):
  12. # schedule 定时任务详见: https://www.myquant.cn/docs/python/python_basic#7bce6621a1abafe8
  13. # 每月第一个交易日的09:40 定时执行algo任务
  14. schedule(schedule_func=algo, date_rule='1m', time_rule='09:40:00')
  15. # 使用多少的资金来进行开仓。
  16. context.ratio = 0.8
  17. def algo(context):
  18. # 获取当前时间
  19. now = context.now
  20. # 选取全A股(剔除停牌和st股和上市不足50日的新股和退市股和B股)
  21. date1 = (context.now - timedelta(days=100)).strftime("%Y-%m-%d %H:%M:%S")
  22. date2 = context.now.strftime("%Y-%m-%d %H:%M:%S")
  23. # 通过get_instruments获取所有的上市股票代码 详见:https://www.myquant.cn/docs/python/python_select_api#8ba2064987fb1d1f
  24. all_stock = get_instruments(exchanges='SHSE, SZSE', sec_types=[1], fields='symbol, listed_date, delisted_date',
  25. df=True)
  26. code = all_stock[(all_stock['listed_date'] < date1) & (all_stock['delisted_date'] > date2) &
  27. (all_stock['symbol'].str[5] != '9') & (all_stock['symbol'].str[5] != '2')]
  28. # 获取所有股票在这个时候的市值, 详见: https://www.myquant.cn/docs/python/python_select_api#8ba2064987fb1d1f
  29. fundamental = get_fundamentals_n('trading_derivative_indicator', code['symbol'].to_list(),
  30. context.now, fields='TOTMKTCAP', order_by='TOTMKTCAP', count=1, df=True)
  31. # 对市值进行排序,并且获取前30个。 最后将这个series 转化成为一个list即为标的池
  32. trade_symbols = fundamental.reset_index(drop=True).loc[:29, 'symbol'].to_list()
  33. print('本次股票池有股票数目: ', len(trade_symbols))
  34. # 计算每个个股应该在持仓中的权重
  35. percent = 1.0 / len(trade_symbols) * context.ratio
  36. # 获取当前所有仓位 详见 https://www.myquant.cn/docs/python/python_concept#8079e2e4dad05879
  37. positions = context.account().positions()
  38. # 平不在标的池的仓位
  39. for position in positions:
  40. symbol = position['symbol']
  41. if symbol not in trade_symbols:
  42. order_target_percent(symbol=symbol, percent=0, order_type=OrderType_Market,
  43. position_side=PositionSide_Long)
  44. print('市价单平不在标的池的', symbol)
  45. # 将标中已有持仓的和还没有持仓的都调整到计算出来的比例。
  46. for symbol in trade_symbols:
  47. order_target_percent(symbol=symbol, percent=percent, order_type=OrderType_Market,
  48. position_side=PositionSide_Long)
  49. print(symbol, '以市价单调整至权重', percent)
  50. if __name__ == '__main__':
  51. '''
  52. strategy_id策略ID,由系统生成
  53. filename文件名,请与本文件名保持一致
  54. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  55. token绑定计算机的ID,可在系统设置-密钥管理中生成
  56. backtest_start_time回测开始时间
  57. backtest_end_time回测结束时间
  58. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  59. backtest_initial_cash回测初始资金
  60. backtest_commission_ratio回测佣金比例
  61. backtest_slippage_ratio回测滑点比例
  62. '''
  63. run(strategy_id='strategy_id',
  64. filename='main.py',
  65. mode=MODE_BACKTEST,
  66. token='token_id',
  67. backtest_start_time='2010-07-01 08:00:00',
  68. backtest_end_time='2019-10-01 16:00:00',
  69. backtest_adjust=ADJUST_PREV,
  70. backtest_initial_cash=1000000,
  71. backtest_commission_ratio=0.0001,
  72. backtest_slippage_ratio=0.0001)

0 篇笔记