当前位置首页 > 市场分析

跨品种套利(期货)_量化投资知识

阅读次数: 次  来源:量化投资  发布时间:2019-12-21

 1. # coding=utf-8

2. from __future__ import print_function, absolute_import, unicode_literals

3. from gm.api import *

4. import numpy as np

5. 

6. '''

7. 本策略根据计算滚动的.过去的30个1min的bar的均值正负2个标准差得到布林线

8. 并在最新价差上穿上轨来做空价差,下穿下轨来做多价差

9. 并在回归至上下轨水平内的时候平仓

10. 回测数据为:SHFE.rb1801和SHFE.hc1801的1min数据

11. 回测时间为:2017-09-01 08:00:00到2017-10-01 16:00:00

12. '''

13. 

14. 

15. def init(context):

16. # 进行套利的品种

17. context.goods = ['SHFE.rb1801', 'SHFE.hc1801']

18. # 订阅行情

19. subscribe(symbols=context.goods, frequency='60s', count=31, wait_group=True)

20. 

21. 

22. def on_bar(context, bars):

23. # 获取两个品种的时间序列

24. data_rb = context.data(symbol=context.goods[0], frequency='60s', count=31, fields='close')

25. close_rb = data_rb.values

26. data_hc = context.data(symbol=context.goods[1], frequency='60s', count=31, fields='close')

27. close_hc = data_hc.values

28. # 计算价差

29. spread = close_rb[:-1] - close_hc[:-1]

30. # 计算布林带的上下轨

31. up = np.mean(spread) + 2 * np.std(spread)

32. down = np.mean(spread) - 2 * np.std(spread)

33. # 计算最新价差

34. spread_now = close_rb[-1] - close_hc[-1]

35. # 无交易时若价差上(下)穿布林带上(下)轨则做空(多)价差

36. position_rb_long = context.account().position(symbol=context.goods[0], side=PositionSide_Long)

37. position_rb_short = context.account().position(symbol=context.goods[0], side=PositionSide_Short)

38. if not position_rb_long and not position_rb_short:

39. if spread_now > up:

40. order_target_volume(symbol=context.goods[0], volume=1, order_type=OrderType_Market,

41. position_side=PositionSide_Short)

42. print(context.goods[0], '以市价单开空仓一手')

43. order_target_volume(symbol=context.goods[1], volume=1, order_type=OrderType_Market,

44. position_side=PositionSide_Long)

45. print(context.goods[1], '以市价单开多仓一手')

46. if spread_now < down:

47. order_target_volume(symbol=context.goods[0], volume=1, order_type=OrderType_Market,

48. position_side=PositionSide_Long)

49. print(context.goods[0], '以市价单开多仓一手')

50. order_target_volume(symbol=context.goods[1], volume=1, order_type=OrderType_Market,

51. position_side=PositionSide_Short)

52. print(context.goods[1], '以市价单开空仓一手')

53. # 价差回归时平仓

54. elif position_rb_short:

55. if spread_now <= up:

56. order_close_all()

57. print('价格回归,平所有仓位')

58. # 跌破下轨反向开仓

59. if spread_now < down:

60. order_target_volume(symbol=context.goods[0], volume=1, order_type=OrderType_Market,

61. position_side=PositionSide_Long)

62. print(context.goods[0], '以市价单开多仓一手')

63. order_target_volume(symbol=context.goods[1], volume=1, order_type=OrderType_Market,

64. position_side=PositionSide_Short)

65. print(context.goods[1], '以市价单开空仓一手')

66. elif position_rb_long:

67. if spread_now >= down:

68. order_close_all()

69. print('价格回归,平所有仓位')

70. # 涨破上轨反向开仓

71. if spread_now > up:

72. order_target_volume(symbol=context.goods[0], volume=1, order_type=OrderType_Market,

73. position_side=PositionSide_Short)

74. print(context.goods[0], '以市价单开空仓一手')

75. order_target_volume(symbol=context.goods[1], volume=1, order_type=OrderType_Market,

76. position_side=PositionSide_Long)

77. print(context.goods[1], '以市价单开多仓一手')

78. 

79. 

80. if __name__ == '__main__':

81. '''

82. strategy_id策略ID,由系统生成

83. filename文件名,请与本文件名保持一致

84. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST

85. token绑定计算机的ID,可在系统设置-密钥管理中生成

86. backtest_start_time回测开始时间

87. backtest_end_time回测结束时间

88. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST

89. backtest_initial_cash回测初始资金

90. backtest_commission_ratio回测佣金比例

91. backtest_slippage_ratio回测滑点比例

92. '''

93. run(strategy_id='strategy_id',

94. filename='main.py',

95. mode=MODE_BACKTEST,

96. token='token_id',

97. backtest_start_time='2017-09-01 08:00:00',

98. backtest_end_time='2017-10-01 16:00:00',

99. backtest_adjust=ADJUST_PREV,

100. backtest_initial_cash=500000,

101. backtest_commission_ratio=0.0001,

102. backtest_slippage_ratio=0.0001)

 

1_副本.jpg