当前位置:   article > 正文

Python量化交易策略--双均线策略及代码_python量化交易代码

python量化交易代码

        双均线策略是比较经典的策略,股票的价格均线是投资参考的重要指标。均线有快线和慢线之分,当快线向上穿过慢线则是金叉,一般执行买入操作,当快线向下穿过慢线时则形成死叉,一般执行卖出操作。基于这个基本思路,出于兴趣爱好,便使用python复现了这个量化策略。代码封装如下。

        在运行这个代码块时,请先运行以下代码:

        pip install pandas

        pip install numpy

        pip install matplotlib

        pip install tqdm

        pip install qstock

        在电脑上安装了这些库之后就可以运行下面的封装代码了,具体讲解在代码块下面。

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from tqdm import tqdm
  5. import qstock as qs
  6. class Dual_moving_average_stra():
  7. '''
  8. code --> '000001' str
  9. start_time --> '20220101' str
  10. window0 --> 5 int
  11. window1 --> 10 int
  12. verbose --> bool default=True
  13. plot --> bool default=True
  14. init_money = 10000 一万块本金 看末期能有多少收益
  15. '''
  16. def __init__(self, code, start_time, window0, window1, verbose=True, plot=True):
  17. self.code = code
  18. self.start_time = start_time
  19. self.window0 = window0
  20. self.window1 = window1
  21. self.verbose = verbose
  22. self.plot = plot
  23. def get_data(self):
  24. #print(self.code, self.start_time)
  25. df = qs.get_data(self.code, start=self.start_time, end=None, freq=101, fqt=1)
  26. df['MA_' + str(self.window0)] = df.rolling(self.window0, min_periods=1).mean()['close']
  27. df['MA_' + str(self.window1)] = df.rolling(self.window1, min_periods=1).mean()['close']
  28. df['gold'] = np.nan
  29. df.gold = df['MA_' + str(self.window0)] > df['MA_' + str(self.window1)]
  30. signal = pd.DataFrame()
  31. signal = df.gold.apply(lambda x:1 if x==True else 0)
  32. df['gold_death_cha'] = signal - signal.shift(1).fillna(0)
  33. return df
  34. def strategy(self):
  35. init_money = 10000
  36. quant = 0
  37. df = self.get_data()
  38. signal = df.gold_death_cha
  39. price_list = df.open
  40. money_list = []
  41. for i in tqdm(range(df.shape[0])):
  42. if i+1 == df.shape[0]: # 因为是次日买卖 所以得提前一天结束代码
  43. break
  44. price = price_list.iloc[i+1]
  45. if signal.iloc[i] == 1:
  46. # 金叉全仓买入
  47. quant += int(init_money / (price * 100))
  48. init_money -= quant * price * 100
  49. if self.verbose == True:
  50. print('此次购买数量:', quant)
  51. print('证券价格:', price)
  52. print('本金还剩:',init_money)
  53. print('金叉买入执行完毕----------------------------------')
  54. if signal.iloc[i] == -1:
  55. init_money += quant * price * 100
  56. quant = 0 # 清仓
  57. money_list.append(init_money)
  58. if self.verbose == True:
  59. print('清仓:', quant)
  60. print('证券价格:', price)
  61. print('本金还剩:',init_money)
  62. print('死叉卖出执行完毕----------------------------------')
  63. if self.plot == True:
  64. plt.figure(figsize=(20,20))
  65. plt.subplot(2,1,1)
  66. plt.grid()
  67. plt.plot(df.index, df.close, label='close', linewidth=3)
  68. plt.plot(df.index, df['MA_' + str(self.window0)], c='red', label=('MA_' + str(self.window0)), linewidth=3)
  69. plt.plot(df.index, df['MA_' + str(self.window1)], c='grey', label=('MA_' + str(self.window1)), linewidth=3)
  70. plt.xticks(rotation=45)
  71. plt.legend(fontsize=20)
  72. plt.subplot(2,1,2)
  73. plt.grid()
  74. plt.plot(range(len(money_list)), money_list, linewidth=3, label='money')
  75. plt.xticks(rotation=45)
  76. plt.legend(fontsize=20)
  77. plt.show()

        这是一个金叉死叉的策略,在股价出现死叉时则全仓卖出,在股价出现金叉时则全仓买入,然后给予10000元的本金,查看最后一期能剩余多少本金。

        首先实例化我们的对象:

