金融量化分析——双均线策略

目录

一、数据采集

二、提取有效数据

三、金叉、死叉分析

四、模拟实操

五、完整代码

六、未来展望


一、数据采集

1、首先安装Tushare:

pip install Tushare

2、使用Tushare接口,并导入所需的包:

import tushare as ts
import pandas as pd
import matplotlib as plt
import numpy as np
import mplfinance as mpf//绘制K线的包,本节没有用到

3、试着获取从2023-10-1到2023-11-1期间的茅台股票数据,:

df = pro.daily(ts_code='600519.SH', start_date='20231001', end_date='20231101')

4、将数据保存至CSV文件:

df.to_csv('600519data.csv',index=False)

二、提取有效数据

1、读取刚才保存的CSV文件,并选取所需数据:

df = pd.read_csv("600519data.csv",index_col='trade_date',parse_dates=['trade_date'])[['open','close','low','high']]

2、 由于所获得数据是时间倒序,所以需要按照时间标签正序排序

df = df.sort_index()

3、创建两列,并分别命名“ma5”和“ma30”,分别代表5日、30日均线的值:

df['ma5'] = np.nan
df['ma30'] = np.nan

for i in range(4,len(df)):
    df.loc[df.index[i],'ma5'] = df['close'][i-4:i+1].mean()

for i in range(29,len(df)):
    df.loc[df.index[i],'ma30'] = df['close'][i-29:i+1].mean()

也可使用另一种方法:

df['ma5'] = df['close'].rolling(5).mean
df['ma30'] = df['close'].rolling(30).mean

4、查看均线图:

df[['close','ma5','ma30']].plot()

三、金叉、死叉分析

1、创建两列数组,作为金叉和死叉:

若当日5日均线值大于等于30日均线值,并且前一日5日均线值小于30日均线值,则称交点为金叉.

若当日5日均线值小于等于30日均线值,并且前一日5日均线值大于30日均线值,则称交点为死叉.

golden_cross = []
death_cross = []
for i in range(1,len(df)):
    if df['ma5'][i]>=df['ma30'][i] and df['ma5'][i-1]<df['ma30'][i-1]:
        golden_cross.append(df.index[i])
    if df['ma5'][i]<=df['ma30'][i] and df['ma5'][i-1]>df['ma30'][i-1]:
        death_cross.append(df.index[i])

判定金叉、死叉另一种方法:

sr1 = df['ma5'] < df['ma30']
sr2 = df['ma5'] > df['ma30']
death_cross1 = df[sr1 & sr2.shift(1)].index
golden_cross1 = df[-(sr1 | sr2.shift(1))].index

左图为金叉,右图为死叉: 

四、模拟实操

        本文采取的双均线策略是选择5日和30日这两条移动平均线,当第一个金叉出现的时候买入,紧接着出现死叉的时候再卖出。

将两个存有金叉死叉数据的序列合并到一个序列sr里,

first_money = 100000
money = first_money
hold = 0 #持有多少股
sr1= pd.Series(1,index = golden_cross)
sr2 = pd.Series(0,index = death_cross)
sr = sr1._append(sr_death).sort_index()

