动量策略momentum_selection

#动量策略(改进策略请咨询博主)

import pandas as pd
import numpy as np
import datetime as dt
import matplotlib.pyplot as plt
Mdata = pd.read_csv(r'C:\Users\Lenovo\Desktop\work\量化投资\TRD_Mnth.csv')

Mdata.info()    #or use Mdata.dtypes  
Mdata.head()
Mdata.tail()

Mdata['Trdmnt1']=pd.to_datetime(Mdata.Trdmnt)
Mdata['date2']=Mdata.Trdmnt1.dt.year
Mdata['date3']=Mdata.Trdmnt1.dt.month
Mdata['date']=pd.PeriodIndex(year=Mdata.date2,month=Mdata.date3,day=Mdata.Clsdt, freq="D")
del Mdata['Trdmnt1']
del Mdata['date2']
del Mdata['date3']
del Mdata['Clsdt']


#1.calculate returen_6month
Mdata=Mdata.sort_values(by=['Stkcd','Trdmnt'],ascending=[True,True])  
Mdata['ret_lag6']=(Mdata.Mclsprc-Mdata.Mclsprc.shift(6))/Mdata.Mclsprc.shift(6)
Mdata.loc[Mdata.loc[:,'date']<=dt.datetime(2011,6,30),'ret_lag6']=np.NaN