model = Dual_moving_average_stra('600460', '20200101', 5, 20)

        第一个参数是股票代码,第二个参数是提取数据的开始时间,例子中是从2020年开始的。5表示计算股票的5日均线,20表示计算股票的20日均线。然后就完成了模型的实例化。

model.strategy()

        然后再运行这个代码就可以查看策略的效果了。

  1. 此次购买数量: 6
  2. 证券价格: 16.52
  3. 本金还剩: 88.0
  4. 金叉买入执行完毕----------------------------------
  5. 清仓: 0
  6. 证券价格: 13.63
  7. 本金还剩: 8266.0
  8. 死叉卖出执行完毕----------------------------------
  9. 此次购买数量: 4
  10. 证券价格: 18.67
  11. 本金还剩: 797.9999999999991
  12. 金叉买入执行完毕----------------------------------
  13. 清仓: 0
  14. 证券价格: 17.74
  15. 本金还剩: 7893.999999999998
  16. 死叉卖出执行完毕----------------------------------
  17. 此次购买数量: 5
  18. 证券价格: 14.7
  19. 本金还剩: 543.9999999999982
  20. 金叉买入执行完毕----------------------------------
  21. 清仓: 0
  22. 证券价格: 14.26
  23. 本金还剩: 7673.999999999998
  24. 死叉卖出执行完毕----------------------------------
  25. 此次购买数量: 5
  26. 证券价格: 14.67
  27. 本金还剩: 338.9999999999991
  28. 金叉买入执行完毕----------------------------------
  29. 清仓: 0
  30. 证券价格: 17.23
  31. 本金还剩: 8954.0
  32. 死叉卖出执行完毕----------------------------------
  33. 此次购买数量: 5
  34. 证券价格: 16.63
  35. 本金还剩: 639.0
  36. 金叉买入执行完毕----------------------------------
  37. 清仓: 0
  38. 证券价格: 16.28
  39. 本金还剩: 8779.0
  40. 死叉卖出执行完毕----------------------------------
  41. 此次购买数量: 5
  42. 证券价格: 15.78
  43. 本金还剩: 889.0000000000009
  44. 金叉买入执行完毕----------------------------------
  45. 清仓: 0
  46. 证券价格: 25.62
  47. 本金还剩: 13699.0
  48. 死叉卖出执行完毕----------------------------------
  49. 此次购买数量: 5
  50. 证券价格: 27.09
  51. 本金还剩: 154.00000000000182
  52. 金叉买入执行完毕----------------------------------
  53. 清仓: 0
  54. 证券价格: 25.66
  55. 本金还剩: 12984.000000000004
  56. 死叉卖出执行完毕----------------------------------
  57. 此次购买数量: 4
  58. 证券价格: 26.12
  59. 本金还剩: 2536.0000000000036
  60. 金叉买入执行完毕----------------------------------
  61. 清仓: 0
  62. 证券价格: 24.28
  63. 本金还剩: 12248.000000000004
  64. 死叉卖出执行完毕----------------------------------
  65. 此次购买数量: 4
  66. 证券价格: 30.48
  67. 本金还剩: 56.00000000000364
  68. 金叉买入执行完毕----------------------------------
  69. 清仓: 0
  70. 证券价格: 57.4
  71. 本金还剩: 23016.000000000004
  72. 死叉卖出执行完毕----------------------------------
  73. 此次购买数量: 3
  74. 证券价格: 63.35
  75. 本金还剩: 4011.0000000000036
  76. 金叉买入执行完毕----------------------------------
  77. 清仓: 0
  78. 证券价格: 61.9
  79. 本金还剩: 22581.000000000004
  80. 死叉卖出执行完毕----------------------------------
  81. 此次购买数量: 3
  82. 证券价格: 57.57
  83. 本金还剩: 5310.000000000004
  84. 金叉买入执行完毕----------------------------------
  85. 清仓: 0
  86. 证券价格: 53.4
  87. 本金还剩: 21330.0
  88. 死叉卖出执行完毕----------------------------------
  89. 此次购买数量: 3
  90. 证券价格: 61.11
  91. 本金还剩: 2997.0
  92. 金叉买入执行完毕----------------------------------
  93. 清仓: 0
  94. 证券价格: 54.7
  95. 本金还剩: 19407.000000000004
  96. 死叉卖出执行完毕----------------------------------
  97. 此次购买数量: 3
  98. 证券价格: 63.39
  99. 本金还剩: 390.00000000000364
  100. 金叉买入执行完毕----------------------------------
  101. 清仓: 0
  102. 证券价格: 65.1
  103. 本金还剩: 19920.000000000004
  104. 死叉卖出执行完毕----------------------------------
  105. 此次购买数量: 3
  106. 证券价格: 61.64
  107. 本金还剩: 1428.0000000000036
  108. 金叉买入执行完毕----------------------------------
  109. 清仓: 0
  110. 证券价格: 59.26
  111. 本金还剩: 19206.000000000004
  112. 死叉卖出执行完毕----------------------------------
  113. 此次购买数量: 3
  114. 证券价格: 51.92
  115. 本金还剩: 3630.0000000000036
  116. 金叉买入执行完毕----------------------------------
  117. 清仓: 0
  118. 证券价格: 50.55
  119. 本金还剩: 18795.0
  120. 死叉卖出执行完毕----------------------------------
  121. 此次购买数量: 3
  122. 证券价格: 55.29
  123. 本金还剩: 2208.0
  124. 金叉买入执行完毕----------------------------------
  125. 清仓: 0
  126. 证券价格: 54.35
  127. 本金还剩: 18513.0
  128. 死叉卖出执行完毕----------------------------------
  129. 此次购买数量: 4
  130. 证券价格: 42.49
  131. 本金还剩: 1517.0
  132. 金叉买入执行完毕----------------------------------
  133. 清仓: 0
  134. 证券价格: 45.58
  135. 本金还剩: 19749.0
  136. 死叉卖出执行完毕----------------------------------
  137. 此次购买数量: 4
  138. 证券价格: 46.08
  139. 本金还剩: 1317.0
  140. 金叉买入执行完毕----------------------------------
  141. 清仓: 0
  142. 证券价格: 45.45
  143. 本金还剩: 19497.0
  144. 死叉卖出执行完毕----------------------------------
  145. 此次购买数量: 3
  146. 证券价格: 50.79
  147. 本金还剩: 4260.0
  148. 金叉买入执行完毕----------------------------------
  149. 清仓: 0
  150. 证券价格: 46.77
  151. 本金还剩: 18291.0
  152. 。。。

        模型可以打印每次买入和卖出的日志,模型中的参数 verbose 和plot是默认打开的,可以看需求关闭。同时Plot参数提供了可视化, 上方的图表示股价图,下方图则是本金变化图形。

        从图形可以看出600460的股价从20年的低点到21年的高年翻了将近6倍,而均线策略最高只取得了两倍的收益。

        我们可以继续换一组参数,用5日线和10日线来操作。

  1. model = Dual_moving_average_stra('600460', '20200101', 5, 10)
  2. model.strategy()

         可以看出来效果会比5日线和20日线的组合好一点。个人感觉这个策略比较依赖标的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/836141
推荐阅读
相关标签
  

闽ICP备14008679号