[关闭]
@Channelchan 2018-01-06T14:43:26.000000Z 字数 4599 阅读 85781

移动平均线

用Python量化你的技术分析

目录

均线是什么?

均线理论是当今应用最普遍的技术指标之一,它帮助交易者确认现有趋势、判断将出现的趋势、发现过度延生即将反转的趋势。另外均线与趋势是西蒙斯被TED采访时提到的关键词,因此做量化你必须懂,而且是深入地懂这两个词的真正意义。

不同均线是怎么计算的?


1. Simple Moving Average 平滑价格

MA1.png-2.1kB


2. Weighted Moving Average 用权重方法突出前段

MA2.png-4.8kB


3. Triangular Moving Average 突出中间,用于周期分析

MA3.png-3.1kB


4. Exponential Moving Average 用指数方法突出前段

MA4.png-12.2kB


5. Double Exponential Moving Average 突出EMA,减少滞后。

MA5.png-4.3kB


6. Kaufman Adaptive Moving Average 自适应自适应市场变化与波动

MA6.png-40.4kB

均线如何用图表显示?

  1. from jaqs.data import DataView
  2. from jaqs.data import RemoteDataService
  3. import os
  4. import numpy as np
  5. import talib as ta
  6. import pandas as pd
  7. from datetime import datetime
  8. import matplotlib.pyplot as plt
  9. import warnings
  10. warnings.filterwarnings("ignore")
  11. dv = DataView()
  12. dataview_folder = 'JAQS_Data/hs300'
  13. dv.load_dataview(dataview_folder)
Dataview loaded successfully.
  1. def change_index(df):
  2. df.index = pd.Index(map(lambda x: datetime.strptime(str(x),"%Y%m%d") , df.index))
  3. return df
  1. data = change_index(dv.get_ts('close').loc[20170105:])
  2. data['SMA'] = ta.abstract.MA(data, 20, price='600036.SH')
  3. data['WMA'] = ta.abstract.WMA(data, 20, price='600036.SH')
  4. data['TRIMA'] = ta.abstract.TRIMA(data, 20, price='600036.SH')
  5. data['EMA'] = ta.abstract.EMA(data, 20, price='600036.SH')
  6. data['DEMA'] = ta.abstract.DEMA(data, 20, price='600036.SH')
  7. data['KAMA'] = ta.abstract.KAMA(data, 20, price='600036.SH')
  1. fig = plt.figure(figsize=(15, 7))
  2. plt.plot(data['600036.SH'])
  3. plt.plot(data['SMA'], alpha=0.5)
  4. plt.plot(data['WMA'], alpha=0.5)
  5. plt.plot(data['TRIMA'], alpha=0.5)
  6. plt.plot(data['EMA'], alpha=0.5)
  7. plt.plot(data['DEMA'], alpha=0.5)
  8. plt.plot(data['KAMA'], alpha=0.5)
  9. plt.legend(loc='lower right')
  10. plt.show()

output_8_0.png-63kB

如何用均线构建策略?

两条均线的三种交易方法
1. 当均线金叉(短期大于长期均线)时候买进,死叉(短期小于长期)时卖出。
2. 当价格上穿两条均线时买入,但价格下穿其中一条均线时卖出。
3. 当两条均线都处于向上方向时买入,当两条均线都处于下跌方向时卖出。

  1. #MA_Strategy_1
  2. import rqalpha
  3. from rqalpha.api import *
  4. import talib
  5. def init(context):
  6. context.s1 = "000001.XSHE"
  7. context.SHORTPERIOD = 10
  8. context.LONGPERIOD = 20
  9. def handle_bar(context, bar_dict):
  10. price = history_bars(context.s1, context.LONGPERIOD+1, '1d', 'close')
  11. short_avg = talib.SMA(price, context.SHORTPERIOD)
  12. long_avg = talib.SMA(price, context.LONGPERIOD)
  13. plot("short avg", short_avg[-1])
  14. plot("long avg", long_avg[-1])
  15. # 计算现在portfolio中股票的仓位
  16. cur_position = context.portfolio.positions[context.s1].quantity
  17. # 计算现在portfolio中的现金可以购买多少股票
  18. shares = context.portfolio.cash/bar_dict[context.s1].close
  19. # 如果短均线从上往下跌破长均线,也就是在目前的bar短线平均值低于长线平均值,而上一个bar的短线平均值高于长线平均值
  20. if short_avg[-1] - long_avg[-1] < 0 and short_avg[-2] - long_avg[-2] > 0 and cur_position > 0:
  21. # 进行清仓
  22. order_target_value(context.s1, 0)
  23. # 如果短均线从下往上突破长均线,为入场信号
  24. if short_avg[-1] - long_avg[-1] > 0 and short_avg[-2] - long_avg[-2] < 0:
  25. # 满仓入股
  26. order_shares(context.s1, shares)
  27. config = {
  28. "base": {
  29. "start_date": "2015-06-01",
  30. "end_date": "2017-12-31",
  31. "accounts": {'stock':1000000},
  32. "benchmark": "000001.XSHE"
  33. },
  34. "extra": {
  35. "log_level": "error",
  36. },
  37. "mod": {
  38. "sys_analyser": {
  39. "enabled": True,
  40. "plot": True
  41. }
  42. }
  43. }
  44. rqalpha.run_func(init=init, handle_bar=handle_bar, config=config)