#2.select 10 stocks with highest return_6month
Mdata2=Mdata.dropna(subset=['ret_lag6']).loc[:,['Trdmnt','Stkcd','ret_lag6']]
Mdata2=Mdata2.sort_values(by=[
import pandas as pd import numpy as np from datetime import datetime, timedelta # ======================== # 策略核心参数配置 # ======================== class StrategyConfig: # 股票筛选范围 STOCK_NUM = 30 # 入选股票数量 MIN_PRICE = 5.0 # 最低股价(元) MAX_PRICE = 200.0 # 最高股价(元) MIN_PE = 3.0 # 最低市盈率 MAX_PE = 50.0 # 最高市盈率 MIN_MARKET_CAP = 20e8 # 最小市值(20亿) MAX_MARKET_CAP = 500e8 # 最大市值(500亿) MIN_AMOUNT_20 = 2e7 # 20日最低成交额(2000万) # 因子权重 VOLATILITY_WEIGHT = 0.3 # 波动因子权重 MOMENTUM_WEIGHT = 0.7 # 动量因子权重 # 止损设置 STOP_LOSS_RATIO = 0.15 # 15%止损线 # 再平衡周期(交易日) REBALANCE_DAYS = 20 # ======================== # 数据获取与预处理 # ======================== def fetch_stock_data(start_date, end_date): """ 模拟从数据库获取股票数据 实际应用中替换为真实数据接口 """ # 生成模拟数据 np.random.seed(42) date_range = pd.date_range(start_date, end_date) stocks = [f'stock_{i:03d}' for i in range(1, 101)] data = pd.DataFrame({ 'date': np.repeat(date_range, len(stocks)), 'instrument': np.tile(stocks, len(date_range)), 'close': np.random.uniform(5, 200, len(date_range)*len(stocks)), 'amount': np.random.uniform(1e7, 5e8, len(date_range)*len(stocks)), 'pe': np.random.uniform(2, 60, len(date_range)*len(stocks)), 'market_cap': np.random.uniform(1e8, 1000e8, len(date_range)*len(stocks)), 'pu_stm': np.random.uniform(0.1, 0.5, len(date_range)*len(stocks)) # 波动率因子 }) # 计算20日成交额 data['amount_20'] = data.groupby('instrument')['amount'].transform( lambda x: x.rolling(20).sum() ) return data # ======================== # 策略核心逻辑 # ======================== def low_vol_value_momentum_strategy(data, config): """ 低波动价值动量轮动策略核心实现 """ # 基础筛选条件 df = data[ (data['close'] >= config.MIN_PRICE) & (data['close'] <= config.MAX_PRICE) & (data['pe'] >= config.MIN_PE) & (data['pe'] <= config.MAX_PE) & (data['market_cap'] >= config.MIN_MARKET_CAP) & (data['market_cap'] <= config.MAX_MARKET_CAP) & (data['amount_20'] >= config.MIN_AMOUNT_20) ].copy() # 计算20日动量 df['momentum_20'] = df.groupby('instrument')['close'].pct_change(20) # 计算综合评分 df['volatility_rank'] = df.groupby('date')['pu_stm'].rank(pct=True) df['momentum_rank'] = df.groupby('date')['momentum_20'].rank(pct=True) # 修正后的评分公式 (使用反转逻辑) df['composite_score'] = ( config.VOLATILITY_WEIGHT * df['volatility_rank'] + config.MOMENTUM_WEIGHT * (1 - df['momentum_rank']) # 反转因子 ) # 选取每期最佳股票 selected_stocks = df.sort_values(['date', 'composite_score'], ascending=[True, False]) \ .groupby('date') \ .head(config.STOCK_NUM) \ [['date', 'instrument', 'close', 'composite_score', 'pe', 'market_cap']] return selected_stocks # ======================== # 止损与交易执行 # ======================== def execute_trading(portfolio, current_data, config): """ 交易执行与止损逻辑 """ # 止损检查 for inst, position in portfolio.positions.items(): current_price = current_data[inst]['close'] cost_price = position['cost_basis'] # 触发止损条件 if current_price < cost_price * (1 - config.STOP_LOSS_RATIO): print(f"止损触发: {inst} | 成本价: {cost_price:.2f} | 现价: {current_price:.2f}") # 执行卖出操作 sell_order(inst, position['quantity']) del portfolio.positions[inst] # 买入新标的 for _, row in current_data.iterrows(): inst = row['instrument'] if inst not in portfolio.positions: # 计算买入价格(收盘价) buy_price = row['close'] # 执行买入 buy_order(inst, buy_price) portfolio.positions[inst] = { 'cost_basis': buy_price, 'quantity': calculate_position_size(portfolio.capital, buy_price), 'entry_date': row['date'] } # ======================== # 辅助函数 # ======================== def buy_order(instrument, price): print(f"买入信号: {instrument} | 价格: {price:.2f}") def sell_order(instrument, quantity): print(f"卖出信号: {instrument} | 数量: {quantity}") def calculate_position_size(capital, price): """计算头寸规模 (简化版)""" return int((capital * 0.01) / price) # 每只股票占1%仓位 # ======================== # 策略执行入口 # ======================== def run_strategy(): # 初始化配置 config = StrategyConfig() # 设置回测日期范围 end_date = datetime.today().strftime('%Y-%m-%d') start_date = (datetime.today() - timedelta(days=365)).strftime('%Y-%m-%d') # 获取数据 print("获取股票数据中...") all_data = fetch_stock_data(start_date, end_date) # 执行策略 print("执行选股策略...") selected_stocks = low_vol_value_momentum_strategy(all_data, config) # 按再平衡周期筛选 rebalance_dates = selected_stocks['date'].drop_duplicates().sort_values() rebalance_dates = rebalance_dates[::config.REBALANCE_DAYS] # 模拟投资组合 portfolio = { 'capital': 1_000_000, 'positions': {} } # 遍历每个再平衡日 print("\n===== 符合买入条件的股票 =====") for date in rebalance_dates: daily_selection = selected_stocks[selected_stocks['date'] == date] # 打印当日选股结果 print(f"\n日期: {date.strftime('%Y-%m-%d')}") print(daily_selection[['instrument', 'close', 'composite_score']].to_string(index=False)) # 执行交易 execute_trading(portfolio, daily_selection, config) print("\n策略执行完成") # 运行策略 if __name__ == "__main__": run_strategy()将以上代码改用bigquant收集数据,其他不变
最新发布
08-19
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值