使用TUSHARE数据,用Python写一个应用行为金融学的羊群效应算法的选股模型,以整个A股市场为选股范围,行业中性,并用backtrader回溯,画出图形
时间: 2024-06-10 12:09:24 浏览: 124
基于python对tushare股票数据进行数据分析
非常好的问题!根据您的要求,我可以给您提供一个Python代码来实现这个选股模型。首先,您需要安装Tushare和Backtrader库。然后,您可以使用以下代码来实现羊群效应算法的选股模型:
```python
import tushare as ts
import backtrader as bt
class SheepSelection(bt.Algo):
def __init__(self, n=10, m=5):
self.n = n # 羊群大小
self.m = m # 效应阈值
self.order = None
self.buyprice = 0
self.buycomm = 0
def __call__(self, target):
if self.order:
return False
# 获取所有股票的涨跌幅数据
df = ts.get_today_all()
df = df[['code', 'changepercent']]
df = df[df['changepercent'] > 0]
df = df[df['changepercent'] <= 9.9]
# 计算每只股票的效应值
df['effect'] = 0
for i in range(len(df)):
code = df.iloc[i]['code']
effect = 0
for j in range(len(df)):
if i == j:
continue
changepercent = df.iloc[j]['changepercent']
effect += changepercent
effect /= (len(df) - 1)
df.loc[df['code'] == code, 'effect'] = effect
# 对效应值进行排序并选取羊群
df = df.sort_values(by='effect', ascending=False)
df = df.head(self.n)
# 计算羊群效应值
effect = df['changepercent'].mean()
# 如果效应值超过阈值,则进行买入操作
if effect > self.m:
close = target.close
size = int(target.broker.cash / close)
self.order = target.buy(size=size)
self.buyprice = close
self.buycomm = target.broker.getcommissioninfo(self.order).getcommission(size=size, price=close)
return False
def notify_order(self, order):
if order == self.order:
if order.status == order.Completed:
self.order = None
self.buyprice = 0
self.buycomm = 0
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.order = None
def notify_trade(self, trade):
if trade.isclosed:
self.buyprice = 0
self.buycomm = 0
```
这个算法会根据当天所有股票的涨跌幅数据,计算每只股票的效应值,并选取效应值最高的前n只股票作为羊群。如果羊群的平均效应值超过阈值m,则进行买入操作。您可以使用以下代码来回测这个选股模型:
```python
if __name__ == '__main__':
cerebro = bt.Cerebro()
data = bt.feeds.PandasData(dataname=ts.get_k_data('000001', start='2010-01-01'))
cerebro.adddata(data)
cerebro.addstrategy(bt.Strategy, algos=[SheepSelection(n=10, m=1)])
cerebro.addsizer(bt.sizers.PercentSizer, percents=10)
cerebro.broker.setcash(100000)
cerebro.broker.setcommission(0.002)
cerebro.run()
cerebro.plot()
```
这个代码会使用Tushare获取上证指数的K线数据,并使用backtrader进行回测。您可以根据自己的需要调整参数,例如羊群大小n和效应阈值m。同时,您也可以使用其他的数据源和回测工具,以满足您的需求。希望这个代码能够对您有所帮助!
阅读全文