大智慧、通达信winner函数python代码实现

大智慧、通达信软件,公式中有一个winner函数,函数的作用是计算收盘获利比率。即计算按照目前收盘价,计算有多少比例持仓是盈利的。要计算获利比率,首先得计算筹码分布,就是持仓价格分布。由于无法知道真实的交易情况,只能大致的估计。首先举个例子,假如某只股票有1000万股,第一天平均交易价格10元,第二天换手率20%,平均交易价格11元,那第二天的筹码分布为,10元:1000 * (1 - 0.2)=800万,11元:1000 * 0.2 = 200万。第三天换手率30%,平均交易价格12元,那第三天的筹码分布为,10元:1000 * (1 - 0.2)* (1 - 0.3)= 560万,11元:1000 * 0.2 * (1 - 0.3) = 140万,12元:1000 * 0.3 = 300万,以此类推。代码如下:

def winner_core(ContextInfo, close):
	close_price = close[-1]
	
	#获取上市日期
	#ipo_date = ContextInfo.get_open_date(ContextInfo.get_universe()[0])
	df = ContextInfo.get_market_data(['volume', 'amount'], stock_code = ContextInfo.get_universe(), skip_paused = True, period = '1d', dividend_type = 'front', end_time = close.index[-1], count = 250)
	df = df.loc[df['volume'] != 0]
	df['mean'] = df['amount'] / df['volume'] / 100
	turnover_rate = ContextInfo.get_turnover_rate(ContextInfo.get_universe(), df.index[0], df.index[-1])
	df['turnover'] = turnover_rate['000001.SZ'].values
	df['turnover'][0] = 0
	#1减去换手率
	df['1_turnover'] = 1 - df['turnover']
	df['2_turnover'] = df['1_turnover'][::-1].values
	df['3_turnover'] = df['2_turnover'].shift(periods = 1)
	df['3_turnover'][0] = 1
	#print(df[['1_turnover', '2_turnover', '3_turnover']])
	df['4_turnover'] = df['3_turnover'].cumprod()[::-1].values
	df['turnover'][0] = 1
	df['chouma'] = df['turnover'] * df['4_turnover']
	return df.loc[df['mean'] < close_price]['chouma'].sum()

def winner(ContextInfo, close):
	result = []
	n = len(close)
	for i in range(n):
		res = winner_core(ContextInfo, close[: i + 1])
		result.append(res)
	return pd.Series(result, index = close.index)

以上是000001计算出来的收盘获利比率,跟同花顺对比,还是很相近的。

注意:以上计算都是估算值。

### 关于通达信 WINNER 函数Python 实现 在进行股票数据分析或交易自动化过程中,确实存在对特定技术指标的需求,比如通达信中的`WINNER`函数。该函数用于计算获利盘比例,即当前价格下已获利的流通股占总流通股本的比例[^2]。 由于现有的 TAlib 库并未提供 `WINNER` 和 `COST` 的直接支持,因此需要自行实现这些功能。下面是一个基于 Python 的自定义实现方案: #### 自定义 WINNER 函数 ```python def winner(close_prices, cost_price): """ 计算给定收盘价序列中超过指定成本的价格所占比率 参数: close_prices (list): 收盘价列表 cost_price (float): 成本价 返回: float: 获利盘比率 """ above_cost = sum(1 for p in close_prices if p >= cost_price) total_days = len(close_prices) return round((above_cost / total_days), 4) * 100 if total_days != 0 else None ``` 此方法通过遍历历史收盘价来统计高于设定的成本价位的数量,并据此得出获利百分比。需要注意的是,这只是一个简化版本,在实际应用中还需要考虑更多因素如成交量加权等以更贴近真实情况。 另外一种方式是从源码层面入手,尝试理解并模仿通达信内部算法逻辑编写相应的 Python 版本。不过这种方式较为复杂且耗时较长,适合有一定开发经验和技术背景的人士探索。 对于希望提高性能的情况,可以利用 NumPy 或 Pandas 来加速数值运算过程,从而减少执行时间。例如使用Pandas DataFrame结构存储和操作数据会更加方便快捷。 最后值得注意的一点是,尽管可以通过上述手段获得近似的结果,但由于不同平台间可能存在细微差异以及各自独特的优化措施,完全一致或许难以达成。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值