侠之大者 一起赚钱

来源:https://uqer.io/community/share/554048dff9f06c1c3d687fa5

在阔别七年的又一轮牛市里,炒股已经成为人们每天讨论的话题.

小老弟一直以为:"侠之大者,一起赚钱,一起嗨". 故借宝地献出珍藏多年的交易秘籍.

首先讲述一下策略思路:

  • 标的: 流通性较好,深受大妈喜爱的沪深300成分股, 乃策略标的最佳选择.

  • 买卖点: 追涨杀跌是本策略的核心思路. 在股价,成交量向上突破最近20日最高价格(量)时买入. 在股价向下突破最近10日最低价格卖出.

  • 头寸规模:每只股票最多占1/10仓位.

话不多说, 上代码:

  1. start = datetime(2013, 1, 1)
  2. end = datetime(2015, 5, 25)
  3. benchmark = 'HS300'
  4. universe = set_universe('HS300')
  5. capital_base = 100000
  6. pos_pieces = 10
  7. enter_window = 20
  8. exit_window = 10
  9. def initialize(account):
  10. pass
  11. def handle_data(account):
  12. highest_price = account.get_attribute_history('highPrice', enter_window)
  13. lowest_price = account.get_attribute_history('lowPrice', exit_window)
  14. close_price = account.get_attribute_history('closePrice', exit_window)
  15. turnover_vol = account.get_attribute_history('turnoverVol', enter_window)
  16. for stock in account.universe:
  17. cnt_price = close_price[stock][-1] #account.referencePrice[stock]
  18. cnt_turnover = turnover_vol[stock][-1]
  19. if cnt_price > highest_price[stock][:-1].max() and cnt_turnover > turnover_vol[stock][:-1].max() and account.position.secpos.get(stock, 0)==0:
  20. order(stock, capital_base/pos_pieces/cnt_price)
  21. elif cnt_price < lowest_price[stock][:-1].min():
  22. order_to(stock, 0)

侠之大者 一起赚钱 - 图1

也许已经有人发现, 其实这就是海龟交易系统.

海龟交易系统是一个完整的交易系统,它有一个完整的交易系统所应该有的所有成分,涵盖了成功交易中的每一个必要决策:

  • 市场:买卖什么?

  • 头寸规模:买卖多少?

  • 入市:什么时候买卖?

  • 止损:什么时候放弃一个亏损的头寸?

  • 退出:什么时候退出一个盈利的头寸?

  • 战术:怎么买卖?

在上面的策略中, 每只股票的头寸规模为1/10的初始资金.

《海龟交易法则》介绍了一种头寸规模控制方法, 将头寸分为一个个单位, 下面的策略将展示将头寸分为N个单位, 每次产生买入信号时, 仅买入一个单位.

  1. start = datetime(2013, 1, 1)
  2. end = datetime(2015, 5, 25)
  3. benchmark = 'HS300'
  4. universe = set_universe('HS300')
  5. capital_base = 100000
  6. pos_pieces = 10
  7. enter_window = 20
  8. exit_window = 10
  9. N = 4
  10. def initialize(account):
  11. account.postion_size_hold = {}
  12. for stk in universe:
  13. account.postion_size_hold[stk] = 0
  14. def handle_data(account):
  15. highest_price = account.get_attribute_history('highPrice', enter_window)
  16. lowest_price = account.get_attribute_history('lowPrice', exit_window)
  17. close_price = account.get_attribute_history('closePrice', exit_window)
  18. turnover_vol = account.get_attribute_history('turnoverVol', enter_window)
  19. for stock in account.universe:
  20. cnt_price = close_price[stock][-1] #account.referencePrice[stock]
  21. cnt_turnover = turnover_vol[stock][-1]
  22. if cnt_price > highest_price[stock][:-1].max() and cnt_turnover > turnover_vol[stock][:-1].max() and account.postion_size_hold[stock]<N:
  23. order(stock, capital_base/pos_pieces/cnt_price/N)
  24. account.postion_size_hold[stock] += 1
  25. elif cnt_price < lowest_price[stock][:-1].min():
  26. order_to(stock, 0)
  27. account.postion_size_hold[stock] = 0

侠之大者 一起赚钱 - 图2

我们发现回撤和波动率有所下降,而收益率竟然上升了. 其实原因很简单, 分N次买入时, 如果信号正确, 可能会提高一定的持仓成本,降低收益率; 反之如果信号有误, 也能够快速止损, 减少回撤.

也就是说, 头寸规模有效的控制了风险.

以上两个策略属于唐安奇趋势系统, 结束之前, 再介绍一下布林格突破系统.

布林线定义:

布林线是通过350日平均收盘加减2.5倍标准差得到的。

布林线方法:

  • 如果前一日的收盘价穿越了通道的顶部,则开盘做多

  • 如果前一日的收盘价跌破了通道的底部,则开盘做空

在我们的这个股票策略里,我们以60日平均收盘加减2.5倍标准差作为波幅通道.

  1. import numpy as np
  2. start = datetime(2013, 1, 1)
  3. end = datetime(2015, 5, 25)
  4. benchmark = 'HS300'
  5. universe = set_universe('HS300')
  6. capital_base = 100000
  7. longest_history = 60
  8. pos_pieces = 10
  9. enter_window = 20
  10. exit_window = 10
  11. N = 4
  12. def initialize(account):
  13. account.postion_size_hold = {}
  14. for stk in universe:
  15. account.postion_size_hold[stk] = 0
  16. def handle_data(account):
  17. close_prices = account.get_attribute_history('closePrice', longest_history)
  18. for stock in account.universe:
  19. cnt_price = close_prices[stock][-1] #account.referencePrice[stock]
  20. mean_cp = close_prices[stock].mean()
  21. bias = 2.5*np.std(close_prices[stock])
  22. high_channel = mean_cp + bias
  23. low_channel = mean_cp - bias
  24. if cnt_price >= high_channel and account.postion_size_hold[stock]<N:
  25. order(stock, capital_base/pos_pieces/cnt_price/N)
  26. account.postion_size_hold[stock] += 1
  27. elif cnt_price <= low_channel:
  28. order_to(stock, 0)
  29. account.postion_size_hold[stock] = 0

侠之大者 一起赚钱 - 图3

参考自:《海龟交易法则》 作者: 柯蒂斯·费思