双均线策略 ------优矿学习

from matplotlib import pylab
import numpy as np
from datetime import datetime
import pandas as pd
import DataAPI  #通联数据提供的数据API
import seaborn as sns
sns.set_style('white')#设置背景为白色

secID = '510050.XSHG' #华夏上证50ETF
start = '20080101'
end = '20150423'
#获取基金行情信息
security = DataAPI.MktFunddGet(secID=secID,beginDate=start,endDate=end,field=['tradeDate','closePrice'])
security['tradeDate']=pd.to_datetime(security['tradeDate'])
security.info()

security['closePrice'].plot(grid=False,figsize=(12,8))
sns.despine()

window_short = 20 #月均线,短期均线
window_long = 120 #半年线,长期均线
SD = 0.05 #偏离度阈值5%

#numpy内置移动平均函数:rolling_mean
security['short_window'] = np.round(pd.rolling_mean(security['closePrice'],window=window_short),2)
security['long_window'] = np.round(pd.rolling_mean(security['closePrice'], window=window_long), 2)
print(security[['closePrice','short_window','long_window']].tail())

#将三条线画到一张图上
security[['closePrice','short_window','long_window']].plot(grid=False,figsize=(12,8))
sns.despine()

#定义信号
#计算短期均线与长期均线的差s-1
security['s-1'] = security['short_window'] - security['long_window']
print(security['s-1'].tail)

#定义Regime为True,买入;Regime为False,卖出
security['Regime'] = np.where(security['s-1']>security['long_window']*SD,1,0)
security['Regime'].value_counts()

#信号时间分布
security['Regime'].plot(grid=False,lw=1.5,figsize=(12,8))
pylab.ylim((-0.1,1.1))
sns.despine()

security['Market'] = np.log(security['closePrice'] / security['closePrice'].shift(1))
security['Strategy'] = security['Regime'].shift(1) * security['Market']
security[['Market', 'Strategy', 'Regime']].tail()

security[['Market', 'Strategy']].cumsum().apply(np.exp).plot(grid=False, figsize=(12,8))
sns.despine()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在优矿平台上运行的均线策略代码: ``` # 导入函数库 import numpy as np import talib # 初始化函数,设定基准等等 def initialize(context): # 设定基准 set_benchmark('000001.XSHG') # 设定调仓周期 g.period = 20 # 获取股票池 g.stocks = get_index_stocks('000001.XSHG') # 设置手续费与滑点 set_slippage(FixedSlippage(0.02)) set_commission(PerTrade(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)) # 设置账户信息 g.initial_cash = context.portfolio.starting_cash g.cash = g.initial_cash g.max_value = g.initial_cash * 0.3 # 设置回测参数 g.days = 0 g.buy = False g.sell = False # 定义交易函数 def trade(context): # 获取当前持仓 positions = context.portfolio.positions # 卖出股票 for stock in positions: if g.sell and context.current_dt.hour > 14: order_target(stock, 0) g.cash += positions[stock].total_amount * positions[stock].last_sale_price g.sell = False # 买入股票 if g.buy and context.current_dt.hour > 14: # 获取股票池 stocks = g.stocks # 获取行情数据 prices = history(20, '1d', 'close')[stocks] # 计算短期均线和长期均线 ma5 = talib.MA(prices, timeperiod=5)[-1] ma20 = talib.MA(prices, timeperiod=20)[-1] # 产生买入信号 if ma5 > ma20: # 计算每只股票的权重 weights = (1 / len(stocks)) * np.ones(len(stocks)) # 计算最大买入量 max_value = g.max_value # 买入股票 for i in range(len(stocks)): stock = stocks[i] price = prices[stock][-1] value = max_value * weights[i] amount = value // price cash = amount * price if g.cash >= cash: order_value(stock, value) g.cash -= cash g.buy = False # 调整仓位 if g.days == g.period: g.sell = True g.buy = True g.days = 0 else: g.days += 1 # 处理数据函数 def handle_data(context, data): trade(context) # 运行回测 run_backtest(strategy_name='dual_moving_average_strategy', start_date='2010-01-01', end_date='2021-01-01', initialize=initialize, handle_data=handle_data, order_price_field='close', capital_base=g.initial_cash, benchmark='000001.XSHG') ``` 在上述代码中,我们首先使用了talib库计算了5日均线和20日均线,并根据两者的交叉产生买卖信号。然后,我们定义了交易函数,根据买卖信号进行买卖操作。最后,我们运行了回测,设置了回测起止日期、初始资金、交易费用等参数。在回测过程中,我们每20天进行一次调仓。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值