用Numpy做一個自己的股票分析系統
HST-PF
凹賴
- 自我介紹
- 基礎知識
- 開始分析
- 建構系統
自我介紹
我是誰?
- HST core member
- 小小工程師
- 宅心人厚的陽宅
- 史萊哲林信徒
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679515/_____.gif)
mail:pf@hst.tw
為什麼會想研究股票?
身為一個小小上班族
每天領著微薄的薪水
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/1857441/_.jpg)
你知道工程師窮到
連土都吃不起嗎?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/1861177/132735196_11n.jpg)
沒有,因為你只想到
你自己
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/1861179/okayguy.jpg)
身為一個專業魯蛇
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/1861201/_____5___.jpg)
還是想要成為
傳說中的高富帥
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/1861194/_____.jpg)
但是在鬼島惡劣的環境下
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/1861189/i2016773.jpg)
想要突破魯蛇進入上流社會
似乎是個遙不可及的夢
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/1857222/3NB77NVS0BOe0003.jpg)
在無法提高年薪的窘境下,只好想尋找其他收入了!!
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/1857247/____.jpg)
為什麼想來Pycon分享?
基礎知識
基礎知識
- 賽局理論
- 古諾競爭
- 奧肯法則
- 凱恩斯利律效應
- 李嘉圖等價
- 菲利普斯曲線
- 瓦爾拉斯定律
這些今天通通不會講
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2621704/_____.jpg)
真.基礎知識
- 投資與投機
- 股票與期貨
- 技術分析
傳說中,斯斯有兩種
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2429443/1340715460-2797322819_n.jpg)
?
理財也分兩種
投資
投機
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2621786/_____.jpeg)
投資
投機
時間
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2621808/__________.gif)
分析
風險
投資
投機
時間
分析
風險
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649554/John_Cena.jpg)
降息啦!!
投資
投機
時間
分析
風險
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649616/_____________.png)
投資
時間
分析
風險
投機
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649632/_______.gif)
時間
分析
風險
投機
投資
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649639/______________.png)
時間
分析
風險
投機
投資
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649636/______.gif)
股票與期貨
股票 (Stock)
- 有價證卷
- 公司資本部份所有權的憑證
- 可以獲得股息和股利
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
但如果股票沒價了呢
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2649772/stock.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2678750/3503653_205722214704_2.jpg)
期貨 (Futures)
- 一種投資衍生工具
- 商品期與金融期
- 可輕易的多和空
- 可看成槓桿較高的股票
股票市場如何賺錢?
想像成一個政府開的賭場
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675486/20150413161107658.jpg)
政府
散戶
大戶
散戶
散戶
散戶
只要猜對大小就可以賺到錢
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675559/__.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675560/__.jpg)
但是如果你真的把他當賭博
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675571/______.jpg)
那我們這些宅宅程式猿要怎麼在股海中賺到錢
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2429575/_____.png)
技術分析
技術分析
- 使用過去資訊推測未來趨勢
- 只考慮價格行為
- 建立在「歷史會不斷重演」
常見技術分析
- K線
- 移動平均線
- 隨機指數
- 道式理論
- 波浪理論
- .......
有這麼多方法要用那個呢?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2668203/_____.jpg)
讓我們聽聽專家的意見
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2668253/_____.jpg)
名嘴1:這裡我們可以
看到趨勢上升,宜做多
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2668310/k-chart.png)
名嘴2:這裡進入箱型整理, 建議觀望
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2668310/k-chart.png)
名嘴3:這裡並無突破季線, 是假回檔, 宜做空
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2668310/k-chart.png)
宅宅:X!都給你說就好了阿
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2668402/______.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2668440/____________.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2668414/_______.jpg)
開始分析
愛因斯坦:上帝不擲骰子
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2704583/14314791470946.jpg)
分析前有一件非常重要的事
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675841/_________.jpg)
你沒資料分析個0
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675753/___.jpg)
那資料要去那裡抓呢?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675772/____________.jpg)
想要嗎?我都放在那裡了
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675774/_______.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675794/___.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675795/___.jpg)
不過爬蟲不在這次範圍
大家就自求多福
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675809/_____.jpg)
如果你有幸把資料抓下來了
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675744/____________.jpg)
我們就來看看那些資訊很重要
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675900/_________.jpg)
重要資訊
- 時間
- 開盤價 (Open)
- 收盤價 (Close)
- 最高價 (High)
- 最低價 (Low)
- 成交量 (Volume)
掌握好資料後就
可以開始分析啦!
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675925/______.gif)
移動平均線 (MA)
MA
=
P1 + P2 +...+ Pn
n
+ ....
Px :第x天的價格
n :n日
移動平均線 (MA)
def getMA(ori, n):
MA = []
MA.append(sum([ori[i] for i in range(n)]))
for i in range(1, len(ori)-n):
MA.append(MA[-1] - ori[i-1] + ori[i+n])
for i in range(len(ori)):
MA[i] /= n
return MA
股票交易只有三種情形
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2677757/________.jpg)
買進
賣出
不動
買進
賣出
不動
0
-1
1
判斷買賣點
def judge(ori, MA):
state = []
for i in range(len(ori)):
if ori[i] > MA[i]:
state.append(-1)
elif ori[i] < MA[i]:
state.append(1)
else:
state.append(0)
return state
計算收益
def calculateEarning(ori, state):
earning = 0
price = 0
if state[0] != 0:
price = ori[0]
for i in range(1, len(ori)):
if state[i-1] != state[i]:
if state[i-1] == 1:
earning += ori[i] - price
elif state[i-1] == -1:
earning -= ori[i] - proce
price = ori[i]
return earning
隨機指標 (KD)
RSV
=
Cn - Ln
Hn - Ln
:自定義參數
x
100%
Kn
=
⍺
.
RSVn
+
(1 -
⍺
)
.
Kn-1
Dn
=
⍺
.
Kn
+
(1 -
⍺
)
.
Dn-1
⍺
Cn:第n日收盤價
Hn:n日內最高價
Ln:n日內最低價
隨機指標 (KD)
def RSV(ori, i, n):
ln = min(ori[i-n:i])
hn = max(ori[i-n:i])
return ( ori[i] - ln ) / ( hn - ln )
def K(i):
return alpha * rsv + (1-alpha) * K(i-1)
def D(i):
return alpha * K(i) + (1-alpha) * D(i-1)
判斷買賣點
def judge(K, D):
state = []
for i in range(len(K))
if K[i] > D[i]:
state.append(1)
elif K[i] < D[i]:
state.append(-1)
else:
state.append(0)
return state
那我是要看30日線
還是60日線?
KD值要高於80還是
70才算超買?
⍺值要設定1/3還是1/2?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2675627/________.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2439062/___________.jpg)
雖然我們無法求得最佳解
但是我們能求近似解
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2677945/____________.jpg)
代入參數
判斷多空
計算利潤
Itertools
import itertools as it
it.cycle([1,2,3]) -> 1,2,3,1,2,3,1....
it.product([1,2,3], repeat=2)
-> (1, 1), (1, 2), (1, 3), (2, 1),
(2, 2), (2, 3), (3, 1), (3, 2), (3, 3)
it.permutations([1,2,3], 2)
-> (1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)
it.combinations([1,2,3], 2)
-> (1, 2), (1, 3), (2, 3)
it.combinations_with_replacement([1,2,3], 2)
-> (1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)
那麼我們就來把
所有參數跑跑看吧
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2678644/_______C4____.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2678646/259545961_x.jpg)
以均線為例
2-365日線 * 超過點數(0-200) * 3000隻股票
2-365日線 * 2-365日線 * 3000隻股票
3000隻股票 * 3000隻股票 * 3000隻股票
.........
不過天無絕人之路
我們還有兩條路可走
一、加快速度
前面屁鋪陳了這麼久
總算要步入今天的主題
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2678761/fuckthat.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2678762/numpy_project_page.jpg)
Numpy
- 一個Python擴充庫
- 高速矩陣運算
- 大量數學函式
- 快!非常快!
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2678767/63980.jpg)
import numpy as np
import random, time
future1 = []
future2 = []
for i in range(10000):
future1.append(random.randint(1,10000))
future2.append(random.randint(1,10000))
np_future1 = np.array(future1, dtype=int)
np_future2 = np.array(future2, dtype=int)
s1 = time.time()
for i in range(10000):
a = future1[i] - future2[i]
e1 = time.time()
print 'Python : %.10fs' % (e1 - s1)
s2 = time.time()
b = np_future1 - np_future2
e2 = time.time()
print 'Numpy : %.10fs' % (e2 - s2)
Python : 0.0021190643s
Numpy : 0.0000231266s
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2678770/____.gif)
Numpy基礎
Numpy宣告矩陣
import numpy as np
a = np.array(list, dtype=[bool, int, float])
b = np.arange(num)
c = np.zeros(num)
d = np.ones(num)
Numpy矩陣運算
a = np.array([1,2,3,4,5], dtype=int)
a + 2 = [3,4,5,6,7]
a - 2 = [-1,0,1,2,3]
a * 2 = [2,4,6,8,10]
a / 2 = [0,1,1,2,2]
Numpy矩陣運算
a = np.array([1,2,3,4,5], dtype=int)
b = np.array([6,7,8,9,10], dtype=int)
a + b = [7,9,11,13,15]
a - b = [-5,-5,-5,-5,-5]
a * b = [6,14,24,36,50]
a / b = [0,0,0,0,0]
Numpy條件選擇
a = np.array([1,2,3,4,5], dtype=int)
a[1:3] = [2,3]
a[a>3] = [4,5]
b = np.where(a>3) = [3,4]
np.take(a, b) = [4,5]
np.piecewise(a, [a<=2, a>=3], [-1,1]) = [-1,-1,1,1,1]
np.max(a) = 5
np.min(a) = 1
Numpy均線
futures = np.array(fututres_list, dtype=int)
weight = np.ones(num) / num
MA = np.convolve(weight, futures)[num-1:-num+1]
Numpy均線收益
state = MA1 - MA2
state = np.piecewise(state, [state<0, state>0], [-1,1])
judge(ori, state)
那還有沒有可以
跑更快的辦法呢?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679218/_____.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679221/2666fab2-d3bb-4d29-8f07-0e3168832de2.jpg)
Core
用
記住千萬不要multithread
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679234/_______.jpg)
multiprocess
import multiprocess as mul
queue = mul.Queue()
pool = mul.Pool(process=cpu_num)
while not queue.empty():
args = queue.get()
results.append(pool.apply_async(testArgs, (args1, args2...)))
pool.close()
pool.join()
因為計算的每條線都可以獨立運作,非常適合平行運算,所以core越多越有利
所以如果要比core多
現在core最多的東西
應該就是....
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679249/GeForce_GTX_1080_3qtr_Front_Left.png)
近幾年非常流行GPU運算
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679253/NVIDIA-CUDA.jpg)
但是事情沒有這麼容易
因為如果你要用Cuda
你必需要寫C...
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679262/_______.jpg)
但是....
偶然間讓我發現到一個東西
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679267/_________.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679273/pycuda-logo-rs.png)
PyCuda!!
馬上讓我們來看看這怎麼用
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679281/____.gif)
PyCuda 101
import pycuda.autoinit
import pycuda.driver as drv
import numpy
from pycuda.compiler import SourceModule
mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
const int i = threadIdx.x;
dest[i] = a[i] * b[i];
}
""")
multiply_them = mod.get_function("multiply_them")
a = numpy.random.randn(400).astype(numpy.float32)
b = numpy.random.randn(400).astype(numpy.float32)
dest = numpy.zeros_like(a)
multiply_them(
drv.Out(dest), drv.In(a), drv.In(b),
block=(400,1,1), grid=(1,1))
print dest-a*b
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679289/________.gif)
二、減少數量
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679302/20141017143747595.jpg)
七非特說過:沒有量的股票就是壁紙
可以這麼分析
np.average(volume)
如果只想要分析
漲跌沒這麼大的股票?
np.diff(close) / close[:-1]
np.std(diff_close)
建構系統
其實分析技術前面講的差不多了
這邊是給我們的
分析系統一個美美的UI
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2704590/logo2.png)
但是我們不用,為什麼?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2704606/challenge.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2704595/rMO4Nt9.jpg)
Portfolio Futures
Analysis Screen System
Sqlite
Flask
Amcharts.js
jQuery
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2704755/22.gif)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2704756/33.gif)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2704760/11.gif)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2704743/ggg.gif)
其實Web我也是初心者
![](https://s3.amazonaws.com/media-p.slid.es/uploads/393734/images/2679488/________________.jpg)
沒有辦法給大家太多建議
今天的分享大概就到這
最後只有一句話給大家
投資一定有風險
基金投資有賺有賠
申購前應詳閱公開說明書
Q & A
mail:pf@hst.tw
如果有問題請洽以下mail
用Numpy做一個自己的股票分析系統
By iampf
用Numpy做一個自己的股票分析系統
- 5,075