/line-of-ma

'老太太炒股法', 一根均线打天下, 利用Python根据均线分析这一策略的可行性

Primary LanguagePython

line-of-ma

'老太太炒股法', 一根均线打天下, 利用Python根据均线分析这一策略的可行性

使用

  • Python 3.x
  • 安装所需库(详见文件头部)
  • 运行 ma.py

参数说明

id param type mean demo necessary
1 file_path_prefix str 日线数据文件目录前缀 'H:\\sharesDatas\\kline\\' true
2 code int / str 股票代码 '000001' false
3 end_date str 最早的日期(截止日期) '2019-01-01' false
4 all_n Array 要计算的几日ma 数组 [5,10] false

概念

移动平均线,Moving Average,简称 MAMA 是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同时间的平均值连接起来,形成一根 MA ,用以观察证券价格变动趋势的一种技术指标。

常见的均线有5日均线(MA5), 十日均线(MA10), 二十日均线(MA20), 三十日均线(MA30), 六十日均线(MA60)

计算

在这里, 我的计算方法是简单地计算 n 日内的 收盘价算数平均值

程序设计

基本思路如下:

  • 定义要计算的几日(假设为n)均线数组, 进行遍历计算
  • 迭代文件列表
  • 打开某个文件, 选取 n 行, 计算这n行的 收盘价 总和
  • 迭代 csv 文件的每一行, 每次迭代, 将上述收盘价的总和减去首行, 追加新的一行
  • 计算 ma 并写入原文件

和我之前计算 cci 不同, 这里不再做多余的迭代, 以此能大大提高效率(cci 的计算:https://github.com/CatsJuice/stock-cci)

购买策略分析

策略一: 老太太选股

购买的策略较为简单, 收盘价低于均线即买入, 将收盘价作为买入价格(假设第二个交易日开盘即买入), 收盘价高于均线即卖出, 同样将收盘价作为卖出价格

策略二:'黄金交叉'和'死亡交叉'

'黄金交叉''死亡交叉' 的概念来自 日均线 的百度百科(https://baike.baidu.com/item/%E6%97%A5%E5%9D%87%E7%BA%BF/8784586?fr=aladdin

1、”黄金交叉” 当10日均线由下往上穿越30日均线,形成10日均线在上,30日均线在下时,其交叉点就是黄金交叉,黄金交叉是多头的表现,出现黄金交叉后,后市会有一定的涨幅空间,这是进场的最佳时机。

2、”死亡交叉” 当10日均线由上往下穿越30日均线,形成30日均线在上,10日均线在下时,其交点称之为”死亡交叉”,”死亡交叉”预示空头市场来临,股市将下跌此时是出场的最佳时机。

分析结果

老太太选股法

对于'老太太选股法', 我分别测试了5日均线和10日均线(由于20日数据较大, 电脑处理太慢, 暂时不考虑), 最终得到的结果为:

ma5 的盈利几率为63.3132%; 而 ma10 的盈利几率为67.0026%

以下是某次运行的截图:

老太太选股测试结果

运行结果中, 可以发现, 无论是盈利或是亏损, 金额基本都在1元以内, 可见这一策略 首先具有一定的科学性, 同时风险也不是很大, 但盈利金额较高的可能性很小;

对此, 我增加了结果判断, 统计亏损 / 盈利 超过 1 元的比例, 以下是结果:

对于 ma5:

ma5的详情结果

对于 ma10:

ma10的详情结果

对于 ma20:

ma20的详情结果

对于 ma30:

ma30的详情结果

对于 ma60:

ma60的详情结果

从更详细的结果可以看到, 无论盈利或亏损, 超过 1 元的概率都不大, 但是亏损的时候超过 1 元的概率比盈利大; 更有趣的是, 当 ma的计算天数越多, 盈利的几率越大, 由于一般看盘软件中仅提供了上述这些均线(MA5, MA10, MA20, MA30, MA60), 所以这里不再多更高的天数进行测试; 虽然天数越大时, 盈利几率越高, 但是从更细节数据可以看到, 盈利的情况大于1元的概率始终在 10% ~ 15%, 而亏损时超过 1 元的概率却表现出和天数正相关的趋势, 并且从 24% 跳跃到高达 50%

'黄金交叉'和'死亡交叉'

运行结果如图:

'黄金交叉'和'死亡交叉'结果

对于这个结果的确是非常出乎意料, 这个盈利率低得感觉好像可以作为一个反向指标使用;

对于这个结果, 首先应该怀疑是自己的代码逻辑出现了问题, 于是我检查了关键代码如下:

# 前一天 ma30 > ma10 , 今天ma10 >= ma30
if prev_row is not None and prev_row['ma30'] > prev_row['ma10'] and row['ma10'] >= row['ma30']:
    # 买入

...
...

# 前一天 ma30 < ma10 , 今天ma10 <= ma30
if prev_row['ma30'] < prev_row['ma10'] and row['ma10'] <= row['ma30']:
    # 卖出

关键代码部分好像并没有什么逻辑问题, 但是不排除其他部分出现问题, 由于这个指标的预期过于不符, 我试着尝试了交换 '黄金交叉'和'死亡交叉', 修改上述关键代码如下(其实就是把所有大小判断符号反置):

# 前一天 ma30 < ma10 , 今天ma10 <= ma30
if prev_row is not None and prev_row['ma30'] < prev_row['ma10'] and row['ma10'] <= row['ma30']:
    # 买入

...
...

# 前一天 ma30 > ma10 , 今天ma10 >= ma30
if prev_row['ma30'] > prev_row['ma10'] and row['ma10'] >= row['ma30']:
    # 卖出

以下为运行结果:

'黄金交叉'和'死亡交叉'反向结果

这时候盈利率可以说是马马虎虎还算过得去了, 但是盈利率却还是不如 ‘老太太选股法’