DAY 1

变量

  • Julia允许重新定义内置常量和函数的值,前提是该常量或函数没有被引用过
  • 命名规范
    • 变量的名字采用小写。
    • 用下划线(_)分隔名字中的单词,但是不鼓励使用下划线, 除非在不使用下划线时名字会非常难读。
    • 类型(Type)和模块(Module)的名字使用大写字母开头,并且用大写字母 而不是用下划线分隔单词。
    • 函数(Function)和宏(Macro)的名字使用小写,不使用下划线。
    • 会对输入参数进行更改的函数要使用!结尾。这些函数有时叫做 “mutating” 或 “in-place” 函数,因为它们在被调用后,不仅仅会返回一些值 还会更改输入参数的内容。 #### 数值类型
  • 字面量和原始数值类型
    • 字面量(numeric literal):整数和浮点数在代码中作为立即数(1.01的显示表示)时称作数值的字面量。
    • 原始数值类型(numeric primitive):数值的内置表示(内存中二进制表示)。
  • 无符号整数
    • 0b/0o/0x前缀,以2/8/16进制输入输出。
    • 当字面量不是开头全是0时,它们二进制数据项的位数会是最少需要的位数。
    • 当开头都是0时,位数取决于一个字面量需要的最少位数,这里的字面量指的是一个有着同样长度但开头都为1的数。
    • 无符号数前加-号,产生补码数。
  • 可以用下划线作为数字的分隔符。
julia> 10_000, 0.000_000_005, 0xdead_beef, 0b1011_0010
(10000, 5.0e-9, 0xdeadbeef, 0xb2)
  • 特殊值:Inf/-Inf/NaN

  • 0

    • 整数类型除0报错。
    • 浮点数类型除0同数学。
  • 字面量系数:变量直接跟在一个数值字面量后,暗指乘法。2x^2 - 3x + 1等价于2*x^2-3*x+1,优先级同一元操作符。2^3x--->2^(3x)2x^3--->2*(x^3)

    • 也可以作用于括号:2(x-1)或者(x-1)x,但是(x-1)(x-1)或者x(x-1)不行。

运算符

  • Dot操作:每个二元运算符都有一个Dot运算符对应,.^^对应,将^广播到数组上。
    • 将点运算符用于数值字面量可能会导致歧义。例如,1.+x到底是表示1. + x还是 1 .+ x?这会令人疑惑。因此不允许使用这种语法,遇到这种情况时,必须明确地用空格消除歧义。
julia> [1,2,3] .^ 3
3-element Array{Int64,1}:
  1
  8
 27

#三者等价
a .^ b
(^).(a,b)
@. a^b
  • 特殊数值比较
    • +0<=-0
    • Inf=InfInf大于除了NaN的所有数
    • NaN不等于、不小于且不大于任何数值,包括它自己(用==时)
    • isequal(NaN, NaN)可以返回true
julia> isequal([1 NaN], [1 NaN])
true

julia> isequal(NaN, NaN32)
true

julia> -0.0 == 0.0
true

julia> isequal(-0.0, 0.0)
false
  • 链式比较
julia> 1 < 2 < 3 != 5
true

注意链式比较的执行顺序:

julia> v(x) = (println(x); x)
v (generic function with 1 method)

julia> v(1) < v(2) <= v(3)
2
1
3
true

julia> v(1) > v(2) <= v(3)
2
1
false

数值转换

  • Julia 支持三种数值转换,它们在处理不精确转换上有所不同。

    • T(x)convert(T,x)都会把x转换为T类型。

      • 如果T是浮点类型,转换的结果就是最近的可表示值,可能会是正负无穷大。
      • 如果T为整数类型,当x不为T类型时,会触发InexactError
    • x % T 将整数x转换为整型T,与x2^n的结果一致,其中nT的位数。换句话说,如果用二进制表示是被砍掉一部分的。

    • 舍入函数 接收一个T类型的可选参数。比如,round(Int,x)Int(round(x)) 的简写版。

复数和有理数

  • 全局常量im被绑定到复数\(i\)
  • 数学函数通常应用于实数就返回实数值,应用于复数就返回复数值。
julia> sqrt(-1)
ERROR: DomainError with -1.0:
sqrt will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).
Stacktrace:
[...]

julia> sqrt(-1 + 0im)
0.0 + 1.0im
  • 用变量构建复数时,建议用complex函数:complex(a, b)=a+b*im
2019/9/20 posted in  Julia

THE VERY BASIC

这里用来记录一些Python中最基础的东西

中文编码

Python中默认的编码格式是ASCII格式,所以打印汉字时要在文件开头声明编码。

