# 干货-选币系统-选币因子

Author: 陈皮, Date: 2022-02-12 11:13:58
Tags:

```import numpy as np
from scipy.stats import norm
from sklearn import preprocessing
import json

#计算波动率因子值
def GetAtrFactorService(records):
atrlength = 14
atrs = TA.ATR(records, atrlength)
acs = sorted(range(len(atrs)), key=lambda k: atrs[k])
ac = acs[-1]
arr_mean = np.mean(acs)
arr_std = np.std(acs,ddof=1)
p = norm.cdf(x=ac, loc=arr_mean, scale = arr_std)
#P值越大，波动性越大
atrFactor = _N(p,3)
return atrFactor

#计算机构的行为痕迹因子值
def GetITFactorService(records):
#本福特定律分布频数
PN = [301, 176, 125, 97, 79, 67, 58, 51, 46]
FN = [0, 0, 0, 0, 0, 0, 0, 0, 0]
for i in range(len(records)):
valume = records[i]['Volume']*10000
strValume = str(valume)
num = strValume[0]
for j in range(len(FN)):
key = j + 1
if int(num) == key:
FN[j] += 1
if sum(FN) == 0:
FN = PN
X = 0
for i in range(len(PN)):
X += (FN[i] - PN[i])**2
ITFactor = X
#X 的数值越大，则成交量数据与本福特理想分布的偏离越大，机构的行为痕迹也越大
return ITFactor

#计算价格因子值
def GetPriceFactorService(records):
record = records[-1]
price = record["Close"]
PFactor = 1/price
#PFactor数值越大，则价格越小
return PFactor

#标准化处理   --计算出来的因子值因为数量级不同，要进行标准化处理。暂不处理空值、异常值
def StandardizedService(factor):
# 标准化处理
factorArray = np.asarray(factor)
factorArray = preprocessing.scale(factorArray)
factor = factorArray.tolist()

ext.GetAtrFactorService = GetArtFactorService
ext.GetITFactorService = GetITFactorService
ext.GetPriceFactorService = GetPriceFactorService
ext.StandardizedService = StandardizedService
```

More