我正在研究python中可用于交易的遗传算法。如果您熟悉进化算法,原理很简单: 基因代表交易策略:更具体地说,每个基因都是这种形式的树:
这可以解释为这样的布尔值:
如果:
50 最后库存值的平均值 更少 实际价格
最低 6 最后库存值更少实际价即可。 然后回答* True **,否则 False
如果答案为真,则发送买入信号,否则卖出信号。
这是我如何在python中表示这样的树的示例:
class BinaryRule:
def __init__(self, child1, child2):
self.child1 = child1
self.child2 = child2
class LessThan(BinaryRule):
name = '<'
def eval(self):
return self.child1.eval() < self.child2.eval()
# Here there is the definition of the other classes
# and then I create the tree
tree = rules.LessThan(
rules.Max( rules.Float(1) ),
rules.SMA( rules.Float(15) ),
)
print tree.eval() # True or false
问题在于我无法为交叉和突变运算符考虑好技术。有什么想法吗?
答案 0 :(得分:1)
这通常不是遗传算法的代表方式,我个人并不认为遗传算法是正确的方法,但这当然是可能的。
假设您只想与这组特定变量进行交互,那么您有一小组潜在价值:
boolean = "and"
comparator = "<"
等...
这意味着您可以轻松地将这些表示为平面列表:
chromosome = ["and", "<", ...]
交叉然后只是在某个特定的分裂点混合两条染色体:
def crossover(cr1, cr2):
split_point = random.randint(1, len(cr1))
return [cr1[:split_point] + cr2[split_point:]], [cr2[:split_point] + cr1[split_point:]]
然后变异也是相对微不足道的,只是随机改变一个数字,切换布尔运算符等等......我会把那个作为练习留给读者。
答案 1 :(得分:0)
您的运算符应该可以安全地互换 - 如果所有运算符都接受相同的输入类型并返回相同的输出类型(很可能是浮点数)。
没有必要但是一个好主意(通过神经网络):使用可区分的运算符函数 - 即不是返回YES或NO,而是返回&#34; yes-of-ness&#34;。这为您的表达提供了更多渐进的反馈。为每个操作员提供一个设定值控制值以调整其行为也是有用的。
变异算子可以改变运算符的类型或设定值;交叉操作通常会交换子树。
一个相当标准的二叉树表示形式是一个列表,如[head,left,right,left-left,left-right,right-left,right-right,left-left-left,...] 。好的是,给定任何节点的索引,您可以立即计算父,子和右子索引;缺点是,如果你有一个稀疏的树结构,它会浪费很多空间。另外,正确复制子树应该通过递归函数完成,而不是像上面显示的@Slater那样简单的切片和拼接。