for i in range(0,len(sr)):
    p =df['open'][sr.index[i]]
    if sr.iloc[i] == 1:
        #金叉
        buy = (money // (100 * p))
        hold += buy*100
        money -= buy*100*p
    else:
        money += hold *p
        hold = 0
p = df['open'][-1]
now_moeny = hold * p + money

print(now_moeny - first_money)

        结果显示,从2013年1月1日开始到2023年11月1日结束,在本金10w的情况下采取双均线策略,可以盈利1324734.0元,也就是132w+元。

五、完整代码

import tushare as ts
import pandas as pd
import matplotlib as plt
import numpy as np
import mplfinance as mpf

#读取数据
df = pd.read_csv("600519data.csv",index_col='trade_date',parse_dates=['trade_date'])[['open','close','low','high']]

#数据排序
df = df.sort_index()

#创建当日的5日和30日的均线值
df['ma5'] = np.nan
df['ma30'] = np.nan

for i in range(4,len(df)):
    df.loc[df.index[i],'ma5'] = df['close'][i-4:i+1].mean()

for i in range(29,len(df)):
    df.loc[df.index[i],'ma30'] = df['close'][i-29:i+1].mean()

#丢掉缺失数据
df = df.dropna()

#判断金叉、死叉
golden_cross = []
death_cross = []
for i in range(1,len(df)):
    if df['ma5'][i]>=df['ma30'][i] and df['ma5'][i-1]<df['ma30'][i-1]:
        golden_cross.append(df.index[i])
    if df['ma5'][i]<=df['ma30'][i] and df['ma5'][i-1]>df['ma30'][i-1]:
        death_cross.append(df.index[i])

#模拟实操
first_money = 100000
money = first_money
hold = 0 #持有多少股
sr1= pd.Series(1,index = golden_cross)
sr2 = pd.Series(0,index = death_cross)
sr = sr1._append(sr_death).sort_index()


for i in range(0,len(sr)):
    p =df['open'][sr.index[i]]
    if sr.iloc[i] == 1:
        #金叉
        buy = (money // (100 * p))
        hold += buy*100
        money -= buy*100*p
    else:
        money += hold *p
        hold = 0
p = df['open'][-1]
now_moeny = hold * p + money

print(now_moeny - first_money)

六、未来展望

        由于第二天才能知道昨天的收盘价,即使当天知道收盘价后也无法买入了,也就是说第二天才知道昨天是否有金叉死叉,所以实际操作中应该是后一天买入或者卖出。

        因此,在未来改进过程中可以将上述代码的p变量赋值第二天的开盘价格,以此来增加模拟策略的准确度。

七、拓展:利用聚宽金融量化交易平台

1、创建初始化函数

依旧选择贵州茅台股票,600519

# 初始化函数,设定基准等等
def initialize(context):
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    # 选取贵州茅台股票
    g.security = ['600519.XSHG']
    # 5日、60日
    g.p1 = 5
    g.p2 = 60

2、交易函数

(1)聚宽的attribute_history的函数:

一般只用前两个参数,第二个count参数为期望的最终数量。

  • count: 大于0的整数,表示获取bar的个数。如果行情数据的bar不足count个,返回的长度则小于count个数。

(2)账户信息函数

context.portfolio.positions,账户是否持仓。

context.portfolio.available_cash,账户鱼儿

(3)order_target函数,常用的依旧是前两个参数。

第二个参数可以填写账户金额,系数自动计算这些钱能买最大股票数。

def handle_data(context, data):
    for stock in g.security:
        # 金叉:如果5五日均线大于10日均线,并且不持仓
        # 死叉:如果5五日均线小于10日均线,并且持仓股票
        df = attribute_history(stock, g.p2)
        ma10 = df['close'].mean()
        ma5 = df['close'][-5:].mean()
        
        if ma10 > ma5 and stock in  context.portfolio.positions:
            # 死叉
            order_target(stock,0)
            
        if ma10 < ma5 and stock not in  context.portfolio.positions:
            # 金叉
            order_target(stock,context.portfolio.available_cash * 0.8)

3、完整代码

# 导入函数库
from jqdata import *

# 初始化函数,设定基准等等
def initialize(context):
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    # 选取贵州茅台股票
    g.security = ['600519.XSHG']
    # 5日、60日
    g.p1 = 5
    g.p2 = 60
## 开盘前运行函数
def handle_data(context, data):
    for stock in g.security:
        # 金叉:如果5五日均线大于10日均线,并且不持仓
        # 死叉:如果5五日均线小于10日均线,并且持仓股票
        df = attribute_history(stock, g.p2)
        ma10 = df['close'].mean()
        ma5 = df['close'][-5:].mean()
        
        if ma10 > ma5 and stock in  context.portfolio.positions:
            # 死叉
            order_target(stock,0)
            
        if ma10 < ma5 and stock not in  context.portfolio.positions:
            # 金叉
            order_target(stock,context.portfolio.available_cash * 0.8)

4、运行结果

时间选择的是2022-10-1至2023-10-1,可以看到一年时间收益4.46%。

至于双均线策略是否有用,小伙伴们还可多换些股票和时间区间来验证。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 龙战法是一种常用于股票投资的选股策略,主要是根据股票的涨跌趋势来进行买卖决策。下面是使用 Python 实现股票龙战法选股策略的基本步骤: 1. 数据获取:使用 Python 的 tushare 库等工具获取股票数据,包括股票的历史价格、涨跌幅等信息。 2. 龙头股选取:根据股票的涨跌幅等指标,选取近期涨幅较大、市值较高、行业地位较好的股票作为“龙头股”。 3. 热点板块选取:根据当前市场的行情,选取热点板块,例如近期受到市场关注的新能源汽车、芯片等板块。 4. 买卖信号判断:根据选取的龙头股和热点板块的涨跌幅变化情况,判断是否出现买入或卖出的信号。具体判断逻辑可以根据实际情况进行调整,例如可以根据股票的均线、MACD等指标进行判断。 5. 买卖操作:根据买卖信号进行买卖操作。对于买入操作,可以根据股票的市价和可用资金进行买入;对于卖出操作,可以根据股票的当前持仓数量进行卖出。 以下是一个简单的 Python 示例代码,用于实现股票龙战法选股策略: ```python import tushare as ts # 获取股票历史数据 stock_code = '600519' # 茅台股票代码 df = ts.get_k_data(stock_code) # 选取近期涨幅较大的股票作为“龙头股” dragon_stock = df[df['close'] > df['close'].shift(1)].iloc[-1]['code'] # 选取热点板块 hot_industry = ['新能源汽车', '芯片'] # 根据龙头股和热点板块判断买卖信号 buy_signal = False sell_signal = False if df.iloc[-1]['code'] == dragon_stock and df.iloc[-1]['industry'] in hot_industry: if df.iloc[-1]['close'] > df.iloc[-1]['ma5'] and df.iloc[-1]['close'] > df.iloc[-1]['ma10']: buy_signal = True elif df.iloc[-1]['close'] < df.iloc[-1]['ma5'] and df.iloc[-1]['close'] < df.iloc[-1]['ma10']: sell_signal = True # 根据买卖信号进行买卖操作 if buy_signal: # 根据当前资金和股票市价 ### 回答2: 股票龙战法是一种常用的股票选股策略,其基本原理是结合龙头和龙尾股票进行选股操作。Python是一种强大的编程语言,可以用于实现股票龙战法选股策略。 首先,我们需要获取股票的历史数据,并对数据进行处理和分析。可以使用Python中的第三方库,如pandas和numpy,来处理和分析股票数据。通过计算每只股票的涨幅和成交量等指标,可以确定股票的龙头和龙尾。 接下来,我们可以根据龙战法的规则进行选股。一般来说,选择龙头股票时,可以通过筛选涨幅较大、成交量较高、市值较大的股票来确定。而选择龙尾股票时,可以通过筛选跌幅较大、成交量较低的股票来确定。 在Python中,可以使用条件语句和循环语句来实现选股策略的判断和操作。通过编写相应的筛选条件和规则,可以自动筛选出符合龙战法选股策略的股票。 最后,根据选股结果,可以进行进一步的分析和决策。可以通过绘制股票的K线图、计算技术指标等方式来进行分析,以确定实际的买入和卖出时机。 总之,Python可以通过使用第三方库和编写相应的代码来实现股票龙战法选股策略。通过对股票数据的处理与分析,以及根据选股规则进行筛选,可以自动化地选出符合龙战法的股票,为投资者提供辅助决策。 ### 回答3: 股票龙战法是一种基于技术分析的选股策略,通过使用Python编程语言实现,可以更加高效地筛选出符合龙战法的股票。 首先,我们需要使用Python的数据获取库来获取股票的历史数据,如pandas-datareader或tushare。然后,我们可以使用Python的数据处理库,如pandas,来对数据进行清洗和整理。 接下来,我们需要实现龙战法的具体规则。龙战法一般包含两个指标:均线和MACD指标。 对于均线指标,我们可以使用Python的技术分析库,如ta-lib,来计算不同周期的移动平均线,并筛选出股票当日收盘价在均线之上的股票。 对于MACD指标,我们可以使用Python的技术分析库,如ta-lib,来计算MACD线、信号线和柱状线的数值,并根据龙战法的规则,筛选出金叉买入和死叉卖出的股票。 在实现策略的过程中,我们还可以结合其他指标和条件,如成交量、相对强弱指标(RSI)等,来进一步优化选股策略。 最后,我们可以使用Python的可视化库,如matplotlib或seaborn,来绘制选股策略的交易信号和收益曲线,以便进行策略的回测和评估。 通过使用Python实现股票龙战法选股策略,我们可以更加灵活和快速地应用该策略,并能够根据实际情况进行调整和优化,提高选股的准确性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流离川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值