df.rolling(period,min_period).method()

df.rolling(period,min_period).somemethod()

rolling 方法很好用


freq 参数:从0.18版本中已经被舍弃。


第二种方法:pd.rolling_max(df['A'],15)

使用时提示:pd.rolling_sum is deprecated for Series and will be removed in a future version, replace with 

Series.rolling(min_periods=24,window=24,center=False).sum()

“请使用第一种方法”


#coding:gbk import pandas as pd import numpy as np import talib from xtquant import xtdata def init(C): C.stock = C.stockcode + '.' + C.market C.accountid = "testS" C.position_rate = 0.1 C.profit_target = 0.05 C.loss_target = -0.02 C.max_daily_buy = 3 C.daily_buy_count = 0 C.last_trade_date = None # 下载历史数据 xtdata.download_history_data(C.stock, '5m') # 初始化技术指标变量 C.close = [] C.ma5 = [] C.ma20 = [] C.rsi = [] C.macd = [] C.signal = [] C.volume_ratio = 0 def handlebar(C): # 获取当前时间 bar_timetag = C.get_bar_timetag(C.barpos) bar_date = timetag_to_datetime(bar_timetag, '%Y%m%d%H%M%S') current_date = bar_date[:8] # 重置每日买入计数 if C.last_trade_date != current_date: C.daily_buy_count = 0 C.last_trade_date = current_date # 获取5分钟数据 min5_data = xtdata.get_market_data_ex(['open', 'high', 'low', 'close', 'volume'], [C.stock], period='5m', count=100) if len(min5_data) < 100: print(f"{bar_date} 5分钟数据不足,跳过") return # 计算技术指标 close = np.array(min5_data[C.stock]['close']) volume = np.array(min5_data[C.stock]['volume']) C.close = close C.ma5 = talib.MA(close, timeperiod=5) C.ma20 = talib.MA(close, timeperiod=20) C.rsi = talib.RSI(close, timeperiod=14) C.macd, C.signal, _ = talib.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9) avg_volume = np.mean(volume[-6:-1]) C.volume_ratio = volume[-1] / avg_volume # 获取账户和持仓信息 account = get_trade_detail_data('test', 'stock', 'account')[0] available_cash = int(account.m_dAvailable) total_asset = int(account.m_dBalance) holdings = get_trade_detail_data('test', 'stock', 'position') holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID: {'volume': i.m_nVolum
03-19
import pandas as pd import akshare as ak import warnings warnings.filterwarnings(‘ignore’) ======参数设置====== start_date = ‘20100101’ #开始日期 end_date = ‘20250320’ #结束日期 ma_length = 26 #均线长度 cost = 0.0003 #交易费率,万三 获取美债收益率数据 bond_df = ak.bond_zh_us_rate(start_date=start_date) bond_df[‘日期’] = bond_df[‘日期’].apply(lambda x: x.strftime(‘%Y-%m-%d’)) 获取沪深300指数数据 hs300_df = ak.index_zh_a_hist(symbol=‘000300’, period=‘daily’, start_date=start_date, end_date=end_date) hs300_df[‘涨跌幅’] = hs300_df[‘涨跌幅’] / 100.0 #将百分比转化成小数形式 合并数据,以沪深300日期为准 df = pd.merge(hs300_df[[‘日期’, ‘收盘’, ‘涨跌幅’]].rename(columns={‘收盘’:‘沪深300’}), bond_df[[‘日期’,‘美国国债收益率10年’]].rename(columns={‘美国国债收益率10年’:‘美债收益率’}), on=‘日期’, how=‘left’).fillna(method=‘ffill’).reset_index(drop=True) df[‘日期’] = pd.to_datetime(df[‘日期’]) # ======获取每周最后一个交易日====== rule:重采样频率,W-周频,M-月频 week_df = df.resample(rule=‘W’, on=‘日期’).agg({‘日期’:‘last’,‘美债收益率’:‘last’}).dropna() week_df[‘美债收益率MA’] = week_df[‘美债收益率’].rolling(ma_length).mean() week_df[‘周最后交易日’] = 1 week_df.index.name = ‘date’ # 拼接数据 day_df = pd.merge(df.drop(columns=[‘美债收益率’]), week_df, on=‘日期’, how=‘left’) day_df[‘周最后交易日’] = day_df[‘周最后交易日’].fillna(value=0) # 生成交易信号 如果 r-r_ma(26)<0,认为情绪偏多,今日只能看到昨日的数据 day_df.loc[((day_df[‘美债收益率’]-day_df[‘美债收益率MA’]).shift(1)<0) & (day_df[‘周最后交易日’].shift(1)>0), ‘signal’] = 1 如果 r-r_ma(26)>0,认为情绪偏空,今日只能看到昨日的数据 day_df.loc[((day_df[‘美债收益率’]-day_df[‘美债收益率MA’]).shift(1)>0) & (day_df[‘周最后交易日’].shift(1)>0), ‘signal’] = -1 day_df = day_df.set_index(‘日期’, drop=True) # 将交易信号转化为持仓 day_df[‘signal’] = day_df[‘signal’].fillna(method=‘ffill’).fillna(value=0) day_df[‘position’] = day_df[‘signal’].shift(1).fillna(value=0) #收盘交易,下一日才会有持仓 考虑交易成本 day_df[‘after_cost’] = 1.0 day_df.loc[day_df[‘signal’] != day_df[‘signal’].shift(1), ‘after_cost’] = (1.0 + cost) * (1.0 + cost) #开平仓各收一次手续费 day_df.loc[(day_df[‘signal’].shift(1) == 0) & (day_df[‘signal’] != 0), ‘after_cost’] = 1.0 + cost #第一次开仓只收一次手续费 day_df.loc[day_df.index[0], ‘after_cost’] = 1.0 # 画出净值曲线图 import matplotlib.pyplot as plt plt.rcParams[‘font.sans-serif’] = [‘SimHei’] plt.rcParams[‘axes.unicode_minus’] = False 择时策略的日收益率 day_df[‘strategy_pct’] = day_df[‘涨跌幅’] * day_df[‘position’] #策略和沪深300的净值 day_df[‘strategy’] = (1.0 + day_df[‘strategy_pct’]).cumprod() / day_df[‘after_cost’].cumprod() day_df[‘benchmark’] = (1.0 + day_df[‘涨跌幅’]).cumprod() 粗略计算年化收益率 annual_return = 100 * (pow(day_df[‘strategy’].iloc[-1], 250/day_df.shape[0]) - 1.0) print(‘美债收益率大盘择时策略的年化收益率:%.2f%%’ %annual_return) #将索引从字符串转换为日期格式,方便展示 ax = day_df[[‘strategy’,‘benchmark’]].plot(figsize=(16,8), color=[‘SteelBlue’,‘Red’], grid=True, title=‘美债收益率大盘择时策略净值’) plt.show() 给上述代码再加上最大回撤及夏普比率 卡玛比率代码 比较基准也一块加上
03-22
Traceback (most recent call last): File "C:\Xbx.data.V2\strategy-A\select-stock-pro_v1.1.1\program\step3_选股.py", line 39, in <module> select_stocks(conf, boost=False) File "C:\Xbx.data.V2\strategy-A\select-stock-pro_v1.1.1\core\select_stock.py", line 192, in select_stocks return select_stock_by_conf(confs, boost=boost) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Xbx.data.V2\strategy-A\select-stock-pro_v1.1.1\core\select_stock.py", line 243, in select_stock_by_conf select_stocks_by_strategy(strategy, result_folder, period_offset) File "C:\Xbx.data.V2\strategy-A\select-stock-pro_v1.1.1\core\select_stock.py", line 294, in select_stocks_by_strategy factor_df = strategy.calc_select_factor(factor_df) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Xbx.data.V2\strategy-A\select-stock-pro_v1.1.1\core\model\strategy_config.py", line 390, in calc_select_factor return self.funcs['calc_select_factor'](period_df, self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Xbx.data.V2\strategy-A\select-stock-pro_v1.1.1\策略库\中等生作业.py", line 103, in calc_select_factor .apply(calc_correlation, raw=False) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\CEECNF\.conda\envs\Fuel\Lib\site-packages\pandas\core\window\rolling.py", line 2049, in apply return super().apply( ^^^^^^^^^^^^^^ File "C:\Users\CEECNF\.conda\envs\Fuel\Lib\site-packages\pandas\core\window\rolling.py", line 1508, in apply return self._apply( ^^^^^^^^^^^^ File "C:\Users\CEECNF\.conda\envs\Fuel\Lib\site-packages\pandas\core\window\rolling.py", line 723, in _apply result = super()._apply( ^^^^^^^^^^^^^^^ File "C:\Users\CEECNF\.conda\envs\Fuel\Lib\site-packages\pandas\core\window\rolling.py", line 619, in _apply return self._apply_columnwise(homogeneous_func, name, numeric_only) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\CEECNF\.conda\envs\Fuel\Lib\site-packages\pandas\core\window\rolling.py", line 494, in _apply_columnwise res = homogeneous_func(arr) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\CEECNF\.conda\envs\Fuel\Lib\site-packages\pandas\core\window\rolling.py", line 614, in homogeneous_func result = calc(values) ^^^^^^^^^^^^ File "C:\Users\CEECNF\.conda\envs\Fuel\Lib\site-packages\pandas\core\window\rolling.py", line 602, in calc start, end = window_indexer.get_window_bounds( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\CEECNF\.conda\envs\Fuel\Lib\site-packages\pandas\core\indexers\objects.py", line 429, in get_window_bounds window_indices = np.append(window_indices, [window_indices[-1] + 1]).astype( ~~~~~~~~~~~~~~^^^^ IndexError: index -1 is out of bounds for axis 0 with size 0还是出现这个问题
最新发布
04-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值