python A股金叉死叉量化交易


前言

本研究旨在探讨 A 股市场的均线理论及波动性变化情况。在研究中,我们使用了历史股价数据,并基于这些数据计算了不同时间段的简单移动平均线和指数移动平均线。

我们的结果表明,A 股市场的均线理论较为成立,即长期均线对价格走势具有较好的预测作用。同时,我们也发现,A 股市场的波动性变化较大且不稳定,需要考虑多种因素来进行有效的风险管理。

具体来说,我们发现,在不同时期,简单移动平均线和指数移动平均线的预测能力有所不同。在市场比较平稳的时期,长期简单移动平均线的预测能力较强;而在市场波动较大的时期,则更应该关注短期指数移动平均线的预测能力。此外,我们还注意到,市场中存在着一些异常波动和价格暴涨暴跌的情况,需要对这些风险进行有效的管理和控制。

准备

参考资料:

1.A 股市场均线理论及波动性变化的实证研究

2.python==python38

  1. 查询dqnapi接口域名:http://www.dqnapi.com/
    在这里插入图片描述

pro.stock_basic dqnapi号:100.3568/2023.1_v1
pro.daily dqnapi号:100.3568/2023.11_v1

python代码

import tushare as ts
import pandas as pd
from time import sleep

# 获取 Tushare 账户 TOKEN
pro = ts.pro_api(token='官方获取')

# 获取股票列表并遍历所有股票
stock_list = pro.stock_basic(exchange='', list_status='L', fields='ts_code')
result_list = []
count = 0  # 计数器,记录已经访问接口的次数
for i in range(len(stock_list)):
    ts_code = stock_list['ts_code'][i]
    print('Processing stock:', ts_code)
    count += 1
    if count >= 800:
        sleep(60)
        count = 0
    # 获取股票数据
    df = pro.daily(ts_code=ts_code, start_date='20230101', end_date='20230614')

    # 计算均线
    df['ma10'] = df['close'].rolling(10).mean()
    df['ma20'] = df['close'].rolling(20).mean()

    # 初始化变量
    position = None
    buy_price = 0
    sell_price = 0
    capital = 10000
    hands = 0
    fee = 0.0015

    # 判断金叉和死叉并进行交易
    for i in range(20, len(df)):
        # 判断是否金叉
        if df['ma10'][i] > df['ma20'][i] and df['ma10'][i-1] <= df['ma20'][i-1]:
            # 判断前两日波动情况
            if (df['close'][i-1] - df['close'][i-2]) / df['close'][i-2] >= 0.02:
                # 记录交易信息并买入
                hands = int(capital / (df['close'][i] * 100)) # 计算买入手数
                buy_price = df['close'][i] + fee # 买入价为当日收盘价加上手续费
                capital -= hands * buy_price * 100 # 计算剩余资本
                position = 'long'
                print(df['trade_date'][i], 'buy', hands, 'hands')


        # 判断是否死叉
        elif df['ma10'][i] < df['ma20'][i] and df['ma10'][i-1] >= df['ma20'][i-1]:
            # 判断前两日波动情况
            if (df['close'][i-1] - df['close'][i-2]) / df['close'][i-2] >= 0.02:
                # 记录交易信息并卖出
                sell_price = df['close'][i] - fee # 卖出价为当日收盘价减去手续费
                capital += hands * sell_price * 100 # 计算剩余资本
                hands = 0
                position = None
                print(df['trade_date'][i], 'sell', hands, 'hands')
        

    # 计算收益率
    if position != 'long':
        continue
    trade_days = len(df[df['trade_date']>=df.iloc[-1]['trade_date']])
    start_capital = 10000
    end_capital = capital + hands * df.iloc[-1]['close'] * 100 - trade_days * 2 * fee
    profit = (end_capital - start_capital) / start_capital

    if profit > 0.05:
        df_trade = pd.DataFrame({'ts_code': [ts_code], 'trade_date': [df.iloc[-1]['trade_date']], 
                                 'position': ['long'], 'hands': [hands], 'price': [buy_price], 'profit': [profit]})
        result_list.append(df_trade)
    print('The total return of', ts_code, 'is: {:.2%}'.format(profit))

# 将结果写入 csv 文件中
if len(result_list) > 0:
    df_result = pd.concat(result_list).reset_index(drop=True)
    df_result.to_csv('result.csv', index=False)
    print('Result has been saved in result.csv')
else:
    print('No stock meets the requirements.')

总结

在股票技术分析中,均线的金叉和死叉是很常见的交易信号。

均线的金叉表示短期均线上穿长期均线,此时标志着股价走势由下向上改变,是一个买入信号;而均线的死叉则表示短期均线下穿长期均线,此时标志着股价走势由上向下改变,是一个卖出信号。

在代码中,我们可以通过以下方式来判断均线的金叉或死叉:

if df[‘ma10’][i] > df[‘ma20’][i] and df[‘ma10’][i-1] <= df[‘ma20’][i-1]:
# 发出买入信号

elif df[‘ma10’][i] < df[‘ma20’][i] and df[‘ma10’][i-1] >= df[‘ma20’][i-1]:
# 发出卖出信号
在这里,我们使用了当前交易日的两个均线值(10日均线和20日均线)和前一日的均线值进行比较,以判断金叉或死叉的发生。如果当前交易日的短期均线大于长期均线,并且前一日的短期均线小于等于长期均线,说明出现了金叉;如果当前交易日的短期均线小于长期均线,并且前一日的短期均线大于等于长期均线,说明出现了死叉

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值