output_10_0.png-88.4kB

  1. #MA_Strategy_2
  2. import rqalpha
  3. from rqalpha.api import *
  4. import talib
  5. def init(context):
  6. context.s1 = "000001.XSHE"
  7. context.SHORTPERIOD = 10
  8. context.LONGPERIOD = 20
  9. def handle_bar(context, bar_dict):
  10. price = history_bars(context.s1, context.LONGPERIOD+1, '1d', 'close')
  11. short_avg = talib.SMA(price, context.SHORTPERIOD)
  12. long_avg = talib.SMA(price, context.LONGPERIOD)
  13. cur_position = context.portfolio.positions[context.s1].quantity
  14. shares = context.portfolio.cash/bar_dict[context.s1].close
  15. if price[-1] < short_avg[-1] or price[-1] < long_avg[-1] and cur_position > 0:
  16. order_target_value(context.s1, 0)
  17. if price[-1] > short_avg[-1] and price[-1] > long_avg[-1]:
  18. order_shares(context.s1, shares)
  19. config = {
  20. "base": {
  21. "start_date": "2015-06-01",
  22. "end_date": "2017-12-31",
  23. "accounts": {'stock':1000000},
  24. "benchmark": "000001.XSHE"
  25. },
  26. "extra": {
  27. "log_level": "error",
  28. },
  29. "mod": {
  30. "sys_analyser": {
  31. "enabled": True,
  32. "plot": True
  33. }
  34. }
  35. }
  36. rqalpha.run_func(init=init, handle_bar=handle_bar, config=config)

output_11_0.png-70.5kB

  1. #MA_Strategy_3
  2. import rqalpha
  3. from rqalpha.api import *
  4. import talib
  5. def init(context):
  6. context.s1 = "000001.XSHE"
  7. context.SHORTPERIOD = 10
  8. context.LONGPERIOD = 30
  9. def handle_bar(context, bar_dict):
  10. price = history_bars(context.s1, context.LONGPERIOD+1, '1d', 'close')
  11. short_avg = talib.SMA(price, context.SHORTPERIOD)
  12. long_avg = talib.SMA(price, context.LONGPERIOD)
  13. cur_position = context.portfolio.positions[context.s1].quantity
  14. shares = context.portfolio.cash/bar_dict[context.s1].close
  15. if len(long_avg)== context.LONGPERIOD+1:
  16. if short_avg[-1] < short_avg[-2] and long_avg[-1] < long_avg[-2] and cur_position > 0:
  17. order_target_value(context.s1, 0)
  18. if short_avg[-1] > short_avg[-2] and long_avg[-1] > long_avg[-2]:
  19. order_shares(context.s1, shares)
  20. config = {
  21. "base": {
  22. "start_date": "2015-06-01",
  23. "end_date": "2017-12-30",
  24. "accounts": {'stock':1000000},
  25. "benchmark": "000001.XSHE"
  26. },
  27. "extra": {
  28. "log_level": "error",
  29. },
  30. "mod": {
  31. "sys_analyser": {
  32. "enabled": True,
  33. "plot": True
  34. }
  35. }
  36. }
  37. rqalpha.run_func(init=init, handle_bar=handle_bar, config=config)

output_12_0.png-63.3kB

作业:

更换标的与均线类型回测策略。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注