# -*- coding: UTF-8 -*- 
或者
#coding=utf-8
import的搜索路径
  1. 当前目录
  2. PYTHONPATH下的每个目录
  3. 默认路径,UNIX下,一般为/usr/local/lib/python/
namespace

Python假设任何在函数内赋值的变量都是局部的,因此给函数内的全局变量赋值,必须使用global语句

reload()函数

当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。

因此,如果你想重新执行模块里顶层部分的代码,可以用 reload()函数。该函数会重新导入之前导入过的模块,这样就允许在不退出解释器的情况下重新加载已更改的Python模块。

包的结构

包中必须存在 __init__.py 文件, 该文件的内容可以为空。__init__.py 用于标识当前文件夹是一个包。

IO

raw_input([prompt]) 函数从标准输入读取一个行,并返回一个字符串(去掉结尾的换行符)

str = raw_input("请输入:")
print "你输入的内容是: ", str
------------------------------
>>请输入:Hello Python!
>>你输入的内容是:  Hello Python!

input([prompt])raw_input([prompt]) 基本类似,但是 input 可以接收一个Python表达式作为输入,并将运算结果返回。

str = input("请输入:")
print "你输入的内容是: ", str
------------------------------
>>请输入:[x*5 for x in range(2,10,2)]
>>你输入的内容是:  [10, 20, 30, 40]
私有方法、属性
  • __private_attrs:两个下划线开头,声明该属性为私有
  • __private_method:两个下划线开头,声明该方法为私有方法

以使用 object._className__attrName访问私有属性,不能这样访问函数。

class Runoob:
    __site = "www.runoob.com"

runoob = Runoob()
print runoob._Runoob__site
-------------
>>www.runoob.com
下划线
  • __NAME__::定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。
  • _NAME:protected
  • __NAME:private
SQL
import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")

# 使用 fetchone() 方法获取一条数据
data = cursor.fetchone()

sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > '%d'" % (1000)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 获取所有记录列表
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
      # 打印结果
      print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
             (fname, lname, age, sex, income )
except:
   print "Error: unable to fecth data"

#提交修改
db.commit()

#回滚
db.rollback()

# 关闭数据库连接
db.close()
多线程
thread模块

级别较低

import thread
 
# 为线程定义一个函数
def func(a, b):
   ...
 
# 创建两个线程
try:
   thread.start_new_thread( func, ("a", 1, ) )
   thread.start_new_thread( func, ("b", 2, ) )
except:
   print "Error: unable to start thread"
threading

直接从threading.Thread继承,然后重写__init__方法和run方法。

 
import threading
import time
 
exitFlag = 0
 
class myThread (threading.Thread):   
    def __init__(self):
        threading.Thread.__init__(self)
        
    def run(self):                  
        ...
 
# 创建新线程
thread1 = myThread()
thread2 = myThread()
 
# 开启线程
thread1.start()
thread2.start()
2018/8/13 posted in  Relearning Python

一些思考

20180417

  • 战胜市场实在是too damn hard,市场好的时候赚钱很容易,市场不好的时候,钱亏得更快,所以不要妄想要战胜市场了,能够紧跟市场就已经非常了不起了
  • 炒股需要耐心,所以不能以一种赚钱的心态来炒股。扔一些闲散的钱进去可以保证自己不会太急躁太焦虑,急躁和焦虑会影响判断。尽管随着资金流动市场或者股票会有短期的波动,但是长期来看,好的公司还是能够稳稳地拿到收益的。
  • 尽量不要满仓。
2018/4/17 posted in  Quant

RE:start

今天想了一下,觉得还是把博客开回来比较好,毕竟可以坚持一段时间写写东西是一个很好的习惯。

上次的博客我想要弄成一个非常偏技术,很hard core的东西,给人看起来比较炫酷。但是实践证明这样真的蛮累的,我把大量的时间放在了格式、美观上,完全没法专心于内容本身。所以以后就随便写点啥吧。记录一下自己的学习心得,炒股时的感受,最近看的书。

最近心态发生了很大的变化,对一些事情的看法发生了改变。以前我会把技术看的很重,觉得只要有精巧的模型,一切问题都可以被解决。我想如果我有一个模拟市场上每个交易员行为的模型,我用随机的方法产生很多交易员,就可以精确的模拟出股价的波动,这有一点拉普拉斯妖的感觉。但是现在我觉得技术、非常细枝末节的东西反而并不是最重要的,一些形而上、思想形态的东西反而起到决定作用。同样的,我以前觉得哲学好像是非常虚的东西,而现在看来,这些高屋建瓴的东西,其实反而更应该被重视。

2018/3/23 posted in  其他